Version 2.0.0-dev.16.0

Merge commit 'f454e8bb35a6be02c58831a6017c16deb10a929b' into dev
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4a385e7..087bbe5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -85,8 +85,6 @@
   * Added `IOOverrides` and `HttpOverrides` to aid in writing tests that wish to
     mock varios `dart:io` objects.
   * Added `Stdin.hasTerminal`, which is true if stdin is attached to a terminal.
-  * Added `waitForEventSync`, which suspends execution until an asynchronous
-    event oocurs.
 
 * `dart:isolate`
   * Rename `IMMEDIATE` and `BEFORE_NEXT_EVENT` on `Isolate` to `immediate` and
@@ -114,14 +112,24 @@
 
 * Analyzer
 
-The analyzer will no longer issue a warning when a generic type parameter is
-used as the type in an instance check. For example:
+  * The analyzer will no longer issue a warning when a generic type parameter
+    is used as the type in an instance check. For example:
+
     ```dart
     test<T>() {
       print(3 is T); // No warning
     }
     ```
 
+  * New static checking of `@visibleForTesting` elements. Accessing a method,
+    function, class, etc. annotated with `@visibleForTesting` from a file _not_
+    in a `test/` directory will result in a new hint ([issue 28273]).
+  * Static analysis now respects functions annotated with `@alwaysThrows`
+    ([issue 31384]).
+
+[issue 28273]: https://github.com/dart-lang/sdk/issues/28273
+[issue 31384]: https://github.com/dart-lang/sdk/issues/31384
+
 #### Pub
 
 ##### SDK Constraints
@@ -234,7 +242,7 @@
 
 * Fix for constructing a new SecurityContext that contains the built-in
   certificate authority roots
-    (https://github.com/dart-lang/sdk/issues/24693).
+  ([issue 24693](https://github.com/dart-lang/sdk/issues/24693)).
 
 ### Core library changes
 
@@ -248,9 +256,9 @@
 
 * Fixes for debugging in Dartium.
   * Fix DevConsole crash with JS
-      (https://github.com/dart-lang/sdk/issues/29873).
+    ([issue 29873](https://github.com/dart-lang/sdk/issues/29873)).
   * Fix debugging in WebStorm, NULL returned for JS objects
-      (https://github.com/dart-lang/sdk/issues/29854).
+    ([issue 29854](https://github.com/dart-lang/sdk/issues/29854)).
 
 ## 1.24.1 - 14-06-2017
 
@@ -264,7 +272,7 @@
   * Fixed a Safari issue during bootstrapping (note that Safari is still not
     officially supported but does work for trivial examples).
 * Fix for a Dartium issue where there was no sound in checked mode
-    (https://github.com/dart-lang/sdk/issues/29810).
+  ([issue 29810](https://github.com/dart-lang/sdk/issues/29810)).
 
 ## 1.24.0 - 12-06-2017
 
diff --git a/DEPS b/DEPS
index 6f4f5f2..28211bb 100644
--- a/DEPS
+++ b/DEPS
@@ -14,29 +14,27 @@
   # We use mirrors of all github repos to guarantee reproducibility and
   # consistency between what users see and what the bots see.
   # We need the mirrors to not have 100+ bots pulling github constantly.
-  # We mirror our github repos on chromium git servers.
+  # We mirror our github repos on Dart's git servers.
   # DO NOT use this var if you don't see a mirror here:
-  #   https://chromium.googlesource.com/
-  # named like:
-  #   external/github.com/dart-lang/NAME
-  "github_mirror":
-      "https://chromium.googlesource.com/external/github.com/dart-lang/",
+  #   https://dart.googlesource.com/
+  "dart_git":
+      "https://dart.googlesource.com/",
+  # If the repo you want to use is at github.com/dart-lang, but not at
+  # dart.googlesource.com, please file an issue
+  # on github and add the label 'area-infrastructure'.
+  # When the repo is mirrored, you can add it to this DEPS file.
 
   # Chromium git
   "chromium_git": "https://chromium.googlesource.com",
   "fuchsia_git": "https://fuchsia.googlesource.com",
 
-  # IMPORTANT:
-  # This should only be used for local testing. Before adding a new package,
-  # request a mirror of the package you need. To request a mirror, file an issue
-  # on github and add the label 'area-infrastructure'.
-  # "github_dartlang": "https://github.com/dart-lang/%s.git",
-
   "co19_rev": "@dec2b67aaab3bb7339b9764049707e71e601da3d",
 
-  # Revisions of GN related dependencies. This should match the revision
-  # pulled by Flutter.
-  "buildtools_revision": "@057ef89874e3c622248cf99259434fdc683c4e30",
+  # As Flutter does, we pull buildtools, including the clang toolchain, from
+  # Fuchsia. This revision should be kept up to date with the revision pulled
+  # by the Flutter engine. If there are problems with the toolchain, contact
+  # fuchsia-toolchain@.
+  "buildtools_revision": "@de2d6da936fa0be8bcb0bacd096fe124efff2854",
 
   # Scripts that make 'git cl format' work.
   "clang_format_scripts_rev": "@c09c8deeac31f05bd801995c475e7c8070f9ecda",
@@ -45,7 +43,7 @@
 
   # Revisions of /third_party/* dependencies.
   "args_tag": "@0.13.7",
-  "async_tag": "@2.0.0",
+  "async_tag": "@2.0.2",
   "barback-0.13.0_rev": "@34853",
   "barback-0.14.0_rev": "@36398",
   "barback-0.14.1_rev": "@38525",
@@ -57,7 +55,7 @@
   "charcode_tag": "@v1.1.1",
   "chrome_rev" : "@19997",
   "cli_util_tag" : "@0.1.2+1",
-  "collection_tag": "@1.14.3",
+  "collection_tag": "@1.14.5",
   "convert_tag": "@2.0.1",
   "crypto_tag" : "@2.0.2+1",
   "csslib_tag" : "@0.14.1",
@@ -81,7 +79,7 @@
   "fixnum_tag": "@0.10.5",
   "func_rev": "@25eec48146a58967d75330075ab376b3838b18a8",
   "glob_tag": "@1.1.5",
-  "html_tag" : "@0.13.2",
+  "html_tag" : "@0.13.2+1",
   "http_multi_server_tag" : "@2.0.4",
   "http_parser_tag" : "@3.1.1",
   "http_retry_tag": "@0.1.0",
@@ -106,11 +104,11 @@
   "path_tag": "@1.4.2",
   "plugin_tag": "@0.2.0+2",
   "ply_rev": "@604b32590ffad5cbb82e4afef1d305512d06ae93",
-  "pool_tag": "@1.3.3",
+  "pool_tag": "@1.3.4",
   "protobuf_tag": "@0.5.4",
   "pub_rev": "@667281eef93b4be648cceca400e954e000edba38",
   "pub_semver_tag": "@1.3.2",
-  "quiver_tag": "@0.25.0",
+  "quiver_tag": "@0.27.0",
   "resource_rev":"@af5a5bf65511943398146cf146e466e5f0b95cb9",
   "root_certificates_rev": "@a4c7c6f23a664a37bc1b6f15a819e3f2a292791a",
   "scheduled_test_tag": "@0.12.11+1",
@@ -149,20 +147,20 @@
     Var("clang_format_scripts_rev"),
 
   Var("dart_root") + "/tests/co19/src":
-      Var("github_mirror") + "co19.git" + Var("co19_rev"),
+      Var("dart_git") + "co19.git" + Var("co19_rev"),
 
   Var("dart_root") + "/third_party/zlib":
       Var("chromium_git") + "/chromium/src/third_party/zlib.git" +
       Var("zlib_rev"),
 
   Var("dart_root") + "/third_party/boringssl":
-      Var("github_mirror") + "boringssl_gen.git" + Var("boringssl_gen_rev"),
+      Var("dart_git") + "boringssl_gen.git" + Var("boringssl_gen_rev"),
   Var("dart_root") + "/third_party/boringssl/src":
       "https://boringssl.googlesource.com/boringssl.git" +
       Var("boringssl_rev"),
 
   Var("dart_root") + "/third_party/root_certificates":
-      Var("github_mirror") + "root_certificates.git" +
+      Var("dart_git") + "root_certificates.git" +
       Var("root_certificates_rev"),
 
   Var("dart_root") + "/third_party/jinja2":
@@ -178,165 +176,166 @@
       Var("idl_parser_rev"),
 
   Var("dart_root") + "/third_party/WebCore":
-      Var("github_mirror") + "webcore.git" + Var("WebCore_rev"),
+      Var("dart_git") + "webcore.git" + Var("WebCore_rev"),
 
   Var("dart_root") + "/third_party/tcmalloc/gperftools":
       Var('chromium_git') + '/external/github.com/gperftools/gperftools.git' +
       Var("gperftools_revision"),
 
   Var("dart_root") + "/third_party/pkg/args":
-      Var("github_mirror") + "args.git" + Var("args_tag"),
+      Var("dart_git") + "args.git" + Var("args_tag"),
   Var("dart_root") + "/third_party/pkg/async":
-      Var("github_mirror") + "async.git" + Var("async_tag"),
+      Var("dart_git") + "async.git" + Var("async_tag"),
   Var("dart_root") + "/third_party/pkg/barback":
-      Var("github_mirror") + "barback.git" + Var("barback_tag"),
+      Var("dart_git") + "barback.git" + Var("barback_tag"),
   Var("dart_root") + "/third_party/pkg/bazel_worker":
-      Var("github_mirror") + "bazel_worker.git" + Var("bazel_worker_tag"),
+      Var("dart_git") + "bazel_worker.git" + Var("bazel_worker_tag"),
   Var("dart_root") + "/third_party/pkg/boolean_selector":
-      Var("github_mirror") + "boolean_selector.git" +
+      Var("dart_git") + "boolean_selector.git" +
       Var("boolean_selector_tag"),
   Var("dart_root") + "/third_party/pkg/charcode":
-      Var("github_mirror") + "charcode.git" + Var("charcode_tag"),
+      Var("dart_git") + "charcode.git" + Var("charcode_tag"),
   Var("dart_root") + "/third_party/pkg/cli_util":
-      Var("github_mirror") + "cli_util.git" + Var("cli_util_tag"),
+      Var("dart_git") + "cli_util.git" + Var("cli_util_tag"),
   Var("dart_root") + "/third_party/pkg/collection":
-      Var("github_mirror") + "collection.git" + Var("collection_tag"),
+      Var("dart_git") + "collection.git" + Var("collection_tag"),
   Var("dart_root") + "/third_party/pkg/convert":
-      Var("github_mirror") + "convert.git" + Var("convert_tag"),
+      Var("dart_git") + "convert.git" + Var("convert_tag"),
   Var("dart_root") + "/third_party/pkg/crypto":
-      Var("github_mirror") + "crypto.git" + Var("crypto_tag"),
+      Var("dart_git") + "crypto.git" + Var("crypto_tag"),
   Var("dart_root") + "/third_party/pkg/csslib":
-      Var("github_mirror") + "csslib.git" + Var("csslib_tag"),
+      Var("dart_git") + "csslib.git" + Var("csslib_tag"),
   Var("dart_root") + "/third_party/pkg_tested/dart_style":
-      Var("github_mirror") + "dart_style.git" + Var("dart_style_tag"),
+      Var("dart_git") + "dart_style.git" + Var("dart_style_tag"),
   Var("dart_root") + "/third_party/pkg/dart2js_info":
-      Var("github_mirror") + "dart2js_info.git" + Var("dart2js_info_tag"),
+      Var("dart_git") + "dart2js_info.git" + Var("dart2js_info_tag"),
   Var("dart_root") + "/third_party/pkg/dartdoc":
-      Var("github_mirror") + "dartdoc.git" + Var("dartdoc_tag"),
+      Var("dart_git") + "dartdoc.git" + Var("dartdoc_tag"),
   Var("dart_root") + "/third_party/pkg/fixnum":
-      Var("github_mirror") + "fixnum.git" + Var("fixnum_tag"),
+      Var("dart_git") + "fixnum.git" + Var("fixnum_tag"),
   Var("dart_root") + "/third_party/pkg/func":
-      Var("github_mirror") + "func.git" + Var("func_rev"),
+      Var("dart_git") + "func.git" + Var("func_rev"),
   Var("dart_root") + "/third_party/pkg/glob":
-      Var("github_mirror") + "glob.git" + Var("glob_tag"),
+      Var("dart_git") + "glob.git" + Var("glob_tag"),
   Var("dart_root") + "/third_party/pkg/html":
-      Var("github_mirror") + "html.git" + Var("html_tag"),
+      Var("dart_git") + "html.git" + Var("html_tag"),
   Var("dart_root") + "/third_party/pkg/http":
-      Var("github_mirror") + "http.git" + Var("http_tag"),
+      Var("dart_git") + "http.git" + Var("http_tag"),
   Var("dart_root") + "/third_party/pkg/http_multi_server":
-      Var("github_mirror") + "http_multi_server.git" +
+      Var("dart_git") + "http_multi_server.git" +
       Var("http_multi_server_tag"),
   Var("dart_root") + "/third_party/pkg/http_parser":
-      Var("github_mirror") + "http_parser.git" + Var("http_parser_tag"),
+      Var("dart_git") + "http_parser.git" + Var("http_parser_tag"),
   Var("dart_root") + "/third_party/pkg/http_retry":
-      Var("github_mirror") + "http_retry.git" +
+      Var("dart_git") + "http_retry.git" +
       Var("http_retry_tag"),
   Var("dart_root") + "/third_party/pkg/http_throttle":
-      Var("github_mirror") + "http_throttle.git" +
+      Var("dart_git") + "http_throttle.git" +
       Var("http_throttle_tag"),
   Var("dart_root") + "/third_party/pkg/intl":
-      Var("github_mirror") + "intl.git" + Var("intl_tag"),
+      Var("dart_git") + "intl.git" + Var("intl_tag"),
   Var("dart_root") + "/third_party/pkg/isolate":
-      Var("github_mirror") + "isolate.git" + Var("isolate_tag"),
+      Var("dart_git") + "isolate.git" + Var("isolate_tag"),
   Var("dart_root") + "/third_party/pkg/json_rpc_2":
-      Var("github_mirror") + "json_rpc_2.git" + Var("json_rpc_2_tag"),
+      Var("dart_git") + "json_rpc_2.git" + Var("json_rpc_2_tag"),
   Var("dart_root") + "/third_party/pkg/linter":
-      Var("github_mirror") + "linter.git" + Var("linter_tag"),
+      Var("dart_git") + "linter.git" + Var("linter_tag"),
   Var("dart_root") + "/third_party/pkg/logging":
-      Var("github_mirror") + "logging.git" + Var("logging_tag"),
+      Var("dart_git") + "logging.git" + Var("logging_tag"),
   Var("dart_root") + "/third_party/pkg/markdown":
-      Var("github_mirror") + "markdown.git" + Var("markdown_tag"),
+      Var("dart_git") + "markdown.git" + Var("markdown_tag"),
   Var("dart_root") + "/third_party/pkg/matcher":
-      Var("github_mirror") + "matcher.git" + Var("matcher_tag"),
+      Var("dart_git") + "matcher.git" + Var("matcher_tag"),
   Var("dart_root") + "/third_party/pkg/mime":
-      Var("github_mirror") + "mime.git" + Var("mime_tag"),
+      Var("dart_git") + "mime.git" + Var("mime_tag"),
   Var("dart_root") + "/third_party/pkg/mockito":
-      Var("github_mirror") + "mockito.git" + Var("mockito_tag"),
+      Var("dart_git") + "mockito.git" + Var("mockito_tag"),
   Var("dart_root") + "/third_party/pkg/mustache4dart":
       Var("chromium_git")
       + "/external/github.com/valotas/mustache4dart.git"
       + Var("mustache4dart_tag"),
   Var("dart_root") + "/third_party/pkg/oauth2":
-      Var("github_mirror") + "oauth2.git" + Var("oauth2_tag"),
+      Var("dart_git") + "oauth2.git" + Var("oauth2_tag"),
   Var("dart_root") + "/third_party/observatory_pub_packages":
-      Var("github_mirror") + "observatory_pub_packages.git"
+      Var("dart_git") + "observatory_pub_packages.git"
       + Var("observatory_pub_packages_rev"),
   Var("dart_root") + "/third_party/pkg_tested/package_config":
-      Var("github_mirror") + "package_config.git" +
+      Var("dart_git") + "package_config.git" +
       Var("package_config_tag"),
   Var("dart_root") + "/third_party/pkg_tested/package_resolver":
-      Var("github_mirror") + "package_resolver.git"
+      Var("dart_git") + "package_resolver.git"
       + Var("package_resolver_tag"),
   Var("dart_root") + "/third_party/pkg/path":
-      Var("github_mirror") + "path.git" + Var("path_tag"),
+      Var("dart_git") + "path.git" + Var("path_tag"),
   Var("dart_root") + "/third_party/pkg/plugin":
-      Var("github_mirror") + "plugin.git" + Var("plugin_tag"),
+      Var("dart_git") + "plugin.git" + Var("plugin_tag"),
   Var("dart_root") + "/third_party/pkg/pool":
-      Var("github_mirror") + "pool.git" + Var("pool_tag"),
+      Var("dart_git") + "pool.git" + Var("pool_tag"),
   Var("dart_root") + "/third_party/pkg/protobuf":
-      Var("github_mirror") + "protobuf.git" + Var("protobuf_tag"),
+      Var("dart_git") + "protobuf.git" + Var("protobuf_tag"),
   Var("dart_root") + "/third_party/pkg/pub_semver":
-      Var("github_mirror") + "pub_semver.git" + Var("pub_semver_tag"),
+      Var("dart_git") + "pub_semver.git" + Var("pub_semver_tag"),
   Var("dart_root") + "/third_party/pkg/pub":
-      Var("github_mirror") + "pub.git" + Var("pub_rev"),
+      Var("dart_git") + "pub.git" + Var("pub_rev"),
   Var("dart_root") + "/third_party/pkg/quiver":
       Var("chromium_git")
       + "/external/github.com/google/quiver-dart.git"
       + Var("quiver_tag"),
   Var("dart_root") + "/third_party/pkg/resource":
-      Var("github_mirror") + "resource.git" + Var("resource_rev"),
+      Var("dart_git") + "resource.git" + Var("resource_rev"),
   Var("dart_root") + "/third_party/pkg/scheduled_test":
-      Var("github_mirror") + "scheduled_test.git" + Var("scheduled_test_tag"),
+      Var("dart_git") + "scheduled_test.git" + Var("scheduled_test_tag"),
   Var("dart_root") + "/third_party/pkg/shelf":
-      Var("github_mirror") + "shelf.git" + Var("shelf_tag"),
+      Var("dart_git") + "shelf.git" + Var("shelf_tag"),
   Var("dart_root") + "/third_party/pkg/shelf_packages_handler":
-      Var("github_mirror") + "shelf_packages_handler.git"
+      Var("dart_git") + "shelf_packages_handler.git"
       + Var("shelf_packages_handler_tag"),
   Var("dart_root") + "/third_party/pkg/shelf_static":
-      Var("github_mirror") + "shelf_static.git" + Var("shelf_static_rev"),
+      Var("dart_git") + "shelf_static.git" + Var("shelf_static_rev"),
   Var("dart_root") + "/third_party/pkg/shelf_web_socket":
-      Var("github_mirror") + "shelf_web_socket.git" +
+      Var("dart_git") + "shelf_web_socket.git" +
       Var("shelf_web_socket_tag"),
   Var("dart_root") + "/third_party/pkg/source_maps":
-      Var("github_mirror") + "source_maps.git" + Var("source_maps_tag"),
+      Var("dart_git") + "source_maps.git" + Var("source_maps_tag"),
   Var("dart_root") + "/third_party/pkg/source_span":
-      Var("github_mirror") + "source_span.git" + Var("source_span_tag"),
+      Var("dart_git") + "source_span.git" + Var("source_span_tag"),
   Var("dart_root") + "/third_party/pkg/source_map_stack_trace":
-      Var("github_mirror") + "source_map_stack_trace.git" +
+      Var("dart_git") + "source_map_stack_trace.git" +
       Var("source_map_stack_trace_tag"),
   Var("dart_root") + "/third_party/pkg/stack_trace":
-      Var("github_mirror") + "stack_trace.git" + Var("stack_trace_tag"),
+      Var("dart_git") + "stack_trace.git" + Var("stack_trace_tag"),
   Var("dart_root") + "/third_party/pkg/stream_channel":
-      Var("github_mirror") + "stream_channel.git" +
+      Var("dart_git") + "stream_channel.git" +
       Var("stream_channel_tag"),
   Var("dart_root") + "/third_party/pkg/string_scanner":
-      Var("github_mirror") + "string_scanner.git" +
+      Var("dart_git") + "string_scanner.git" +
       Var("string_scanner_tag"),
   Var("dart_root") + "/third_party/sunflower":
-      Var("github_mirror") + "sample-sunflower.git" +
+      Var("chromium_git") +
+      "/external/github.com/dart-lang/sample-sunflower.git" +
       Var("sunflower_rev"),
   Var("dart_root") + "/third_party/pkg/term_glyph":
-      Var("github_mirror") + "term_glyph.git" + Var("term_glyph_tag"),
+      Var("dart_git") + "term_glyph.git" + Var("term_glyph_tag"),
   Var("dart_root") + "/third_party/pkg/test":
-      Var("github_mirror") + "test.git" + Var("test_tag"),
+      Var("dart_git") + "test.git" + Var("test_tag"),
   Var("dart_root") + "/third_party/pkg/test_reflective_loader":
-      Var("github_mirror") + "test_reflective_loader.git" +
+      Var("dart_git") + "test_reflective_loader.git" +
       Var("test_reflective_loader_tag"),
   Var("dart_root") + "/third_party/pkg/tuple":
-      Var("github_mirror") + "tuple.git" + Var("tuple_tag"),
+      Var("dart_git") + "tuple.git" + Var("tuple_tag"),
   Var("dart_root") + "/third_party/pkg/typed_data":
-      Var("github_mirror") + "typed_data.git" + Var("typed_data_tag"),
+      Var("dart_git") + "typed_data.git" + Var("typed_data_tag"),
   Var("dart_root") + "/third_party/pkg/usage":
-      Var("github_mirror") + "usage.git" + Var("usage_tag"),
+      Var("dart_git") + "usage.git" + Var("usage_tag"),
   Var("dart_root") + "/third_party/pkg/utf":
-      Var("github_mirror") + "utf.git" + Var("utf_tag"),
+      Var("dart_git") + "utf.git" + Var("utf_tag"),
   Var("dart_root") + "/third_party/pkg/watcher":
-      Var("github_mirror") + "watcher.git" + Var("watcher_tag"),
+      Var("dart_git") + "watcher.git" + Var("watcher_tag"),
   Var("dart_root") + "/third_party/pkg/web_socket_channel":
-      Var("github_mirror") + "web_socket_channel.git" +
+      Var("dart_git") + "web_socket_channel.git" +
       Var("web_socket_channel_tag"),
   Var("dart_root") + "/third_party/pkg/yaml":
-      Var("github_mirror") + "yaml.git" + Var("yaml_tag"),
+      Var("dart_git") + "yaml.git" + Var("yaml_tag"),
 }
 
 deps_os = {
diff --git a/WATCHLISTS b/WATCHLISTS
index b1cc720..fb38b83 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -21,8 +21,11 @@
     'front_end': {
       'filepath': '^pkg/front_end',
     },
+    'http': {
+      'filepath': '^sdk/lib/_http',
+    },
     'kernel': {
-      'filepath': '^pkg/kernel'
+      'filepath': '^pkg/kernel',
     },
     'messages_review': {
       'filepath': (
@@ -58,6 +61,7 @@
   'WATCHLISTS': {
     'build': [ 'zra@google.com', 'keertip@google.com' ],
     'front_end': [ 'dart-fe-team+reviews@google.com' ],
+    'http': [ 'zra@google.com' ],
     'kernel': [ 'karlklose@google.com', 'jensj@google.com', 'kmillikin@google.com' ],
     'messages_review': [ 'dart-uxr+reviews@google.com' ],
     'mirrors' : [ 'rmacnak@google.com' ],
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 12dca5d..0c8bbea 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -341,9 +341,9 @@
   # define into the compile line.
   if (is_clang && (is_linux || is_mac)) {
     if (is_linux) {
-      toolchain_stamp_file = "//buildtools/linux64/toolchain.stamp"
+      toolchain_stamp_file = "//buildtools/linux64/clang.stamp"
     } else {
-      toolchain_stamp_file = "//buildtools/mac/toolchain.stamp"
+      toolchain_stamp_file = "//buildtools/mac/clang.stamp"
     }
     toolchain_version = read_file(toolchain_stamp_file, "trim string")
     defines = [ "TOOLCHAIN_VERSION=$toolchain_version" ]
@@ -503,6 +503,10 @@
     "-Wno-unused-parameter",  # Unused function parameters.
   ]
 
+  if (is_clang) {
+    default_warning_flags += [ "-Wno-tautological-constant-compare" ]
+  }
+
   if (is_mac) {
     # TODO(abarth): Re-enable once https://github.com/domokit/mojo/issues/728
     #               is fixed.
diff --git a/build/toolchain/android/BUILD.gn b/build/toolchain/android/BUILD.gn
index 38f95b9..8568ef7 100644
--- a/build/toolchain/android/BUILD.gn
+++ b/build/toolchain/android/BUILD.gn
@@ -46,17 +46,8 @@
 
     is_clang = invoker.is_clang
     if (is_clang) {
-      host_suffix = ""
-      if (host_os == "linux") {
-        host_suffix = "x86_64-linux"
-      } else if (host_os == "mac") {
-        host_suffix = "x86_64-darwin"
-      } else {
-        assert(false, "Unknown host")
-      }
-
-      prefix = rebase_path("//buildtools/toolchain/clang+llvm-$host_suffix/bin",
-                           root_build_dir)
+      prefix =
+          rebase_path("//buildtools/${host_os}-x64/clang/bin", root_build_dir)
 
       cc = compiler_prefix + prefix + "/clang"
       cxx = compiler_prefix + prefix + "/clang++"
diff --git a/build/toolchain/gcc_toolchain.gni b/build/toolchain/gcc_toolchain.gni
index 08dd417..b21a7d1 100644
--- a/build/toolchain/gcc_toolchain.gni
+++ b/build/toolchain/gcc_toolchain.gni
@@ -40,6 +40,9 @@
 #      Location of the strip executable. When specified, strip will be run on
 #      all executables as they are built. The stripped artifacts will be put in
 #      exe.stripped/.
+#  - llvm_objcopy
+#      Location of the llvm-objcopy executable. Used as strip instead of strip
+#      when specified.
 template("gcc_toolchain") {
   toolchain(target_name) {
     assert(defined(invoker.cc), "gcc_toolchain() must specify a \"cc\" value")
@@ -193,7 +196,7 @@
       outfile = "{{root_out_dir}}/$exename"
       rspfile = "$outfile.rsp"
 
-      if (defined(invoker.strip)) {
+      if (defined(invoker.strip) || defined(invoker.llvm_objcopy)) {
         stripped_outfile = "{{root_out_dir}}/exe.stripped/$exename"
       }
 
@@ -203,6 +206,11 @@
         strip_command =
             "${strip} --strip-unneeded -o $stripped_outfile $outfile"
         command += " && " + strip_command
+      } else if (defined(invoker.llvm_objcopy)) {
+        strip = invoker.llvm_objcopy
+        strip_command =
+            "${strip} --strip-all $outfile $stripped_outfile"
+        command += " && " + strip_command
       }
       if (defined(invoker.postlink)) {
         command += " && " + invoker.postlink
@@ -212,7 +220,7 @@
       outputs = [
         outfile,
       ]
-      if (defined(invoker.strip)) {
+      if (defined(invoker.strip) || defined(invoker.llvm_objcopy)) {
         outputs += [ stripped_outfile ]
       }
       if (defined(invoker.link_outputs)) {
diff --git a/build/toolchain/linux/BUILD.gn b/build/toolchain/linux/BUILD.gn
index 7a3d2df..313deba 100644
--- a/build/toolchain/linux/BUILD.gn
+++ b/build/toolchain/linux/BUILD.gn
@@ -46,11 +46,12 @@
                        root_build_dir)
   cc = "${compiler_prefix}${prefix}/clang"
   cxx = "${compiler_prefix}${prefix}/clang++"
-  readelf = "readelf"
+
+  readelf = "${prefix}/llvm-readelf"
   nm = "${prefix}/llvm-nm"
   ar = "${prefix}/llvm-ar"
   ld = cxx
-  strip = "${prefix}/strip"
+  llvm_objcopy = "${prefix}/llvm-objcopy"
 
   toolchain_cpu = "arm"
   toolchain_os = "linux"
@@ -78,8 +79,7 @@
 }
 
 gcc_toolchain("clang_arm64") {
-  prefix = rebase_path("//buildtools/toolchain/clang+llvm-x86_64-linux/bin",
-                       root_build_dir)
+  prefix = rebase_path("//buildtools/linux-x64/clang/bin", root_build_dir)
   cc = "${compiler_prefix}${prefix}/clang"
   cxx = "${compiler_prefix}${prefix}/clang++"
 
@@ -87,7 +87,7 @@
   nm = "${prefix}/llvm-nm"
   ar = "${prefix}/llvm-ar"
   ld = cxx
-  strip = "${prefix}/strip"
+  llvm_objcopy = "${prefix}/llvm-objcopy"
 
   toolchain_cpu = "arm64"
   toolchain_os = "linux"
@@ -95,15 +95,15 @@
 }
 
 gcc_toolchain("clang_x86") {
-  prefix = rebase_path("//buildtools/toolchain/clang+llvm-x86_64-linux/bin",
-                       root_build_dir)
+  prefix = rebase_path("//buildtools/linux-x64/clang/bin", root_build_dir)
   cc = "${compiler_prefix}${prefix}/clang"
   cxx = "${compiler_prefix}${prefix}/clang++"
-  readelf = "readelf"
+
+  readelf = "${prefix}/llvm-readelf"
   nm = "${prefix}/llvm-nm"
   ar = "${prefix}/llvm-ar"
   ld = cxx
-  strip = "${prefix}/strip"
+  llvm_objcopy = "${prefix}/llvm-objcopy"
 
   toolchain_cpu = "x86"
   toolchain_os = "linux"
@@ -127,16 +127,15 @@
 }
 
 gcc_toolchain("clang_x64") {
-  prefix = rebase_path("//buildtools/toolchain/clang+llvm-x86_64-linux/bin",
-                       root_build_dir)
+  prefix = rebase_path("//buildtools/linux-x64/clang/bin", root_build_dir)
   cc = "${compiler_prefix}${prefix}/clang"
   cxx = "${compiler_prefix}${prefix}/clang++"
 
-  readelf = "readelf"
+  readelf = "${prefix}/llvm-readelf"
   nm = "${prefix}/llvm-nm"
   ar = "${prefix}/llvm-ar"
   ld = cxx
-  strip = "${prefix}/strip"
+  llvm_objcopy = "${prefix}/llvm-objcopy"
 
   toolchain_cpu = "x64"
   toolchain_os = "linux"
diff --git a/build/toolchain/mac/BUILD.gn b/build/toolchain/mac/BUILD.gn
index 4ccc69b..4ed409a 100644
--- a/build/toolchain/mac/BUILD.gn
+++ b/build/toolchain/mac/BUILD.gn
@@ -222,8 +222,7 @@
 mac_toolchain("clang_x64") {
   toolchain_cpu = "x64"
   toolchain_os = "mac"
-  prefix = rebase_path("//buildtools/toolchain/clang+llvm-x86_64-darwin/bin",
-                       root_build_dir)
+  prefix = rebase_path("//buildtools/mac-x64/clang/bin", root_build_dir)
   cc = "${goma_prefix}$prefix/clang"
   cxx = "${goma_prefix}$prefix/clang++"
   ar = "${prefix}/llvm-ar"
@@ -237,8 +236,7 @@
 mac_toolchain("clang_x86") {
   toolchain_cpu = "i386"
   toolchain_os = "mac"
-  prefix = rebase_path("//buildtools/toolchain/clang+llvm-x86_64-darwin/bin",
-                       root_build_dir)
+  prefix = rebase_path("//buildtools/mac-x64/clang/bin", root_build_dir)
   cc = "${goma_prefix}$prefix/clang"
   cxx = "${goma_prefix}$prefix/clang++"
   ar = "${prefix}/llvm-ar"
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index c49b17a4..9b18275 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -541,7 +541,9 @@
 
   @override
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
+    if (node.keyword != null) {
+      computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
+    }
     return super.visitInstanceCreationExpression(node);
   }
 
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
index 103d641..90cc3ba 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
@@ -632,7 +632,9 @@
 
   @override
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
+    if (node.keyword != null) {
+      computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
+    }
     return super.visitInstanceCreationExpression(node);
   }
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index 2e80f58..d29210f 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -15,6 +15,7 @@
 
 const ASYNC_STAR = 'async*';
 const DEFERRED_AS = 'deferred as';
+const DEFAULT_COLON = 'default:';
 const EXPORT_STATEMENT = "export '';";
 const IMPORT_STATEMENT = "import '';";
 const PART_STATEMENT = "part '';";
@@ -482,17 +483,21 @@
       _addExpressionKeywords(node);
     } else if (entity == node.rightBracket) {
       if (node.members.isEmpty) {
-        _addSuggestions([Keyword.CASE, Keyword.DEFAULT], DART_RELEVANCE_HIGH);
+        _addSuggestion(Keyword.CASE, DART_RELEVANCE_HIGH);
+        _addSuggestion2(DEFAULT_COLON, relevance: DART_RELEVANCE_HIGH);
       } else {
-        _addSuggestions([Keyword.CASE, Keyword.DEFAULT]);
+        _addSuggestion(Keyword.CASE);
+        _addSuggestion2(DEFAULT_COLON);
         _addStatementKeywords(node);
       }
     }
     if (node.members.contains(entity)) {
       if (entity == node.members.first) {
-        _addSuggestions([Keyword.CASE, Keyword.DEFAULT], DART_RELEVANCE_HIGH);
+        _addSuggestion(Keyword.CASE, DART_RELEVANCE_HIGH);
+        _addSuggestion2(DEFAULT_COLON, relevance: DART_RELEVANCE_HIGH);
       } else {
-        _addSuggestions([Keyword.CASE, Keyword.DEFAULT]);
+        _addSuggestion(Keyword.CASE);
+        _addSuggestion2(DEFAULT_COLON);
         _addStatementKeywords(node);
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 4ca94bf..16e29bf 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -704,7 +704,7 @@
           builder.write('async ');
         }
         builder.write('{$eol$prefix$indent');
-        if (!returnValueType.isVoid) {
+        if (!returnValueType.isVoid && !returnValueType.isBottom) {
           builder.write('return ');
         }
         builder.write(returnValueCode);
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 4877120..853962e 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -2244,8 +2244,13 @@
       var instanceCreation = coveredNode as InstanceCreationExpression;
       DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addSimpleReplacement(
-            range.token(instanceCreation.keyword), 'const');
+        if (instanceCreation.keyword == null) {
+          builder.addSimpleInsertion(
+              instanceCreation.constructorName.offset, 'const');
+        } else {
+          builder.addSimpleReplacement(
+              range.token(instanceCreation.keyword), 'const');
+        }
       });
       _addFixFromBuilder(changeBuilder, DartFixKind.USE_CONST);
     }
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 18b897d..934dc07 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
@@ -17,6 +16,7 @@
 import 'package:analyzer/src/generated/engine.dart' as engine;
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:front_end/src/api_prototype/byte_store.dart';
 import 'package:front_end/src/base/performance_logger.dart';
 
@@ -44,8 +44,7 @@
  */
 typedef void _ElementVisitorFunction(Element element);
 
-class AbstractContextTest {
-  MemoryResourceProvider provider;
+class AbstractContextTest extends Object with ResourceProviderMixin {
   DartSdk sdk;
   Map<String, List<Folder>> packageMap;
   UriResolver resourceResolver;
@@ -68,16 +67,14 @@
 ''');
 
   Source addPackageSource(String packageName, String filePath, String content) {
-    packageMap[packageName] = [(newFolder('/pubcache/$packageName/lib'))];
-    File file = newFile('/pubcache/$packageName/lib/$filePath', content);
+    packageMap[packageName] = [newFolder('/pubcache/$packageName/lib')];
+    File file =
+        newFile('/pubcache/$packageName/lib/$filePath', content: content);
     return file.createSource();
   }
 
   Source addSource(String path, String content, [Uri uri]) {
-    if (path.startsWith('/')) {
-      path = provider.convertPath(path);
-    }
-    File file = newFile(path, content);
+    File file = newFile(path, content: content);
     Source source = file.createSource(uri);
     driver.addFile(path);
     driver.changeFile(path);
@@ -85,12 +82,6 @@
     return source;
   }
 
-  File newFile(String path, [String content]) =>
-      provider.newFile(provider.convertPath(path), content ?? '');
-
-  Folder newFolder(String path) =>
-      provider.newFolder(provider.convertPath(path));
-
   void processRequiredPlugins() {
     AnalysisEngine.instance.processRequiredPlugins();
   }
@@ -102,11 +93,11 @@
   void setUp() {
     processRequiredPlugins();
     setupResourceProvider();
-    sdk = new MockSdk(resourceProvider: provider);
-    resourceResolver = new ResourceUriResolver(provider);
+    sdk = new MockSdk(resourceProvider: resourceProvider);
+    resourceResolver = new ResourceUriResolver(resourceProvider);
     packageMap = new Map<String, List<Folder>>();
     PackageMapUriResolver packageResolver =
-        new PackageMapUriResolver(provider, packageMap);
+        new PackageMapUriResolver(resourceProvider, packageMap);
     SourceFactory sourceFactory = new SourceFactory(
         [new DartUriResolver(sdk), packageResolver, resourceResolver]);
     PerformanceLog log = new PerformanceLog(_logBuffer);
@@ -114,7 +105,7 @@
     _driver = new AnalysisDriver(
         scheduler,
         log,
-        provider,
+        resourceProvider,
         new MemoryByteStore(),
         _fileContentOverlay,
         null,
@@ -124,12 +115,9 @@
     AnalysisEngine.instance.logger = PrintLogger.instance;
   }
 
-  void setupResourceProvider() {
-    provider = new MemoryResourceProvider();
-  }
+  void setupResourceProvider() {}
 
   void tearDown() {
-    provider = null;
     AnalysisEngine.instance.clearCaches();
     AnalysisEngine.instance.logger = null;
   }
diff --git a/pkg/analysis_server/test/completion_test.dart b/pkg/analysis_server/test/completion_test.dart
index e6201b5..af77043 100644
--- a/pkg/analysis_server/test/completion_test.dart
+++ b/pkg/analysis_server/test/completion_test.dart
@@ -2153,7 +2153,7 @@
           "6+for",
           "7+switch",
           "8+case",
-          "9+default",
+          "9+default:",
           "A+try",
           "B+on",
           "C+catch",
diff --git a/pkg/analysis_server/test/integration/edit/get_statement_completion_test.dart b/pkg/analysis_server/test/integration/edit/get_statement_completion_test.dart
index 3019f6e..345c5cf 100644
--- a/pkg/analysis_server/test/integration/edit/get_statement_completion_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_statement_completion_test.dart
@@ -42,6 +42,11 @@
     for (SourceEdit edit in change.edits.first.edits) {
       text = text.replaceRange(edit.offset, edit.end, edit.replacement);
     }
+    expect(text, r'''
+void bar() { foo(); } // missing semi-colon
+
+void foo() { }''');
+
     await sendAnalysisUpdateContent({pathname: new AddContentOverlay(text)});
 
     await analysisFinished;
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index 2e3f899..f368461 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -463,7 +463,7 @@
     testSource = analysisResult.unit.element.source;
     CompletionRequestImpl baseRequest = new CompletionRequestImpl(
         analysisResult,
-        provider,
+        resourceProvider,
         testSource,
         completionOffset,
         new CompletionPerformance());
@@ -503,11 +503,11 @@
    */
   void configureFlutterPkg(Map<String, String> pathToCode) {
     pathToCode.forEach((path, code) {
-      provider.newFile('$flutterPkgLibPath/$path', code);
+      newFile('$flutterPkgLibPath/$path', content: code);
     });
     // configure SourceFactory
-    Folder myPkgFolder = provider.getResource(flutterPkgLibPath);
-    UriResolver pkgResolver = new PackageMapUriResolver(provider, {
+    Folder myPkgFolder = getFolder(flutterPkgLibPath);
+    UriResolver pkgResolver = new PackageMapUriResolver(resourceProvider, {
       'flutter': [myPkgFolder]
     });
     SourceFactory sourceFactory = new SourceFactory(
@@ -586,7 +586,7 @@
   @override
   void setUp() {
     super.setUp();
-    testFile = provider.convertPath('/completionTest.dart');
+    testFile = resourceProvider.convertPath('/completionTest.dart');
     contributor = createContributor();
   }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
index 462d787..17b1d2f 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
@@ -48,7 +48,7 @@
     // Build the request
     CompletionRequestImpl baseRequest = new CompletionRequestImpl(
         await driver.getResult(testFile),
-        provider,
+        resourceProvider,
         testSource,
         completionOffset,
         new CompletionPerformance());
diff --git a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
index 11847a6..7678669 100644
--- a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
@@ -3310,7 +3310,7 @@
         new SourceFactory([new DartUriResolver(sdk), resourceResolver]);
     String content2 = 'class ClassFromAnotherContext { }';
     Source source2 =
-        provider.newFile('/context2/foo.dart', content2).createSource();
+        newFile('/context2/foo.dart', content: content2).createSource();
     ChangeSet changeSet = new ChangeSet();
     changeSet.addedSource(source2);
     context2.applyChanges(changeSet);
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index da2dc8a..f4265da 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -217,13 +217,15 @@
     Set<String> expectedCompletions = new Set<String>();
     Map<String, int> expectedOffsets = <String, int>{};
     Set<String> actualCompletions = new Set<String>();
-    expectedCompletions.addAll(expectedKeywords.map((k) => k.lexeme));
-    ['import', 'export', 'part'].forEach((s) {
-      if (expectedCompletions.contains(s)) {
-        expectedCompletions.remove(s);
-        expectedCompletions.add('$s \'\';');
+    expectedCompletions.addAll(expectedKeywords.map((keyword) {
+      String text = keyword.lexeme;
+      if (['import', 'export', 'part'].contains(text)) {
+        return '$text \'\';';
+      } else if (text == 'default') {
+        return '$text:';
       }
-    });
+      return text;
+    }));
 
     expectedCompletions.addAll(pseudoKeywords);
     for (CompletionSuggestion s in suggestions) {
diff --git a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
index a47714c..4204f28 100644
--- a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
@@ -1088,7 +1088,7 @@
     addPackageSource('myBar', 'bar.dart', 'class Foo2 { Foo2() { } }');
     addSource(
         '/proj/testAB.dart', 'import "package:myBar/bar.dart"; class Foo { }');
-    testFile = provider.convertPath('/proj/completionTest.dart');
+    testFile = resourceProvider.convertPath('/proj/completionTest.dart');
     addTestSource('class C {foo(){F^}}');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
diff --git a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
index df1164a..7d66b12 100644
--- a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
@@ -272,15 +272,6 @@
     assertSuggest('../blat.dart', csKind: CompletionSuggestionKind.IMPORT);
   }
 
-  test_import_only_dart_files() async {
-    testFile = '/proj/completion.dart';
-    addSource('/proj/other.dart', 'library other;');
-    newFile('/proj/analysis_options.yaml', '# analysis options');
-    addTestSource('import "package:^";');
-    await computeSuggestions();
-    assertNotSuggested('analysis_options.yaml');
-  }
-
   test_import_no_dot_folders() async {
     testFile = '/proj/completion.dart';
     addSource('/proj/other.dart', 'library other;');
@@ -290,6 +281,15 @@
     assertNotSuggested('.fooFolder/');
   }
 
+  test_import_only_dart_files() async {
+    testFile = '/proj/completion.dart';
+    addSource('/proj/other.dart', 'library other;');
+    newFile('/proj/analysis_options.yaml', content: '# analysis options');
+    addTestSource('import "package:^";');
+    await computeSuggestions();
+    assertNotSuggested('analysis_options.yaml');
+  }
+
   test_import_package() async {
     addPackageSource('foo', 'foo.dart', 'library foo;');
     addPackageSource('foo', 'baz/too.dart', 'library too;');
@@ -357,7 +357,7 @@
 
   test_import_package_missing_lib() async {
     var pkgSrc = addPackageSource('bar', 'bar.dart', 'library bar;');
-    provider.deleteFolder(dirname(pkgSrc.fullName));
+    deleteFolder(dirname(pkgSrc.fullName));
     addTestSource('import "p^" class');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
@@ -537,7 +537,7 @@
 
   @override
   void setupResourceProvider() {
-    provider = new _TestWinResourceProvider();
+    resourceProvider = new MemoryResourceProvider(context: windows);
   }
 
   test_import_file() async {
@@ -693,8 +693,3 @@
     assertSuggest('../blat.dart', csKind: CompletionSuggestionKind.IMPORT);
   }
 }
-
-class _TestWinResourceProvider extends MemoryResourceProvider {
-  @override
-  Context get pathContext => windows;
-}
diff --git a/pkg/analysis_server/test/services/correction/assist_test.dart b/pkg/analysis_server/test/services/correction/assist_test.dart
index 350a11d..a307b98 100644
--- a/pkg/analysis_server/test/services/correction/assist_test.dart
+++ b/pkg/analysis_server/test/services/correction/assist_test.dart
@@ -1038,7 +1038,7 @@
 library foo;
 part 'src/bar.dart';
 ''');
-    testFile = provider.convertPath('/pkg/lib/src/bar.dart');
+    testFile = resourceProvider.convertPath('/pkg/lib/src/bar.dart');
     await resolveTestUnit('''
 part of foo;
 ''');
@@ -1052,7 +1052,7 @@
 library foo;
 part 'bar.dart';
 ''');
-    testFile = provider.convertPath('/pkg/bar.dart');
+    testFile = resourceProvider.convertPath('/pkg/bar.dart');
     await resolveTestUnit('''
 part of foo;
 ''');
@@ -1199,6 +1199,21 @@
 ''');
   }
 
+  test_convertToBlockBody_OK_throw() async {
+    await resolveTestUnit('''
+class A {
+  mmm() => throw 'error';
+}
+''');
+    await assertHasAssistAt('mmm()', DartAssistKind.CONVERT_INTO_BLOCK_BODY, '''
+class A {
+  mmm() {
+    throw 'error';
+  }
+}
+''');
+  }
+
   test_convertToExpressionBody_BAD_already() async {
     await resolveTestUnit('''
 fff() => 42;
@@ -4381,11 +4396,11 @@
    */
   void _configureFlutterPkg(Map<String, String> pathToCode) {
     pathToCode.forEach((path, code) {
-      provider.newFile('$flutterPkgLibPath/$path', code);
+      newFile('$flutterPkgLibPath/$path', content: code);
     });
     // configure SourceFactory
-    Folder myPkgFolder = provider.getResource(flutterPkgLibPath);
-    UriResolver pkgResolver = new PackageMapUriResolver(provider, {
+    Folder myPkgFolder = getFolder(flutterPkgLibPath);
+    UriResolver pkgResolver = new PackageMapUriResolver(resourceProvider, {
       'flutter': [myPkgFolder]
     });
     SourceFactory sourceFactory = new SourceFactory(
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index b4c7c4d..c8a1dae 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -88,7 +88,7 @@
     String fileContent = testCode;
     if (target != null) {
       expect(target, fileEdits.first.file);
-      fileContent = provider.getFile(target).readAsStringSync();
+      fileContent = getFile(target).readAsStringSync();
     }
 
     resultCode = SourceEdit.applySequence(fileContent, change.edits[0].edits);
@@ -161,8 +161,8 @@
    * Computes fixes for the given [error] in [testUnit].
    */
   Future<List<Fix>> _computeFixes(AnalysisError error) async {
-    DartFixContext fixContext = new _DartFixContextImpl(
-        provider, driver, new AstProviderForDriver(driver), testUnit, error);
+    DartFixContext fixContext = new _DartFixContextImpl(resourceProvider,
+        driver, new AstProviderForDriver(driver), testUnit, error);
     return await new DefaultFixContributor().internalComputeFixes(fixContext);
   }
 
@@ -172,11 +172,11 @@
    */
   void _configureMyPkg(Map<String, String> pathToCode) {
     pathToCode.forEach((path, code) {
-      provider.newFile('$myPkgLibPath/$path', code);
+      newFile('$myPkgLibPath/$path', content: code);
     });
     // configure SourceFactory
-    Folder myPkgFolder = provider.getResource(myPkgLibPath);
-    UriResolver pkgResolver = new PackageMapUriResolver(provider, {
+    Folder myPkgFolder = getFolder(myPkgLibPath);
+    UriResolver pkgResolver = new PackageMapUriResolver(resourceProvider, {
       'my_pkg': [myPkgFolder]
     });
     SourceFactory sourceFactory = new SourceFactory(
@@ -2060,7 +2060,7 @@
   }
 
   test_createFile_forImport_BAD_inPackage_lib_justLib() async {
-    provider.newFile('/projects/my_package/pubspec.yaml', 'name: my_package');
+    newFile('/projects/my_package/pubspec.yaml', content: 'name: my_package');
     testFile = '/projects/my_package/test.dart';
     await resolveTestUnit('''
 import 'lib';
@@ -2077,9 +2077,9 @@
   }
 
   test_createFile_forImport_inPackage_lib() async {
-    provider.newFile('/projects/my_package/pubspec.yaml', 'name: my_package');
+    newFile('/projects/my_package/pubspec.yaml', content: 'name: my_package');
     testFile = '/projects/my_package/lib/test.dart';
-    provider.newFolder('/projects/my_package/lib');
+    newFolder('/projects/my_package/lib');
     await resolveTestUnit('''
 import 'a/bb/c_cc/my_lib.dart';
 ''');
@@ -2098,7 +2098,7 @@
   }
 
   test_createFile_forImport_inPackage_test() async {
-    provider.newFile('/projects/my_package/pubspec.yaml', 'name: my_package');
+    newFile('/projects/my_package/pubspec.yaml', content: 'name: my_package');
     testFile = '/projects/my_package/test/misc/test_all.dart';
     await resolveTestUnit('''
 import 'a/bb/my_lib.dart';
@@ -2137,7 +2137,7 @@
   }
 
   test_createFile_forPart_inPackageLib() async {
-    provider.newFile('/my/pubspec.yaml', r'''
+    newFile('/my/pubspec.yaml', content: r'''
 name: my_test
 ''');
     testFile = '/my/lib/test.dart';
@@ -2146,8 +2146,8 @@
 part 'my_part.dart';
 ''', Uri.parse('package:my/test.dart'));
     // configure SourceFactory
-    UriResolver pkgResolver = new PackageMapUriResolver(provider, {
-      'my': <Folder>[provider.getResource('/my/lib')],
+    UriResolver pkgResolver = new PackageMapUriResolver(resourceProvider, {
+      'my': <Folder>[getFolder('/my/lib')],
     });
     SourceFactory sourceFactory = new SourceFactory(
         [new DartUriResolver(sdk), pkgResolver, resourceResolver]);
@@ -3498,8 +3498,8 @@
 
   test_importLibraryProject_BAD_notInLib_BUILD() async {
     testFile = '/aaa/bin/test.dart';
-    provider.newFile('/aaa/BUILD', '');
-    provider.newFile('/bbb/BUILD', '');
+    newFile('/aaa/BUILD');
+    newFile('/bbb/BUILD');
     addSource('/bbb/test/lib.dart', 'class Test {}');
     await resolveTestUnit('''
 main() {
@@ -3511,8 +3511,8 @@
 
   test_importLibraryProject_BAD_notInLib_pubspec() async {
     testFile = '/aaa/bin/test.dart';
-    provider.newFile('/aaa/pubspec.yaml', 'name: aaa');
-    provider.newFile('/bbb/pubspec.yaml', 'name: bbb');
+    newFile('/aaa/pubspec.yaml', content: 'name: aaa');
+    newFile('/bbb/pubspec.yaml', content: 'name: bbb');
     addSource('/bbb/test/lib.dart', 'class Test {}');
     await resolveTestUnit('''
 main() {
@@ -4268,7 +4268,7 @@
 ''');
   }
 
-  test_replaceWithConstInstanceCreation() async {
+  test_replaceWithConstInstanceCreation_explicitNew() async {
     await resolveTestUnit('''
 class A {
   const A();
@@ -4283,6 +4283,23 @@
 ''');
   }
 
+  @failingTest
+  test_replaceWithConstInstanceCreation_implicitNew() async {
+    // This test fails because the implicit `new` isn't yet recognized.
+    await resolveTestUnit('''
+class A {
+  const A();
+}
+const a = A();
+''');
+    await assertHasFix(DartFixKind.USE_CONST, '''
+class A {
+  const A();
+}
+const a = const A();
+''');
+  }
+
   test_undefinedClass_useSimilar_BAD_prefixed() async {
     await resolveTestUnit('''
 import 'dart:async' as c;
@@ -5584,11 +5601,11 @@
    */
   void _configureFlutterPkg(Map<String, String> pathToCode) {
     pathToCode.forEach((path, code) {
-      provider.newFile('$flutterPkgLibPath/$path', code);
+      newFile('$flutterPkgLibPath/$path', content: code);
     });
     // configure SourceFactory
-    Folder myPkgFolder = provider.getResource(flutterPkgLibPath);
-    UriResolver pkgResolver = new PackageMapUriResolver(provider, {
+    Folder myPkgFolder = getFolder(flutterPkgLibPath);
+    UriResolver pkgResolver = new PackageMapUriResolver(resourceProvider, {
       'flutter': [myPkgFolder]
     });
     SourceFactory sourceFactory = new SourceFactory(
diff --git a/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart b/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
index afdd053..090e1ea 100644
--- a/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
+++ b/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
@@ -59,7 +59,7 @@
     SourceFileEdit fileEdit = refactoringChange.getFileEdit(path);
     expect(fileEdit, isNotNull, reason: 'No file edit for $path');
     // validate resulting code
-    File file = provider.getResource(path);
+    File file = getFile(path);
     String ini = file.readAsStringSync();
     String actualCode = SourceEdit.applySequence(ini, fileEdit.edits);
     expect(actualCode, expectedCode);
diff --git a/pkg/analysis_server/test/src/computer/closingLabels_computer_test.dart b/pkg/analysis_server/test/src/computer/closingLabels_computer_test.dart
index aaf6879..1c5ec8d 100644
--- a/pkg/analysis_server/test/src/computer/closingLabels_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/closingLabels_computer_test.dart
@@ -24,7 +24,7 @@
 
   setUp() {
     super.setUp();
-    sourcePath = provider.convertPath('/p/lib/source.dart');
+    sourcePath = resourceProvider.convertPath('/p/lib/source.dart');
   }
 
   test_adjacentLinesExcluded() async {
@@ -76,46 +76,6 @@
     _compareLabels(labels, content, expectedLabelCount: 0);
   }
 
-  test_noLabelsForOneElement() async {
-    String content = """
-Widget build(BuildContext context) {
-  return new Row(
-  );
-}
-""";
-
-    var labels = await _computeElements(content);
-    _compareLabels(labels, content, expectedLabelCount: 0);
-  }
-
-  test_labelsShownForMultipleElements() async {
-    String content = """
-Widget build(BuildContext context) {
-  return /*1*/new Row(
-    child: new RaisedButton(),
-  )/*1:Row*/;
-}
-""";
-
-    var labels = await _computeElements(content);
-    _compareLabels(labels, content, expectedLabelCount: 1);
-  }
-
-  test_labelsShownForMultipleElements_2() async {
-    String content = """
-Widget build(BuildContext context) {
-  return /*1*/new Row(
-    child: /*2*/new RaisedButton(
-      onPressed: increment,
-    )/*2:RaisedButton*/,
-  )/*1:Row*/;
-}
-""";
-
-    var labels = await _computeElements(content);
-    _compareLabels(labels, content, expectedLabelCount: 2);
-  }
-
   test_constConstructor() async {
     String content = """
 void myMethod() {
@@ -177,6 +137,34 @@
     await _computeElements(content);
   }
 
+  test_labelsShownForMultipleElements() async {
+    String content = """
+Widget build(BuildContext context) {
+  return /*1*/new Row(
+    child: new RaisedButton(),
+  )/*1:Row*/;
+}
+""";
+
+    var labels = await _computeElements(content);
+    _compareLabels(labels, content, expectedLabelCount: 1);
+  }
+
+  test_labelsShownForMultipleElements_2() async {
+    String content = """
+Widget build(BuildContext context) {
+  return /*1*/new Row(
+    child: /*2*/new RaisedButton(
+      onPressed: increment,
+    )/*2:RaisedButton*/,
+  )/*1:Row*/;
+}
+""";
+
+    var labels = await _computeElements(content);
+    _compareLabels(labels, content, expectedLabelCount: 2);
+  }
+
   test_listLiterals() async {
     String content = """
 void myMethod() {
@@ -269,6 +257,18 @@
     _compareLabels(labels, content, expectedLabelCount: 2);
   }
 
+  test_noLabelsForOneElement() async {
+    String content = """
+Widget build(BuildContext context) {
+  return new Row(
+  );
+}
+""";
+
+    var labels = await _computeElements(content);
+    _compareLabels(labels, content, expectedLabelCount: 0);
+  }
+
   test_NoLabelsFromInterpolatedStrings() async {
     String content = """
 void main(HighlightRegionType type, int offset, int length) {
@@ -399,7 +399,7 @@
   }
 
   Future<List<ClosingLabel>> _computeElements(String sourceContent) async {
-    provider.newFile(sourcePath, sourceContent);
+    newFile(sourcePath, content: sourceContent);
     ResolveResult result = await driver.getResult(sourcePath);
     DartUnitClosingLabelsComputer computer =
         new DartUnitClosingLabelsComputer(result.lineInfo, result.unit);
diff --git a/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart b/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
index 63d5432..bbe6367 100644
--- a/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
@@ -48,14 +48,14 @@
 
   Future<Null> createBuilder(String content) async {
     originalContent = content;
-    provider.newFile(path, content);
+    newFile(path, content: content);
     AnalysisResult result = await driver.getResult(path);
-    computer = new ImportElementsComputer(provider, result);
+    computer = new ImportElementsComputer(resourceProvider, result);
   }
 
   void setUp() {
     super.setUp();
-    path = provider.convertPath('/test.dart');
+    path = resourceProvider.convertPath('/test.dart');
   }
 
   test_createEdits_addImport_noDirectives() async {
diff --git a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
index adcf5f1..f66cf97 100644
--- a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
@@ -24,7 +24,7 @@
 
   setUp() {
     super.setUp();
-    sourcePath = provider.convertPath('/p/lib/source.dart');
+    sourcePath = resourceProvider.convertPath('/p/lib/source.dart');
   }
 
   test_dartAsync_noPrefix() async {
@@ -391,7 +391,7 @@
 
   Future<List<ImportedElements>> _computeElements(
       String sourceContent, int offset, int length) async {
-    provider.newFile(sourcePath, sourceContent);
+    newFile(sourcePath, content: sourceContent);
     ResolveResult result = await driver.getResult(sourcePath);
     ImportedElementsComputer computer =
         new ImportedElementsComputer(result.unit, offset, length);
diff --git a/pkg/analysis_server/test/src/computer/outline_computer_test.dart b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
index 2b88704..8395805 100644
--- a/pkg/analysis_server/test/src/computer/outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
@@ -29,12 +29,12 @@
   @override
   void setUp() {
     super.setUp();
-    testPath = provider.convertPath('/test.dart');
+    testPath = resourceProvider.convertPath('/test.dart');
   }
 
   Future<Outline> _computeOutline(String code) async {
     testCode = code;
-    provider.newFile(testPath, code);
+    newFile(testPath, content: code);
     AnalysisResult analysisResult = await driver.getResult(testPath);
     return new DartUnitOutlineComputer(
             testPath, analysisResult.lineInfo, analysisResult.unit)
@@ -47,7 +47,7 @@
   @override
   void setUp() {
     super.setUp();
-    Folder libFolder = configureFlutterPackage(provider);
+    Folder libFolder = configureFlutterPackage(resourceProvider);
     packageMap['flutter'] = [libFolder];
   }
 
diff --git a/pkg/analysis_server/test/src/utilities/flutter_test.dart b/pkg/analysis_server/test/src/utilities/flutter_test.dart
index 26e38eb..f6ef78c6 100644
--- a/pkg/analysis_server/test/src/utilities/flutter_test.dart
+++ b/pkg/analysis_server/test/src/utilities/flutter_test.dart
@@ -22,7 +22,7 @@
   @override
   void setUp() {
     super.setUp();
-    Folder libFolder = configureFlutterPackage(provider);
+    Folder libFolder = configureFlutterPackage(resourceProvider);
     packageMap['flutter'] = [libFolder];
   }
 
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 3d6cd28..ba811b3d 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -4229,7 +4229,7 @@
 
   /**
    * Return the 'new' or 'const' keyword used to indicate how an object should
-   * be created.
+   * be created, or `null` if the keyword was not explicitly provided.
    */
   Token get keyword;
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 1bf15ab..588c842 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -94,7 +94,7 @@
   /**
    * The version of data format, should be incremented on every format change.
    */
-  static const int DATA_VERSION = 47;
+  static const int DATA_VERSION = 48;
 
   /**
    * The number of exception contexts allowed to write. Once this field is
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index b06f3f7..8c3fe08 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -212,14 +212,13 @@
 
         // Invalid part URIs can result in an element with a null source
         if (unit.element.source != null) {
-          final errorListener = new FastaErrorReporter(
-              new ErrorReporter(_getErrorListener(file), unit.element.source));
+          final reporter = new FastaErrorReporter(_getErrorReporter(file));
           final libraryKernelResult = kernelResult.results
               .expand((r) => r.libraryResults)
               .where((r) => r.library.importUri == unit.element.source.uri)
               .firstWhere((_) => true, orElse: () => null);
-          libraryKernelResult?.errors?.forEach((kernelError) =>
-              errorListener.reportCompilationMessage(kernelError));
+          libraryKernelResult?.errors?.forEach(
+              (kernelError) => reporter.reportCompilationMessage(kernelError));
         }
       });
 
@@ -514,7 +513,9 @@
    * Return a new parsed unresolved [CompilationUnit].
    */
   CompilationUnit _parse(FileState file) {
-    RecordingErrorListener errorListener = _getErrorListener(file);
+    AnalysisErrorListener errorListener = _previewDart2
+        ? AnalysisErrorListener.NULL_LISTENER
+        : _getErrorListener(file);
     String content = file.content;
     CompilationUnit unit = file.parse(errorListener);
 
@@ -742,9 +743,12 @@
             if (redirectName != null) {
               var redirectedConstructor = context.redirectedConstructor;
               redirectName.staticElement = redirectedConstructor;
+              // TODO(scheglov) Support for import prefix?
               ResolutionApplier.applyConstructorElement(
-                  redirectedConstructor.returnType,
+                  _libraryElement,
+                  null,
                   redirectedConstructor,
+                  redirectedConstructor.returnType,
                   redirectName);
               // TODO(scheglov) Add support for type parameterized redirects.
             } else {
@@ -792,6 +796,8 @@
         applier.checkDone();
       } else if (declaration is FunctionTypeAlias) {
         // No bodies to resolve.
+      } else if (declaration is GenericTypeAlias) {
+        // No bodies to resolve.
       } else if (declaration is TopLevelVariableDeclaration) {
         List<VariableDeclaration> variables = declaration.variables.variables;
         var context = variables[0].element as ElementImpl;
@@ -1133,6 +1139,7 @@
     }
 
     applier = new ValidatingResolutionApplier(
+        libraryElement,
         this,
         declaredElements,
         referencedElements,
@@ -1224,10 +1231,6 @@
   DartType translateType(kernel.DartType kernelType) {
     if (kernelType is kernel.NullType) {
       return null;
-    } else if (kernelType is kernel.FunctionReferenceDartType) {
-      kernel.VariableDeclaration variable = kernelType.function.variable;
-      FunctionElement element = declarationToElement[variable];
-      return element.type;
     } else if (kernelType is kernel.IndexAssignNullFunctionType) {
       return null;
     } else if (kernelType is kernel.TypeArgumentsDartType) {
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 59d970d..fbc951e 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -6373,7 +6373,7 @@
     implements InstanceCreationExpression {
   /**
    * The 'new' or 'const' keyword used to indicate how an object should be
-   * created.
+   * created, or `null` if the keyword is implicit.
    */
   @override
   Token keyword;
@@ -6414,7 +6414,7 @@
   }
 
   @override
-  Token get beginToken => keyword;
+  Token get beginToken => keyword ?? _constructorName.beginToken;
 
   @override
   Iterable<SyntacticEntity> get childEntities => new ChildEntities()
@@ -6499,6 +6499,69 @@
   void visitChildren(AstVisitor visitor) {
     // There are no children to visit.
   }
+
+  /**
+   * Return `true` if the given [lexeme] is a valid lexeme for an integer
+   * literal. The flag [isNegative] should be `true` if the lexeme is preceded
+   * by a unary negation operator.
+   */
+  static bool isValidLiteral(String lexeme, bool isNegative) {
+    if (lexeme.startsWith('0x') || lexeme.startsWith('0X')) {
+      return _isValidHexadecimalLiteral(lexeme, isNegative);
+    }
+    return _isValidDecimalLiteral(lexeme, isNegative);
+  }
+
+  /**
+   * Return `true` if the given [lexeme] is a valid lexeme for a decimal integer
+   * literal. The flag [isNegative] should be `true` if the lexeme is preceded
+   * by a minus operator.
+   */
+  static bool _isValidDecimalLiteral(String lexeme, bool isNegative) {
+    int length = lexeme.length;
+    int index = 0;
+    while (length > 0 && lexeme.substring(index, index + 1) == '0') {
+      length--;
+      index++;
+    }
+    if (length < 19) {
+      return true;
+    } else if (length > 19) {
+      return false;
+    }
+    if (int.parse(lexeme.substring(index, index + 1)) < 9) {
+      return true;
+    }
+    int bound;
+    if (isNegative) {
+      bound = 223372036854775808;
+    } else {
+      bound = 223372036854775807;
+    }
+    return int.parse(lexeme.substring(index + 1)) <= bound;
+  }
+
+  /**
+   * Return `true` if the given [lexeme] is a valid lexeme for a hexadecimal
+   * integer literal. The lexeme is expected to start with either `0x` or `0X`.
+   */
+  static bool _isValidHexadecimalLiteral(String lexeme, bool isNegative) {
+    int length = lexeme.length - 2;
+    int index = 2;
+    while (length > 0 && lexeme.substring(index, index + 1) == '0') {
+      length--;
+      index++;
+    }
+    if (length < 16) {
+      return true;
+    } else if (length > 16) {
+      return false;
+    }
+    if (!isNegative) {
+      return true;
+    }
+    return int.parse(lexeme.substring(index, index + 1), radix: 16) <= 7;
+  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index 09ccd9f..19eee60 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -1159,6 +1159,10 @@
     element.isFinal = node.isFinal;
     if (node.type == null) {
       element.hasImplicitType = true;
+    } else {
+      // Note: this is a noop most of the time, however, not for
+      // [GenericFunctionType] and perhaps others in the future.
+      node.type.accept(this);
     }
     _currentHolder.addLocalVariable(element);
     variableName.staticElement = element;
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 61f5a19..41ef5e3 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -1123,7 +1123,7 @@
     Token rightDelimiter;
     for (Object raw in rawParameters) {
       if (raw is _OptionalFormalParameters) {
-        parameters.addAll(raw.parameters);
+        parameters.addAll(raw.parameters ?? const <FormalParameter>[]);
         leftDelimiter = raw.leftDelimiter;
         rightDelimiter = raw.rightDelimiter;
       } else {
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index 0976bb8..d0fe70f 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -294,6 +294,10 @@
         errorReporter?.reportErrorForOffset(
             StrongModeCode.INVALID_CAST_NEW_EXPR, offset, length);
         return;
+      case "INVALID_METHOD_OVERRIDE":
+        errorReporter?.reportErrorForOffset(
+            StrongModeCode.INVALID_METHOD_OVERRIDE, offset, length);
+        return;
       case "INVALID_MODIFIER_ON_SETTER":
         _reportByCode(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, message,
             offset, length);
@@ -517,26 +521,14 @@
   }
 
   void reportCompilationMessage(CompilationMessage message) {
-    // TODO(mfairhurst) Disable this once the codes are already analyzer
-    // format (#31644)
-    final analyzerCode =
-        message.code.runes.fold<List<String>>(<String>[], (words, charcode) {
-      final char = new String.fromCharCode(charcode);
-      if (char.toUpperCase() == char) {
-        words.add(char);
-      } else {
-        words[words.length - 1] = words.last + char.toUpperCase();
-      }
-      return words;
-    }).join('_');
-
-    final code = errorCodeByUniqueName(analyzerCode);
-    if (code != null) {
+    String errorCodeStr = message.analyzerCode;
+    ErrorCode errorCode = _getErrorCode(errorCodeStr);
+    if (errorCode != null) {
       errorReporter.reportError(new AnalysisError.forValues(
           errorReporter.source,
           message.span.start.offset,
           message.span.length,
-          code,
+          errorCode,
           message.message,
           message.tip));
     } else {
@@ -564,4 +556,22 @@
           null));
     }
   }
+
+  /// Return the [ErrorCode] for the given [shortName], or `null` if not found.
+  static ErrorCode _getErrorCode(String shortName) {
+    const prefixes = const {
+      CompileTimeErrorCode: 'CompileTimeErrorCode',
+      ParserErrorCode: 'ParserErrorCode',
+      StaticTypeWarningCode: 'StaticTypeWarningCode',
+      StaticWarningCode: 'StaticWarningCode'
+    };
+    for (var prefix in prefixes.values) {
+      var uniqueName = '$prefix.$shortName';
+      var errorCode = errorCodeByUniqueName(uniqueName);
+      if (errorCode != null) {
+        return errorCode;
+      }
+    }
+    return null;
+  }
 }
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index 99dcdc7..dd0090f 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -18,6 +18,7 @@
 /// Visitor that applies resolution data from the front end (obtained via
 /// [ResolutionStorer]) to an analyzer AST.
 class ResolutionApplier extends GeneralizingAstVisitor {
+  final LibraryElement _enclosingLibraryElement;
   final TypeContext _typeContext;
 
   final List<Element> _declaredElements;
@@ -35,8 +36,8 @@
   /// with corresponding getters.
   bool _inAnnotation = false;
 
-  ResolutionApplier(this._typeContext, this._declaredElements,
-      this._referencedElements, this._types);
+  ResolutionApplier(this._enclosingLibraryElement, this._typeContext,
+      this._declaredElements, this._referencedElements, this._types);
 
   /// Apply resolution to annotations of the given [node].
   void applyToAnnotations(AnnotatedNode node) {
@@ -70,7 +71,8 @@
   @override
   void visitAsExpression(AsExpression node) {
     node.expression.accept(this);
-    applyToTypeAnnotation(_getTypeFor(node.asOperator), node.type);
+    applyToTypeAnnotation(
+        _enclosingLibraryElement, _getTypeFor(node.asOperator), node.type);
     node.staticType = _getTypeFor(node.asOperator);
   }
 
@@ -93,7 +95,8 @@
         operatorType != TokenType.AMPERSAND_AMPERSAND &&
         operatorType != TokenType.BAR_BAR) {
       node.staticElement = _getReferenceFor(node.operator);
-      _getTypeFor(node.operator); // function type of the operator
+      _getTypeFor(node.operator); // callee type
+      _getTypeFor(node.operator); // invocation type
       _getTypeFor(node.operator); // type arguments
     }
 
@@ -118,7 +121,8 @@
   void visitCatchClause(CatchClause node) {
     DartType guardType = _getTypeFor(node.onKeyword ?? node.catchKeyword);
     if (node.exceptionType != null) {
-      applyToTypeAnnotation(guardType, node.exceptionType);
+      applyToTypeAnnotation(
+          _enclosingLibraryElement, guardType, node.exceptionType);
     }
 
     SimpleIdentifier exception = node.exceptionParameter;
@@ -175,7 +179,8 @@
       identifier.staticType = type;
 
       if (loopVariable.type != null) {
-        applyToTypeAnnotation(type, loopVariable.type);
+        applyToTypeAnnotation(
+            _enclosingLibraryElement, type, loopVariable.type);
       }
 
       VariableElementImpl element = _getDeclarationFor(identifier);
@@ -218,7 +223,8 @@
     _typeContext.enterLocalFunction(element);
 
     if (node.returnType != null && element != null) {
-      applyToTypeAnnotation(element.returnType, node.returnType);
+      applyToTypeAnnotation(
+          _enclosingLibraryElement, element.returnType, node.returnType);
     }
 
     // Associate the elements with the nodes.
@@ -239,7 +245,8 @@
         }
       }
 
-      applyParameters(element.parameters, parameterList);
+      applyParameters(
+          _enclosingLibraryElement, element.parameters, parameterList);
     }
 
     functionExpression.body?.accept(this);
@@ -257,7 +264,8 @@
     if (element != null) {
       node.element = element;
       node.staticType = element.type;
-      applyParameters(element.parameters, parameterList);
+      applyParameters(
+          _enclosingLibraryElement, element.parameters, parameterList);
     }
 
     // Apply resolution to default values.
@@ -270,9 +278,21 @@
   @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.function.accept(this);
-    // TODO(brianwilkerson) Visit node.typeArguments.
+
+    DartType invokeType = _getTypeFor(node.argumentList);
+    node.staticInvokeType = invokeType;
+
+    DartType typeArgumentsDartType = _getTypeFor(node.argumentList);
+    if (node.typeArguments != null &&
+        typeArgumentsDartType is TypeArgumentsDartType) {
+      _applyTypeArgumentsToList(_enclosingLibraryElement, typeArgumentsDartType,
+          node.typeArguments.arguments);
+    }
+
+    DartType resultType = _getTypeFor(node.argumentList);
+    node.staticType = resultType;
+
     node.argumentList.accept(this);
-    node.staticElement = _getReferenceFor(node);
   }
 
   @override
@@ -288,8 +308,8 @@
       node.staticElement = member;
     }
 
-    // We cannot use the detached FunctionType of `[]` or `[]=`.
-    _getTypeFor(node.leftBracket);
+    _getTypeFor(node.leftBracket); // callee type
+    _getTypeFor(node.leftBracket); // invoke type
     _getTypeFor(node.leftBracket); // type arguments
 
     node.staticType = _getTypeFor(node.leftBracket);
@@ -301,24 +321,81 @@
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     ConstructorName constructorName = node.constructorName;
 
-    DartType type = _getTypeFor(constructorName);
-    ConstructorElement element = _getReferenceFor(constructorName);
+    // Peek forward and check if the next element is a PrefixElement.
+    PrefixElement prefix;
+    AstNode constructorEntity = constructorName;
+    if (_referencedElements[_referencedElementIndex] is PrefixElement) {
+      PrefixedIdentifier typeIdentifier = constructorName.type.name;
+      prefix = _getReferenceFor(typeIdentifier.prefix);
+      _getTypeFor(typeIdentifier.prefix); // prefix type
+      constructorEntity = typeIdentifier.identifier;
+    }
 
-    constructorName.staticElement = element;
+    ConstructorElement constructor = _getReferenceFor(constructorEntity);
+    DartType type = _getTypeFor(constructorEntity);
 
-    node.staticElement = element;
+    applyConstructorElement(
+        _enclosingLibraryElement, prefix, constructor, type, constructorName);
+
+    node.staticElement = constructor;
     node.staticType = type;
 
-    applyConstructorElement(type, element, constructorName);
-
     ArgumentList argumentList = node.argumentList;
     _applyResolutionToArguments(argumentList);
+    _resolveNamedArguments(argumentList, constructor?.parameters);
+  }
+
+  @override
+  void visitAnnotation(Annotation node) {
+    SimpleIdentifier constructorName = node.constructorName;
+
+    // Peek forward and check if the next element is a PrefixElement.
+    SimpleIdentifier topEntity;
+    if (_referencedElements[_referencedElementIndex] is PrefixElement) {
+      PrefixedIdentifier prefixedIdentifier = node.name;
+
+      SimpleIdentifier prefix = prefixedIdentifier.prefix;
+      PrefixElement prefixElement = _getReferenceFor(prefix);
+      _getTypeFor(prefix); // prefix type
+      prefix.staticElement = prefixElement;
+
+      topEntity = prefixedIdentifier.identifier;
+    } else {
+      topEntity = node.name;
+    }
+
+    Element element = _getReferenceFor(topEntity);
+    DartType type = _getTypeFor(topEntity);
+    node.element = element;
+
+    if (element is ConstructorElement) {
+      topEntity.staticElement = element.enclosingElement;
+
+      if (constructorName != null) {
+        constructorName.staticElement = element;
+        constructorName.staticType = element.type;
+      }
+
+      ArgumentList argumentList = node.arguments;
+      if (argumentList != null) {
+        _applyResolutionToArguments(argumentList);
+        _resolveNamedArguments(argumentList, element.parameters);
+      }
+    } else {
+      topEntity.staticElement = element;
+      topEntity.staticType = type;
+      if (constructorName != null) {
+        constructorName.accept(this);
+        node.element = constructorName.staticElement;
+      }
+    }
   }
 
   @override
   void visitIsExpression(IsExpression node) {
     node.expression.accept(this);
-    applyToTypeAnnotation(_getTypeFor(node.isOperator), node.type);
+    applyToTypeAnnotation(
+        _enclosingLibraryElement, _getTypeFor(node.isOperator), node.type);
     node.staticType = _getTypeFor(node.isOperator);
   }
 
@@ -328,7 +405,8 @@
     DartType type = _getTypeFor(node.constKeyword ?? node.leftBracket);
     node.staticType = type;
     if (node.typeArguments != null) {
-      _applyTypeArgumentsToList(type, node.typeArguments.arguments);
+      _applyTypeArgumentsToList(
+          _enclosingLibraryElement, type, node.typeArguments.arguments);
     }
   }
 
@@ -338,7 +416,8 @@
     DartType type = _getTypeFor(node.constKeyword ?? node.leftBracket);
     node.staticType = type;
     if (node.typeArguments != null) {
-      _applyTypeArgumentsToList(type, node.typeArguments.arguments);
+      _applyTypeArgumentsToList(
+          _enclosingLibraryElement, type, node.typeArguments.arguments);
     }
   }
 
@@ -349,7 +428,8 @@
     ArgumentList argumentList = node.argumentList;
 
     Element invokeElement = _getReferenceFor(node.methodName);
-    DartType invokeType = _getTypeFor(node.methodName);
+    _getTypeFor(node.methodName); // static element type
+    DartType invokeType = _getTypeFor(argumentList);
     DartType typeArgumentsDartType = _getTypeFor(argumentList);
     DartType resultType = _getTypeFor(argumentList);
 
@@ -366,12 +446,24 @@
     if (invokeType is FunctionType) {
       if (node.typeArguments != null &&
           typeArgumentsDartType is TypeArgumentsDartType) {
-        _applyTypeArgumentsToList(
+        _applyTypeArgumentsToList(_enclosingLibraryElement,
             typeArgumentsDartType, node.typeArguments.arguments);
       }
     }
 
     _applyResolutionToArguments(argumentList);
+
+    {
+      var elementForParameters = invokeElement;
+      if (elementForParameters is PropertyAccessorElement) {
+        PropertyAccessorElement accessor = elementForParameters;
+        elementForParameters = accessor.returnType.element;
+      }
+      if (elementForParameters is FunctionTypedElement) {
+        List<ParameterElement> parameters = elementForParameters.parameters;
+        _resolveNamedArguments(argumentList, parameters);
+      }
+    }
   }
 
   @override
@@ -418,7 +510,8 @@
       // This is a method invocation, it is associated with the operator.
       SyntacticEntity entity = node.operator;
       node.staticElement = _getReferenceFor(entity);
-      _getTypeFor(entity); // The function type of the operator.
+      _getTypeFor(entity); // The static function type of the operator.
+      _getTypeFor(entity); // The invoke function type of the operator.
       _getTypeFor(entity); // The type arguments (empty).
       node.staticType = _getTypeFor(entity);
     }
@@ -442,6 +535,7 @@
 
     ArgumentList argumentList = node.argumentList;
     _applyResolutionToArguments(argumentList);
+    _resolveNamedArguments(argumentList, element?.parameters);
   }
 
   @override
@@ -468,16 +562,19 @@
   void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     SimpleIdentifier constructorName = node.constructorName;
     var superElement = _typeContext.enclosingClassElement.supertype.element;
+    ConstructorElement element;
     if (constructorName == null) {
-      node.staticElement = superElement.unnamedConstructor;
+      element = superElement.unnamedConstructor;
     } else {
       String name = constructorName.name;
-      var superConstructor = superElement.getNamedConstructor(name);
-      node.staticElement = superConstructor;
-      constructorName.staticElement = superConstructor;
+      element = superElement.getNamedConstructor(name);
+      constructorName.staticElement = element;
     }
+    node.staticElement = element;
 
-    node.argumentList.accept(this);
+    ArgumentList argumentList = node.argumentList;
+    _applyResolutionToArguments(argumentList);
+    _resolveNamedArguments(argumentList, element?.parameters);
   }
 
   @override
@@ -492,7 +589,7 @@
 
   @override
   void visitTypeAnnotation(TypeAnnotation node) {
-    applyToTypeAnnotation(_getTypeFor(node), node);
+    applyToTypeAnnotation(_enclosingLibraryElement, _getTypeFor(node), node);
   }
 
   @override
@@ -530,7 +627,7 @@
         DartType type = node.variables[0].name.staticType;
         // TODO(brianwilkerson) Understand why the type is sometimes `null`.
         if (type != null) {
-          applyToTypeAnnotation(type, node.type);
+          applyToTypeAnnotation(_enclosingLibraryElement, type, node.type);
         }
       }
     }
@@ -591,39 +688,67 @@
     return _typeContext.translateType(kernelType);
   }
 
+  /// Apply resolution to named arguments of the [argumentList].
+  void _resolveNamedArguments(
+      ArgumentList argumentList, List<ParameterElement> parameters) {
+    if (parameters != null) {
+      for (var argument in argumentList.arguments) {
+        if (argument is NamedExpression) {
+          SimpleIdentifier identifier = argument.name.label;
+          for (var parameter in parameters) {
+            if (parameter.name == identifier.name) {
+              identifier.staticElement = parameter;
+              break;
+            }
+          }
+        }
+      }
+    }
+  }
+
   /// Apply the [type] that is created by the [constructorName] and the
   /// [constructorElement] it references.
-  static void applyConstructorElement(DartType type,
-      ConstructorElement constructorElement, ConstructorName constructorName) {
+  static void applyConstructorElement(
+      LibraryElement enclosingLibraryElement,
+      PrefixElement prefixElement,
+      ConstructorElement constructorElement,
+      DartType type,
+      ConstructorName constructorName) {
+    constructorName.staticElement = constructorElement;
+
     ClassElement classElement = constructorElement?.enclosingElement;
 
     Identifier typeIdentifier = constructorName.type.name;
-    if (typeIdentifier is SimpleIdentifier) {
-      applyToTypeAnnotation(type, constructorName.type);
-      if (constructorName.name != null) {
-        constructorName.name.staticElement = constructorElement;
-      }
-    } else if (typeIdentifier is PrefixedIdentifier) {
-      // TODO(scheglov) Rewrite AST using knowledge about prefixes.
-      // TODO(scheglov) Add support for `new prefix.Type()`.
-      // TODO(scheglov) Add support for `new prefix.Type.name()`.
-      assert(constructorName.name == null);
-      constructorName.period = typeIdentifier.period;
-      constructorName.name = typeIdentifier.identifier;
+    if (prefixElement != null) {
+      PrefixedIdentifier prefixedTypeIdentifier = typeIdentifier;
+      prefixedTypeIdentifier.staticType = type;
 
-      SimpleIdentifier classNode = typeIdentifier.prefix;
+      prefixedTypeIdentifier.prefix.staticElement = prefixElement;
+
+      SimpleIdentifier classNode = prefixedTypeIdentifier.identifier;
       classNode.staticElement = classElement;
       classNode.staticType = type;
-
-      constructorName.type = astFactory.typeName(classNode, null);
-      constructorName.type.type = type;
-      constructorName.name.staticElement = constructorElement;
+    } else {
+      if (typeIdentifier is SimpleIdentifier) {
+        typeIdentifier.staticElement = classElement;
+        typeIdentifier.staticType = type;
+      } else if (typeIdentifier is PrefixedIdentifier) {
+        constructorName.type = astFactory.typeName(typeIdentifier.prefix, null);
+        constructorName.period = typeIdentifier.period;
+        constructorName.name = typeIdentifier.identifier;
+      }
     }
+
+    constructorName.name?.staticElement = constructorElement;
+
+    applyToTypeAnnotation(enclosingLibraryElement, type, constructorName.type);
   }
 
   /// Apply the types of the [parameterElements] to the [parameterList] that
   /// have an explicit type annotation.
-  static void applyParameters(List<ParameterElement> parameterElements,
+  static void applyParameters(
+      LibraryElement enclosingLibraryElement,
+      List<ParameterElement> parameterElements,
       FormalParameterList parameterList) {
     List<FormalParameter> parameters = parameterList.parameters;
 
@@ -657,13 +782,15 @@
       TypeAnnotation functionReturnType;
       FormalParameterList functionParameterList;
       if (normalParameter is SimpleFormalParameter) {
-        applyToTypeAnnotation(element.type, normalParameter.type);
+        applyToTypeAnnotation(
+            enclosingLibraryElement, element.type, normalParameter.type);
       } else if (normalParameter is FunctionTypedFormalParameter) {
         functionReturnType = normalParameter.returnType;
         functionParameterList = normalParameter.parameters;
       } else if (normalParameter is FieldFormalParameter) {
         if (normalParameter.parameters == null) {
-          applyToTypeAnnotation(element.type, normalParameter.type);
+          applyToTypeAnnotation(
+              enclosingLibraryElement, element.type, normalParameter.type);
         } else {
           functionReturnType = normalParameter.type;
           functionParameterList = normalParameter.parameters;
@@ -673,9 +800,11 @@
       if (functionParameterList != null) {
         FunctionType elementType = element.type;
         if (functionReturnType != null) {
-          applyToTypeAnnotation(elementType.returnType, functionReturnType);
+          applyToTypeAnnotation(enclosingLibraryElement, elementType.returnType,
+              functionReturnType);
         }
-        applyParameters(elementType.parameters, functionParameterList);
+        applyParameters(enclosingLibraryElement, elementType.parameters,
+            functionParameterList);
       }
     }
   }
@@ -684,19 +813,8 @@
   /// [typeAnnotation] to the [type] and recursively applying each of the type
   /// arguments of the [type] to the corresponding type arguments of the
   /// [typeAnnotation].
-  static void applyToTypeAnnotation(
+  static void applyToTypeAnnotation(LibraryElement enclosingLibraryElement,
       DartType type, TypeAnnotation typeAnnotation) {
-    SimpleIdentifier nameForElement(Identifier identifier) {
-      if (identifier is SimpleIdentifier) {
-        return identifier;
-      } else if (identifier is PrefixedIdentifier) {
-        return identifier.identifier;
-      } else {
-        throw new UnimplementedError(
-            'Unhandled class of identifier: ${identifier.runtimeType}');
-      }
-    }
-
     if (typeAnnotation is GenericFunctionTypeImpl) {
       if (type is! FunctionType) {
         throw new StateError('Non-function type ($type) '
@@ -704,36 +822,55 @@
       }
       FunctionType functionType = type;
       typeAnnotation.type = type;
-      applyToTypeAnnotation(functionType.returnType, typeAnnotation.returnType);
-      applyParameters(functionType.parameters, typeAnnotation.parameters);
+      applyToTypeAnnotation(enclosingLibraryElement, functionType.returnType,
+          typeAnnotation.returnType);
+      applyParameters(enclosingLibraryElement, functionType.parameters,
+          typeAnnotation.parameters);
     } else if (typeAnnotation is TypeNameImpl) {
       typeAnnotation.type = type;
-      SimpleIdentifier name = nameForElement(typeAnnotation.name);
+
+      Identifier typeIdentifier = typeAnnotation.name;
+      SimpleIdentifier typeName;
+      if (typeIdentifier is PrefixedIdentifier) {
+        if (enclosingLibraryElement != null) {
+          String prefixName = typeIdentifier.prefix.name;
+          for (var import in enclosingLibraryElement.imports) {
+            if (import.prefix?.name == prefixName) {
+              typeIdentifier.prefix.staticElement = import.prefix;
+              break;
+            }
+          }
+        }
+        typeName = typeIdentifier.identifier;
+      } else {
+        typeName = typeIdentifier;
+      }
 
       Element typeElement = type.element;
       if (typeElement is GenericFunctionTypeElement &&
           typeElement.enclosingElement is GenericTypeAliasElement) {
         typeElement = typeElement.enclosingElement;
       }
-      name.staticElement = typeElement;
 
-      name.staticType = type;
+      typeName.staticElement = typeElement;
+      typeName.staticType = type;
     }
     if (typeAnnotation is NamedType) {
       TypeArgumentList typeArguments = typeAnnotation.typeArguments;
       if (typeArguments != null) {
-        _applyTypeArgumentsToList(type, typeArguments.arguments);
+        _applyTypeArgumentsToList(
+            enclosingLibraryElement, type, typeArguments.arguments);
       }
     }
   }
 
   /// Recursively apply each of the type arguments of the [type] to the
   /// corresponding type arguments of the [typeArguments].
-  static void _applyTypeArgumentsToList(
+  static void _applyTypeArgumentsToList(LibraryElement enclosingLibraryElement,
       DartType type, List<TypeAnnotation> typeArguments) {
     if (type != null && type.isUndefined) {
       for (TypeAnnotation argument in typeArguments) {
-        applyToTypeAnnotation(type, argument);
+        applyToTypeAnnotation(enclosingLibraryElement, type, argument);
       }
     } else if (type is ParameterizedType) {
       List<DartType> argumentTypes = type.typeArguments;
@@ -743,7 +880,8 @@
             'for ${typeArguments.length} type arguments');
       }
       for (int i = 0; i < argumentCount; i++) {
-        applyToTypeAnnotation(argumentTypes[i], typeArguments[i]);
+        applyToTypeAnnotation(
+            enclosingLibraryElement, argumentTypes[i], typeArguments[i]);
       }
     } else {
       throw new StateError('Attempting to apply a non-parameterized type '
@@ -809,6 +947,7 @@
   final List<int> _typeOffsets;
 
   ValidatingResolutionApplier(
+      LibraryElement enclosingLibraryElement,
       TypeContext typeContext,
       List<Element> declaredElements,
       List<Element> referencedElements,
@@ -816,7 +955,8 @@
       this._declaredElementOffsets,
       this._referencedElementOffsets,
       this._typeOffsets)
-      : super(typeContext, declaredElements, referencedElements, types);
+      : super(enclosingLibraryElement, typeContext, declaredElements,
+            referencedElements, types);
 
   @override
   void checkDone() {
diff --git a/pkg/analyzer/lib/src/fasta/resolution_storer.dart b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
index e059b8b..4e7d136e 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_storer.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
@@ -9,21 +9,6 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/type_algebra.dart';
 
-/// TODO(scheglov) document
-class FunctionReferenceDartType implements DartType {
-  final FunctionDeclaration function;
-  final DartType type;
-
-  FunctionReferenceDartType(this.function, this.type);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '(${function.variable}, $type)';
-  }
-}
-
 /// The reference to the import prefix with the [name].
 class ImportPrefixNode implements TreeNode {
   final String name;
@@ -257,8 +242,9 @@
   }
 
   @override
-  bool constructorInvocationEnter(
-      InvocationExpression expression, DartType typeContext) {
+  bool constructorInvocationEnter(InvocationExpression expression,
+      String prefixName, DartType typeContext) {
+    _recordImportPrefix(prefixName);
     _deferReference(expression.fileOffset);
     _deferType(expression.fileOffset);
     return true;
@@ -366,6 +352,7 @@
   void indexAssignAfterReceiver(Expression write, DartType typeContext) {
     _deferReference(write.fileOffset);
     _recordType(const IndexAssignNullFunctionType(), write.fileOffset);
+    _recordType(const IndexAssignNullFunctionType(), write.fileOffset);
     _recordType(new TypeArgumentsDartType(<DartType>[]), write.fileOffset);
     _deferType(write.fileOffset);
   }
@@ -410,21 +397,11 @@
       // before arguments. To ensure this order for method invocations, we
       // first record `null`, and then replace it on exit.
       _deferReference(expression.fileOffset);
-      // We are visiting a method invocation like: a.f(args).  We have visited a
-      // but we haven't visited the args yet.
-      //
-      // The analyzer AST will expect a type for f at this point.  (It can't
-      // wait until later, because for all it knows, a.f might be a property
-      // access, in which case the appropriate time for the type is now).  But
-      // the type isn't known yet (because it may depend on type inference based
-      // on arguments).
-      //
-      // So we add a `null` to our list of types; we'll update it with the
-      // actual type later.
-      _deferType(expression.fileOffset);
+      _deferType(expression.fileOffset); // callee type
     }
-    _deferType(expression.fileOffset);
-    _deferType(expression.fileOffset);
+    _deferType(expression.fileOffset); // invoke type
+    _deferType(expression.fileOffset); // type arguments
+    _deferType(expression.fileOffset); // result type
     super.methodInvocationBeforeArgs(expression, isImplicitCall);
   }
 
@@ -442,27 +419,41 @@
         : expression.fileOffset;
     _replaceType(inferredType, resultOffset);
     _replaceType(new TypeArgumentsDartType(arguments.types), resultOffset);
+
+    FunctionType invokeType = substitution == null
+        ? calleeType
+        : substitution.substituteType(calleeType.withoutTypeParameters);
+    _replaceType(invokeType, resultOffset);
+
     if (!isImplicitCall) {
       if (interfaceMember is ForwardingStub) {
         interfaceMember = ForwardingStub.getInterfaceTarget(interfaceMember);
       }
       _replaceReference(interfaceMember);
-      FunctionType invokeType = substitution == null
-          ? calleeType
-          : substitution.substituteType(calleeType.withoutTypeParameters);
-      _replaceType(invokeType);
+      _replaceType(calleeType);
     }
     super.genericExpressionExit("methodInvocation", expression, inferredType);
   }
 
   @override
-  void methodInvocationExitCall(Expression expression, Arguments arguments,
-      bool isImplicitCall, DartType inferredType) {
+  void methodInvocationExitCall(
+      Expression expression,
+      Arguments arguments,
+      bool isImplicitCall,
+      FunctionType calleeType,
+      Substitution substitution,
+      DartType inferredType) {
     int resultOffset = arguments.fileOffset != -1
         ? arguments.fileOffset
         : expression.fileOffset;
     _replaceType(inferredType, resultOffset);
     _replaceType(new TypeArgumentsDartType(arguments.types), resultOffset);
+
+    FunctionType invokeType = substitution == null
+        ? calleeType
+        : substitution.substituteType(calleeType.withoutTypeParameters);
+    _replaceType(invokeType, resultOffset);
+
     if (!isImplicitCall) {
       throw new UnimplementedError(); // TODO(scheglov): handle this case
     }
@@ -522,10 +513,7 @@
       Expression write,
       DartType typeContext) {
     // if there was an import prefix, record it.
-    if (prefixName != null) {
-      _recordReference(new ImportPrefixNode(prefixName), UNKNOWN_OFFSET);
-      _recordType(const NullType(), UNKNOWN_OFFSET);
-    }
+    _recordImportPrefix(prefixName);
     // If the static target is explicit (and is a class), record it.
     if (targetClass != null) {
       _recordReference(targetClass, targetOffset);
@@ -557,10 +545,7 @@
   bool staticGetEnter(StaticGet expression, String prefixName, int targetOffset,
       Class targetClass, DartType typeContext) {
     // if there was an import prefix, record it.
-    if (prefixName != null) {
-      _recordReference(new ImportPrefixNode(prefixName), UNKNOWN_OFFSET);
-      _recordType(const NullType(), UNKNOWN_OFFSET);
-    }
+    _recordImportPrefix(prefixName);
     // If the static target is explicit (and is a class), record it.
     if (targetClass != null) {
       _recordReference(targetClass, targetOffset);
@@ -581,10 +566,7 @@
   bool staticInvocationEnter(StaticInvocation expression, String prefixName,
       int targetOffset, Class targetClass, DartType typeContext) {
     // if there was an import prefix, record it.
-    if (prefixName != null) {
-      _recordReference(new ImportPrefixNode(prefixName), UNKNOWN_OFFSET);
-      _recordType(const NullType(), UNKNOWN_OFFSET);
-    }
+    _recordImportPrefix(prefixName);
     // If the static target is explicit (and is a class), record it.
     if (targetClass != null) {
       _recordReference(targetClass, targetOffset);
@@ -605,9 +587,10 @@
     //
     // So we add a `null` to our list of types; we'll update it with the actual
     // type later.
-    _deferType(expression.fileOffset);
-    _deferType(expression.arguments.fileOffset);
-    _deferType(expression.arguments.fileOffset);
+    _deferType(expression.fileOffset); // callee type
+    _deferType(expression.arguments.fileOffset); // invoke type
+    _deferType(expression.arguments.fileOffset); // type arguments
+    _deferType(expression.arguments.fileOffset); // result type
     return super.staticInvocationEnter(
         expression, prefixName, targetOffset, targetClass, typeContext);
   }
@@ -625,6 +608,7 @@
         ? calleeType
         : substitution.substituteType(calleeType.withoutTypeParameters);
     _replaceType(invokeType);
+    _replaceType(calleeType);
     super.genericExpressionExit("staticInvocation", expression, inferredType);
   }
 
@@ -641,10 +625,7 @@
   bool typeLiteralEnter(@override TypeLiteral expression, String prefixName,
       DartType typeContext) {
     // if there was an import prefix, record it.
-    if (prefixName != null) {
-      _recordReference(new ImportPrefixNode(prefixName), UNKNOWN_OFFSET);
-      _recordType(const NullType(), UNKNOWN_OFFSET);
-    }
+    _recordImportPrefix(prefixName);
     return super.typeLiteralEnter(expression, prefixName, typeContext);
   }
 
@@ -707,14 +688,7 @@
       return;
     }
     _recordReference(variable, expression.fileOffset);
-
-    TreeNode function = variable.parent;
-    if (function is FunctionDeclaration) {
-      _recordType(new FunctionReferenceDartType(function, inferredType),
-          expression.fileOffset);
-    } else {
-      _recordType(inferredType, expression.fileOffset);
-    }
+    _recordType(inferredType, expression.fileOffset);
   }
 
   /// Record `null` as the reference at the given [offset], and put the current
@@ -735,6 +709,14 @@
     _declarations.add(declaration);
   }
 
+  /// If the [prefixName] is not `null` record the reference to it.
+  void _recordImportPrefix(String prefixName) {
+    if (prefixName != null) {
+      _recordReference(new ImportPrefixNode(prefixName), UNKNOWN_OFFSET);
+      _recordType(const NullType(), UNKNOWN_OFFSET);
+    }
+  }
+
   int _recordReference(Node target, int offset) {
     int slot = _references.length;
     _references.add(target);
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index dc46ac2..6dee157 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -36,6 +36,11 @@
   CompilationUnitElementImpl _enclosingUnit;
 
   /**
+   * The library element containing the compilation unit.
+   */
+  LibraryElement _enclosingLibrary;
+
+  /**
    * The type provider used to access the known types.
    */
   TypeProvider _typeProvider;
@@ -57,6 +62,7 @@
    * if the element model and compilation unit do not match each other.
    */
   void resolve(CompilationUnit unit, CompilationUnitElement element) {
+    _enclosingLibrary = element.enclosingElement;
     _enclosingUnit = element;
     _typeProvider = _enclosingUnit.context?.typeProvider;
     _walker = new ElementWalker.forCompilationUnit(element);
@@ -107,8 +113,7 @@
     if (_applyKernelTypes) {
       node.name.staticType = _typeProvider.typeType;
       if (node.extendsClause != null) {
-        ResolutionApplier.applyToTypeAnnotation(
-            element.supertype, node.extendsClause.superclass);
+        _applyType(element.supertype, node.extendsClause.superclass);
       }
       if (node.withClause != null) {
         _applyTypeList(node.withClause.mixinTypes, element.mixins);
@@ -129,8 +134,7 @@
     ClassElement element = _match(node.name, _walker.getClass());
     if (_applyKernelTypes) {
       node.name.staticType = _typeProvider.typeType;
-      ResolutionApplier.applyToTypeAnnotation(
-          element.supertype, node.superclass);
+      _applyType(element.supertype, node.superclass);
       if (node.withClause != null) {
         _applyTypeList(node.withClause.mixinTypes, element.mixins);
       }
@@ -177,8 +181,7 @@
       normalParameter.element = element;
       if (_applyKernelTypes) {
         if (normalParameter.type != null) {
-          ResolutionApplier.applyToTypeAnnotation(
-              element.type, normalParameter.type);
+          _applyType(element.type, normalParameter.type);
         }
         node.identifier?.staticType = element.type;
       }
@@ -265,8 +268,7 @@
     FieldElement firstFieldElement = node.fields.variables[0].element;
     if (_applyKernelTypes) {
       if (node.fields.type != null) {
-        ResolutionApplier.applyToTypeAnnotation(
-            firstFieldElement.type, node.fields.type);
+        _applyType(firstFieldElement.type, node.fields.type);
       }
     }
     _resolveMetadata(node, node.metadata, firstFieldElement);
@@ -293,7 +295,8 @@
   @override
   Object visitFormalParameterList(FormalParameterList node) {
     if (_applyKernelTypes) {
-      ResolutionApplier.applyParameters(_walker._parameters, node);
+      ResolutionApplier.applyParameters(
+          _enclosingLibrary, _walker._parameters, node);
       _walker.consumeParameters();
       return null;
     } else {
@@ -321,8 +324,7 @@
     }
     if (_applyKernelTypes) {
       if (node.returnType != null) {
-        ResolutionApplier.applyToTypeAnnotation(
-            element.returnType, node.returnType);
+        _applyType(element.returnType, node.returnType);
       }
       if (node.isGetter) {
         node.name.staticType = element.returnType;
@@ -357,8 +359,7 @@
     FunctionTypeAliasElement element = _match(node.name, _walker.getTypedef());
     if (_applyKernelTypes) {
       if (node.returnType != null) {
-        ResolutionApplier.applyToTypeAnnotation(
-            element.returnType, node.returnType);
+        _applyType(element.returnType, node.returnType);
       }
     }
     _walk(new ElementWalker.forTypedef(element), () {
@@ -392,6 +393,11 @@
       if (type != null) {
         Element element = type.element;
         if (element is GenericFunctionTypeElement) {
+          if (_applyKernelTypes) {
+            if (node.returnType != null) {
+              _applyType(element.returnType, node.returnType);
+            }
+          }
           _setGenericFunctionType(node.returnType, element.returnType);
           _walk(new ElementWalker.forGenericFunctionType(element), () {
             super.visitGenericFunctionType(node);
@@ -476,8 +482,7 @@
     }
     if (_applyKernelTypes) {
       if (node.returnType != null) {
-        ResolutionApplier.applyToTypeAnnotation(
-            element.returnType, node.returnType);
+        _applyType(element.returnType, node.returnType);
       }
       if (node.isGetter) {
         node.name.staticType = element.returnType;
@@ -526,7 +531,7 @@
       (node as SimpleFormalParameterImpl).element = element;
       if (_applyKernelTypes) {
         if (node.type != null) {
-          ResolutionApplier.applyToTypeAnnotation(element.type, node.type);
+          _applyType(element.type, node.type);
         }
         node.identifier?.staticType = element.type;
       }
@@ -560,7 +565,7 @@
     if (_applyKernelTypes) {
       TypeAnnotation type = node.variables.type;
       if (type != null) {
-        ResolutionApplier.applyToTypeAnnotation(firstElement.type, type);
+        _applyType(firstElement.type, type);
       }
     }
     _resolveMetadata(node, node.metadata, firstElement);
@@ -582,7 +587,7 @@
         _match(node.name, _walker.getTypeParameter());
     if (_applyKernelTypes) {
       if (node.bound != null) {
-        ResolutionApplier.applyToTypeAnnotation(element.bound, node.bound);
+        _applyType(element.bound, node.bound);
       }
     }
     super.visitTypeParameter(node);
@@ -627,6 +632,25 @@
     }
   }
 
+  /// Apply [type] to the [typeAnnotation].
+  void _applyType(DartType type, TypeAnnotation typeAnnotation) {
+    ResolutionApplier.applyToTypeAnnotation(
+        _enclosingLibrary, type, typeAnnotation);
+  }
+
+  /**
+   * Apply [types] to [nodes].
+   * Both lists must have the same length.
+   */
+  void _applyTypeList(List<TypeName> nodes, List<InterfaceType> types) {
+    if (nodes.length != types.length) {
+      throw new StateError('$nodes != $types');
+    }
+    for (int i = 0; i < nodes.length; i++) {
+      _applyType(types[i], nodes[i]);
+    }
+  }
+
   /// TODO(scheglov) Replace with the implementation from ResolutionApplier.
   void _applyTypeToIdentifier(Identifier identifier, DartType type) {
     if (type is InterfaceType) {
@@ -744,19 +768,6 @@
     _walker = outerWalker;
   }
 
-  /**
-   * Apply [types] to [nodes].
-   * Both lists must have the same length.
-   */
-  static void _applyTypeList(List<TypeName> nodes, List<InterfaceType> types) {
-    if (nodes.length != types.length) {
-      throw new StateError('$nodes != $types');
-    }
-    for (int i = 0; i < nodes.length; i++) {
-      ResolutionApplier.applyToTypeAnnotation(types[i], nodes[i]);
-    }
-  }
-
   static bool _isBodyToCreateElementsFor(FunctionBody node) {
     AstNode parent = node.parent;
     return parent is ConstructorDeclaration ||
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index ae5a2b3..b28b557 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -3270,7 +3270,7 @@
     if (type.element.isAbstract) {
       ConstructorElement element = expression.staticElement;
       if (element != null && !element.isFactory) {
-        if (expression.keyword.keyword == Keyword.CONST) {
+        if (expression.isConst) {
           _errorReporter.reportErrorForNode(
               StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName);
         } else {
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index f4c4590..d03c13e 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -541,7 +541,9 @@
    */
   bool isInitializedVariableDeclaration() {
     Keyword keyword = _currentToken.keyword;
-    if (keyword == Keyword.FINAL || keyword == Keyword.VAR) {
+    if (keyword == Keyword.FINAL ||
+        keyword == Keyword.VAR ||
+        keyword == Keyword.VOID) {
       // An expression cannot start with a keyword other than 'const',
       // 'rethrow', or 'throw'.
       return true;
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 770a02e..6bfaf4d 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -448,24 +448,22 @@
         !_currentLibrary.context.analysisOptions.enableSuperMixins) {
       Element element = name.staticElement;
       if (element is ExecutableElement && element.isAbstract) {
-        if (!_enclosingClass.hasNoSuchMethod) {
-          ExecutableElement concrete = null;
-          if (element.kind == ElementKind.METHOD) {
-            concrete = _enclosingClass.lookUpInheritedConcreteMethod(
-                element.displayName, _currentLibrary);
-          } else if (element.kind == ElementKind.GETTER) {
-            concrete = _enclosingClass.lookUpInheritedConcreteGetter(
-                element.displayName, _currentLibrary);
-          } else if (element.kind == ElementKind.SETTER) {
-            concrete = _enclosingClass.lookUpInheritedConcreteSetter(
-                element.displayName, _currentLibrary);
-          }
-          if (concrete == null) {
-            _errorReporter.reportTypeErrorForNode(
-                HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
-                name,
-                [element.kind.displayName, name.name]);
-          }
+        ExecutableElement concrete = null;
+        if (element.kind == ElementKind.METHOD) {
+          concrete = _enclosingClass.lookUpInheritedConcreteMethod(
+              element.displayName, _currentLibrary);
+        } else if (element.kind == ElementKind.GETTER) {
+          concrete = _enclosingClass.lookUpInheritedConcreteGetter(
+              element.displayName, _currentLibrary);
+        } else if (element.kind == ElementKind.SETTER) {
+          concrete = _enclosingClass.lookUpInheritedConcreteSetter(
+              element.displayName, _currentLibrary);
+        }
+        if (concrete == null) {
+          _errorReporter.reportTypeErrorForNode(
+              HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
+              name,
+              [element.kind.displayName, name.name]);
         }
       }
     }
@@ -830,81 +828,6 @@
     }
   }
 
-  /**
-   * This verifies that the passed left hand side and right hand side represent a valid assignment.
-   *
-   * This method corresponds to ErrorVerifier.checkForInvalidAssignment.
-   *
-   * @param lhs the left hand side expression
-   * @param rhs the right hand side expression
-   * @return `true` if and only if an error code is generated on the passed node
-   * See [HintCode.INVALID_ASSIGNMENT].
-   */
-  bool _checkForInvalidAssignment(Expression lhs, Expression rhs) {
-    if (lhs == null || rhs == null) {
-      return false;
-    }
-    VariableElement leftVariableElement = ErrorVerifier.getVariableElement(lhs);
-    DartType leftType = (leftVariableElement == null)
-        ? ErrorVerifier.getStaticType(lhs)
-        : leftVariableElement.type;
-    DartType staticRightType = ErrorVerifier.getStaticType(rhs);
-    if (!_typeSystem.isAssignableTo(staticRightType, leftType,
-        isDeclarationCast: true)) {
-      // The warning was generated on this rhs
-      return false;
-    }
-    // Test for, and then generate the hint
-    DartType bestRightType = rhs.bestType;
-    if (leftType != null && bestRightType != null) {
-      if (!_typeSystem.isAssignableTo(bestRightType, leftType,
-          isDeclarationCast: true)) {
-        _errorReporter.reportTypeErrorForNode(
-            HintCode.INVALID_ASSIGNMENT, rhs, [bestRightType, leftType]);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  void _checkForInvalidFactory(MethodDeclaration decl) {
-    // Check declaration.
-    // Note that null return types are expected to be flagged by other analyses.
-    DartType returnType = decl.returnType?.type;
-    if (returnType is VoidType) {
-      _errorReporter.reportErrorForNode(HintCode.INVALID_FACTORY_METHOD_DECL,
-          decl.name, [decl.name.toString()]);
-      return;
-    }
-
-    // Check implementation.
-
-    FunctionBody body = decl.body;
-    if (body is EmptyFunctionBody) {
-      // Abstract methods are OK.
-      return;
-    }
-
-    // `new Foo()` or `null`.
-    bool factoryExpression(Expression expression) =>
-        expression is InstanceCreationExpression || expression is NullLiteral;
-
-    if (body is ExpressionFunctionBody && factoryExpression(body.expression)) {
-      return;
-    } else if (body is BlockFunctionBody) {
-      NodeList<Statement> statements = body.block.statements;
-      if (statements.isNotEmpty) {
-        Statement last = statements.last;
-        if (last is ReturnStatement && factoryExpression(last.expression)) {
-          return;
-        }
-      }
-    }
-
-    _errorReporter.reportErrorForNode(HintCode.INVALID_FACTORY_METHOD_IMPL,
-        decl.name, [decl.name.toString()]);
-  }
-
   /// Produces a hint if [identifier] is accessed from an invalid location. In
   /// particular:
   ///
@@ -991,6 +914,81 @@
   }
 
   /**
+   * This verifies that the passed left hand side and right hand side represent a valid assignment.
+   *
+   * This method corresponds to ErrorVerifier.checkForInvalidAssignment.
+   *
+   * @param lhs the left hand side expression
+   * @param rhs the right hand side expression
+   * @return `true` if and only if an error code is generated on the passed node
+   * See [HintCode.INVALID_ASSIGNMENT].
+   */
+  bool _checkForInvalidAssignment(Expression lhs, Expression rhs) {
+    if (lhs == null || rhs == null) {
+      return false;
+    }
+    VariableElement leftVariableElement = ErrorVerifier.getVariableElement(lhs);
+    DartType leftType = (leftVariableElement == null)
+        ? ErrorVerifier.getStaticType(lhs)
+        : leftVariableElement.type;
+    DartType staticRightType = ErrorVerifier.getStaticType(rhs);
+    if (!_typeSystem.isAssignableTo(staticRightType, leftType,
+        isDeclarationCast: true)) {
+      // The warning was generated on this rhs
+      return false;
+    }
+    // Test for, and then generate the hint
+    DartType bestRightType = rhs.bestType;
+    if (leftType != null && bestRightType != null) {
+      if (!_typeSystem.isAssignableTo(bestRightType, leftType,
+          isDeclarationCast: true)) {
+        _errorReporter.reportTypeErrorForNode(
+            HintCode.INVALID_ASSIGNMENT, rhs, [bestRightType, leftType]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  void _checkForInvalidFactory(MethodDeclaration decl) {
+    // Check declaration.
+    // Note that null return types are expected to be flagged by other analyses.
+    DartType returnType = decl.returnType?.type;
+    if (returnType is VoidType) {
+      _errorReporter.reportErrorForNode(HintCode.INVALID_FACTORY_METHOD_DECL,
+          decl.name, [decl.name.toString()]);
+      return;
+    }
+
+    // Check implementation.
+
+    FunctionBody body = decl.body;
+    if (body is EmptyFunctionBody) {
+      // Abstract methods are OK.
+      return;
+    }
+
+    // `new Foo()` or `null`.
+    bool factoryExpression(Expression expression) =>
+        expression is InstanceCreationExpression || expression is NullLiteral;
+
+    if (body is ExpressionFunctionBody && factoryExpression(body.expression)) {
+      return;
+    } else if (body is BlockFunctionBody) {
+      NodeList<Statement> statements = body.block.statements;
+      if (statements.isNotEmpty) {
+        Statement last = statements.last;
+        if (last is ReturnStatement && factoryExpression(last.expression)) {
+          return;
+        }
+      }
+    }
+
+    _errorReporter.reportErrorForNode(HintCode.INVALID_FACTORY_METHOD_IMPL,
+        decl.name, [decl.name.toString()]);
+  }
+
+  /**
    * Check that the imported library does not define a loadLibrary function. The import has already
    * been determined to be deferred when this is called.
    *
diff --git a/pkg/analyzer/lib/src/kernel/ast_from_analyzer.dart b/pkg/analyzer/lib/src/kernel/ast_from_analyzer.dart
index 648db17..9582f50 100644
--- a/pkg/analyzer/lib/src/kernel/ast_from_analyzer.dart
+++ b/pkg/analyzer/lib/src/kernel/ast_from_analyzer.dart
@@ -821,17 +821,17 @@
     if (annotation.arguments == null) {
       var target = resolveConcreteGet(element, null);
       return target == null
-          ? new ast.InvalidExpression()
+          ? new ast.InvalidExpression(null)
           : new ast.StaticGet(target);
     } else if (element is ConstructorElement && element.isConst) {
       var target = resolveConstructor(element);
       return target == null
-          ? new ast.InvalidExpression()
+          ? new ast.InvalidExpression(null)
           : new ast.ConstructorInvocation(
               target, _expressionBuilder.buildArguments(annotation.arguments),
               isConst: true);
     } else {
-      return new ast.InvalidExpression();
+      return new ast.InvalidExpression(null);
     }
   }
 
@@ -2440,6 +2440,12 @@
   }
 }
 
+/// A utility to build a function with a static error in its body.
+ast.FunctionNode _brokenFunction() {
+  return new ast.FunctionNode(
+      new ast.ExpressionStatement(new ast.InvalidExpression(null)));
+}
+
 /// Brings a class from hierarchy level to body level.
 //
 // TODO(asgerf): Error recovery during class construction is currently handled
@@ -2474,9 +2480,8 @@
   void buildBrokenClass() {
     currentClass.name = element.name;
     currentClass.supertype = scope.getRootClassReference().asRawSupertype;
-    currentClass.constructors.add(
-        new ast.Constructor(new ast.FunctionNode(new ast.InvalidStatement()))
-          ..fileOffset = element.nameOffset);
+    currentClass.constructors.add(new ast.Constructor(_brokenFunction())
+      ..fileOffset = element.nameOffset);
   }
 
   void addAnnotations(List<Annotation> annotations) {
@@ -2747,11 +2752,9 @@
     var member = currentMember;
     member.name = new ast.Name(element.name, scope.currentLibrary);
     if (member is ast.Procedure) {
-      member.function = new ast.FunctionNode(new ast.InvalidStatement())
-        ..parent = member;
+      member.function = _brokenFunction()..parent = member;
     } else if (member is ast.Constructor) {
-      member.function = new ast.FunctionNode(new ast.InvalidStatement())
-        ..parent = member;
+      member.function = _brokenFunction()..parent = member;
     }
   }
 
@@ -2896,7 +2899,7 @@
         assert(target != null);
         expression = new ast.Let(
             new ast.VariableDeclaration.forValue(new ast.StaticGet(target)),
-            new ast.InvalidExpression());
+            new ast.InvalidExpression(null));
         ast.Name constructors =
             new ast.Name("_redirecting#", scope.currentLibrary);
         ast.Field constructorsField;
diff --git a/pkg/analyzer/lib/src/kernel/resynthesize.dart b/pkg/analyzer/lib/src/kernel/resynthesize.dart
index 0b13b05..435f026 100644
--- a/pkg/analyzer/lib/src/kernel/resynthesize.dart
+++ b/pkg/analyzer/lib/src/kernel/resynthesize.dart
@@ -331,7 +331,9 @@
         getElementFromCanonicalName(typedef.canonicalName);
     GenericFunctionTypeElementImpl functionElement = typedefElement.function;
 
-    var kernelTypeParameters = typedef.typeParameters;
+    kernel.FunctionType typedefType = typedef.type;
+    var kernelTypeParameters = typedef.typeParameters.toList();
+    kernelTypeParameters.addAll(typedefType.typeParameters);
 
     // If no type parameters, the raw type of the element will do.
     FunctionTypeImpl rawType = functionElement.type;
@@ -340,11 +342,12 @@
     }
 
     // Compute type arguments for kernel type parameters.
-    var kernelMap = kernel.unifyTypes(
-        typedef.type, kernelType, kernelTypeParameters.toSet());
+    var kernelMap = kernel.unifyTypes(typedefType.withoutTypeParameters,
+        kernelType.withoutTypeParameters, kernelTypeParameters.toSet());
 
     // Prepare Analyzer type parameters, in the same order as kernel ones.
-    var astTypeParameters = typedefElement.typeParameters;
+    var astTypeParameters = typedefElement.typeParameters.toList();
+    astTypeParameters.addAll(functionElement.typeParameters);
 
     // Convert kernel type arguments into Analyzer types.
     int length = astTypeParameters.length;
@@ -353,11 +356,15 @@
     for (var i = 0; i < length; i++) {
       var kernelParameter = kernelTypeParameters[i];
       var kernelArgument = kernelMap[kernelParameter];
-      if (kernelArgument != null) {
-        DartType astArgument = getType(context, kernelArgument);
-        usedTypeParameters.add(astTypeParameters[i]);
-        usedTypeArguments.add(astArgument);
+      if (kernelArgument == null ||
+          kernelArgument is kernel.TypeParameterType &&
+              kernelArgument.parameter.parent == null) {
+        continue;
       }
+      TypeParameterElement astParameter = astTypeParameters[i];
+      DartType astArgument = getType(context, kernelArgument);
+      usedTypeParameters.add(astParameter);
+      usedTypeArguments.add(astArgument);
     }
 
     if (usedTypeParameters.isEmpty) {
@@ -500,7 +507,10 @@
       return invocation;
     }
 
-    // TODO(scheglov) Support other kernel initializer types.
+    if (k is kernel.ShadowInvalidInitializer) {
+      return null;
+    }
+
     throw new UnimplementedError('For ${k.runtimeType}');
   }
 
@@ -561,14 +571,14 @@
     // Invalid annotations are represented as Let.
     if (expr is kernel.Let) {
       kernel.Let let = expr;
-      if (_isConstantExpressionErrorThrow(let.variable.initializer) ||
-          _isConstantExpressionErrorThrow(let.body)) {
+      if (_isStaticError(let.variable.initializer) ||
+          _isStaticError(let.body)) {
         throw const _CompilationErrorFound();
       }
     }
 
     // Stop if there is an error.
-    if (_isConstantExpressionErrorThrow(expr)) {
+    if (_isStaticError(expr)) {
       throw const _CompilationErrorFound();
     }
 
@@ -741,21 +751,14 @@
   }
 
   TypeAnnotation _buildType(DartType type) {
-    if (type is InterfaceType) {
-      var name = AstTestFactory.identifier3(type.element.name)
-        ..staticElement = type.element
-        ..staticType = type;
-      List<TypeAnnotation> arguments = _buildTypeArguments(type.typeArguments);
-      return AstTestFactory.typeName3(name, arguments)..type = type;
+    List<TypeAnnotation> argumentNodes;
+    if (type is ParameterizedType) {
+      argumentNodes = _buildTypeArguments(type.typeArguments);
     }
-    if (type is DynamicTypeImpl || type is TypeParameterType) {
-      var identifier = AstTestFactory.identifier3(type.name)
-        ..staticElement = type.element
-        ..staticType = type;
-      return AstTestFactory.typeName3(identifier)..type = type;
-    }
-    // TODO(scheglov) Implement for other types.
-    throw new UnimplementedError('type: (${type.runtimeType}) $type');
+    TypeName node = AstTestFactory.typeName4(type.name, argumentNodes);
+    node.type = type;
+    (node.name as SimpleIdentifier).staticElement = type.element;
+    return node;
   }
 
   TypeArgumentList _buildTypeArgumentList(List<kernel.DartType> kernels) {
@@ -834,18 +837,8 @@
    * Return `true` if the given [expr] throws an instance of
    * `_ConstantExpressionError` defined in `dart:core`.
    */
-  static bool _isConstantExpressionErrorThrow(kernel.Expression expr) {
-    if (expr is kernel.MethodInvocation) {
-      if (expr.name.name == '_throw') {
-        var receiver = expr.receiver;
-        if (receiver is kernel.ConstructorInvocation) {
-          kernel.Class targetClass = receiver.target.enclosingClass;
-          return targetClass.name == '_ConstantExpressionError' &&
-              targetClass.enclosingLibrary.importUri.toString() == 'dart:core';
-        }
-      }
-    }
-    return false;
+  static bool _isStaticError(kernel.Expression expr) {
+    return expr is kernel.InvalidExpression;
   }
 }
 
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
index 3753998..414933d 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
@@ -131,14 +131,18 @@
           if (entryValue is YamlScalar) {
             Object entry = entryValue.value;
             if (entry is String) {
-              String normalizedEntry = context.joinAll(path.posix.split(entry));
-              String assetPath = context.join(packageRoot, normalizedEntry);
-              if (!provider.getFile(assetPath).exists) {
-                _reportErrorForNode(
-                    reporter,
-                    entryValue,
-                    PubspecWarningCode.ASSET_DOES_NOT_EXIST,
-                    [entryValue.value]);
+              if (!entry.startsWith('packages/')) {
+                // TODO(brianwilkerson) Add validation of package references.
+                String normalizedEntry =
+                    context.joinAll(path.posix.split(entry));
+                String assetPath = context.join(packageRoot, normalizedEntry);
+                if (!provider.getFile(assetPath).exists) {
+                  _reportErrorForNode(
+                      reporter,
+                      entryValue,
+                      PubspecWarningCode.ASSET_DOES_NOT_EXIST,
+                      [entryValue.value]);
+                }
               }
             } else {
               _reportErrorForNode(
diff --git a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
index a85b628..051b47d 100644
--- a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
+++ b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
@@ -11,7 +11,7 @@
  * path and convert it as appropriate for the actual platform.
  */
 class ResourceProviderMixin {
-  final MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
+  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
 
   void deleteFile(String path) {
     String convertedPath = resourceProvider.convertPath(path);
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
index 5fcef73..0d6afa0 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
@@ -75,13 +75,6 @@
 
   @override
   @failingTest
-  test_async_used_as_identifier_in_prefix() async {
-    // 'package:analyzer/src/fasta/resolution_applier.dart': Failed assertion: line 632 pos 14: 'constructorName.name == null': is not true.
-    await super.test_async_used_as_identifier_in_prefix();
-  }
-
-  @override
-  @failingTest
   test_async_used_as_identifier_in_statement_label() async {
     // Bad state: Expected element reference for analyzer offset 14; got one for kernel offset 21
     await super.test_async_used_as_identifier_in_statement_label();
@@ -3334,20 +3327,6 @@
   @override
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31096')
-  test_wrongNumberOfParametersForSetter_function_named() async {
-    return super.test_wrongNumberOfParametersForSetter_function_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/31096')
-  test_wrongNumberOfParametersForSetter_function_optional() async {
-    return super.test_wrongNumberOfParametersForSetter_function_optional();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/31096')
   test_wrongNumberOfParametersForSetter_function_tooFew() async {
     return super.test_wrongNumberOfParametersForSetter_function_tooFew();
   }
@@ -3362,20 +3341,6 @@
   @override
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31096')
-  test_wrongNumberOfParametersForSetter_method_named() async {
-    return super.test_wrongNumberOfParametersForSetter_method_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/31096')
-  test_wrongNumberOfParametersForSetter_method_optional() async {
-    return super.test_wrongNumberOfParametersForSetter_method_optional();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/31096')
   test_wrongNumberOfParametersForSetter_method_tooFew() async {
     return super.test_wrongNumberOfParametersForSetter_method_tooFew();
   }
diff --git a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
index eefd86c..3e7843c 100644
--- a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
+++ b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
@@ -51,20 +51,6 @@
 
   @override
   @failingTest
-  test_ignore_second() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_ignore_second();
-  }
-
-  @override
-  @failingTest
-  test_ignore_second_trailing() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_ignore_second_trailing();
-  }
-
-  @override
-  @failingTest
   test_invalid_error_code() async {
     // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0;
     //          1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
@@ -80,20 +66,6 @@
 
   @override
   @failingTest
-  test_missing_metadata_suffix() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_missing_metadata_suffix();
-  }
-
-  @override
-  @failingTest
-  test_multiple_comments() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_multiple_comments();
-  }
-
-  @override
-  @failingTest
   test_multiple_ignores() async {
     // UnimplementedError: kernel: (Let) let final dynamic #t2 = #lib2::x in let ...
     await super.test_multiple_ignores();
@@ -134,11 +106,4 @@
     //          1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
     await super.test_no_ignores();
   }
-
-  @override
-  @failingTest
-  test_trailing_not_above() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_trailing_not_above();
-  }
 }
diff --git a/pkg/analyzer/test/generated/hint_code_kernel_test.dart b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
index ef9fde2..7854a5c 100644
--- a/pkg/analyzer/test/generated/hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
@@ -43,6 +43,13 @@
 
   @failingTest
   @override
+  test_abstractSuperMemberReference_superHasNoSuchMethod() async {
+    // Expected 1 errors of type HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE, found 0
+    return super.test_abstractSuperMemberReference_superHasNoSuchMethod();
+  }
+
+  @failingTest
+  @override
   test_argumentTypeNotAssignable_functionType() async {
     // Expected 1 errors of type HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
     return super.test_argumentTypeNotAssignable_functionType();
@@ -92,6 +99,13 @@
 
   @failingTest
   @override
+  test_deprecatedAnnotationUse_call() async {
+    // Expected 1 errors of type HintCode.DEPRECATED_MEMBER_USE, found 0
+    return super.test_deprecatedAnnotationUse_call();
+  }
+
+  @failingTest
+  @override
   test_deprecatedAnnotationUse_Deprecated() async {
     // Expected 1 errors of type HintCode.DEPRECATED_MEMBER_USE, found 0
     return super.test_deprecatedAnnotationUse_Deprecated();
@@ -157,13 +171,6 @@
 
   @failingTest
   @override
-  test_duplicateImport3() async {
-    // Expected 0 errors of type HintCode.UNUSED_IMPORT, found 2 (18, 57)
-    return super.test_duplicateImport3();
-  }
-
-  @failingTest
-  @override
   test_invalidAssignment_instanceVariable() async {
     // Expected 1 errors of type HintCode.INVALID_ASSIGNMENT, found 0
     return super.test_invalidAssignment_instanceVariable();
@@ -430,15 +437,6 @@
 
   @failingTest
   @override
-  test_unusedImport_as() async {
-    // Failed to resolve 2 nodes:
-    //   one (/test.dart : 53)
-    //   one (/test.dart : 58)
-    return super.test_unusedImport_as();
-  }
-
-  @failingTest
-  @override
   test_unusedImport_inComment_libraryDirective() async {
     // Expected 0 errors of type HintCode.UNUSED_IMPORT, found 1 (42)
     return super.test_unusedImport_inComment_libraryDirective();
diff --git a/pkg/analyzer/test/generated/hint_code_test.dart b/pkg/analyzer/test/generated/hint_code_test.dart
index 9a12693..a767ae0 100644
--- a/pkg/analyzer/test/generated/hint_code_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_test.dart
@@ -145,6 +145,22 @@
     verify([source]);
   }
 
+  test_abstractSuperMemberReference_superHasNoSuchMethod() async {
+    Source source = addSource('''
+abstract class A {
+  int m();
+  noSuchMethod(_) => 42;
+}
+
+class B extends A {
+  int m() => super.m();
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
+    verify([source]);
+  }
+
   test_argumentTypeNotAssignable_functionType() async {
     Source source = addSource(r'''
 m() {
@@ -506,6 +522,68 @@
     verify([source]);
   }
 
+  test_deadCode_statementAfterAlwaysThrowsFunction() async {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+
+@alwaysThrows
+void a() {
+  throw 'msg';
+}
+
+f() {
+  var one = 1;
+  a();
+  var two = 2;
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_deadCode_statementAfterAlwaysThrowsGetter() async {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+
+class C {
+  @alwaysThrows
+  int get a {
+    throw 'msg';
+  }
+}
+
+f() {
+  var one = 1;
+  new C().a;
+  var two = 2;
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  test_deadCode_statementAfterAlwaysThrowsMethod() async {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+
+class C {
+  @alwaysThrows
+  void a() {
+    throw 'msg';
+  }
+}
+
+f() {
+  var one = 1;
+  new C().a();
+  var two = 2;
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
   test_deadCode_statementAfterBreak_inDefaultCase() async {
     Source source = addSource(r'''
 f(v) {
@@ -723,68 +801,6 @@
     verify([source]);
   }
 
-  test_deadCode_statementAfterAlwaysThrowsFunction() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-
-@alwaysThrows
-void a() {
-  throw 'msg';
-}
-
-f() {
-  var one = 1;
-  a();
-  var two = 2;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterAlwaysThrowsMethod() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-
-class C {
-  @alwaysThrows
-  void a() {
-    throw 'msg';
-  }
-}
-
-f() {
-  var one = 1;
-  new C().a();
-  var two = 2;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  @failingTest
-  test_deadCode_statementAfterAlwaysThrowsGetter() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-
-class C {
-  @alwaysThrows
-  int get a {
-    throw 'msg';
-  }
-}
-
-f() {
-  var one = 1;
-  new C().a;
-  var two = 2;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
   test_deprecatedAnnotationUse_assignment() async {
     Source source = addSource(r'''
 class A {
@@ -1923,6 +1939,29 @@
     verify([source]);
   }
 
+  test_invalidUseOfVisibleForTestingMember_constructor() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+class A {
+  int _x;
+
+  @visibleForTesting
+  A.forTesting(this._x);
+}
+''');
+    Source source2 = addNamedSource('/lib2.dart', r'''
+import 'lib1.dart';
+
+void main() {
+  new A.forTesting(0);
+}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source2, [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
+    verify([source, source2]);
+  }
+
   test_invalidUseOfVisibleForTestingMember_method() async {
     Source source = addNamedSource('/lib1.dart', r'''
 import 'package:meta/meta.dart';
@@ -1965,28 +2004,6 @@
     verify([source, source2]);
   }
 
-  test_invalidUseProtectedAndForTesting_method_OK() async {
-    Source source = addNamedSource('/lib1.dart', r'''
-import 'package:meta/meta.dart';
-class A {
-  @protected
-  @visibleForTesting
-  void a(){ }
-}
-''');
-    Source source2 = addNamedSource('/lib2.dart', r'''
-import 'lib1.dart';
-
-class B extends A {
-  void b() => new A().a();
-}
-''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
   test_invalidUseOfVisibleForTestingMember_propertyAccess() async {
     Source source = addNamedSource('/lib1.dart', r'''
 import 'package:meta/meta.dart';
@@ -2015,29 +2032,6 @@
     verify([source, source2]);
   }
 
-  test_invalidUseOfVisibleForTestingMember_constructor() async {
-    Source source = addNamedSource('/lib1.dart', r'''
-import 'package:meta/meta.dart';
-class A {
-  int _x;
-
-  @visibleForTesting
-  A.forTesting(this._x);
-}
-''');
-    Source source2 = addNamedSource('/lib2.dart', r'''
-import 'lib1.dart';
-
-void main() {
-  new A.forTesting(0);
-}
-''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source2, [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
-    verify([source, source2]);
-  }
-
   test_invalidUseOfVisibleForTestingMember_topLevelFunction() async {
     Source source = addNamedSource('/lib1.dart', r'''
 import 'package:meta/meta.dart';
@@ -2058,6 +2052,28 @@
     verify([source, source2]);
   }
 
+  test_invalidUseProtectedAndForTesting_method_OK() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+class A {
+  @protected
+  @visibleForTesting
+  void a(){ }
+}
+''');
+    Source source2 = addNamedSource('/lib2.dart', r'''
+import 'lib1.dart';
+
+class B extends A {
+  void b() => new A().a();
+}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
   test_isDouble() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.dart2jsHint = true;
diff --git a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
index 7532ea0..54da903 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
@@ -12,6 +12,11 @@
   });
 }
 
+/// Tests marked with this annotation fail because they test features that
+/// were implemented in Analyzer, but are intentionally not included into
+/// the Dart 2.0 plan, or disabled for Dart 2.0 altogether.
+const notForDart2 = const Object();
+
 /// Tests marked with this annotations fail because we either have not triaged
 /// them, or know that this is an analyzer problem.
 const potentialAnalyzerProblem = const Object();
@@ -31,17 +36,24 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_abstractSuperMemberReference_superHasNoSuchMethod() async {
-    // super.m() is not resolved by front-end
-    return super.test_abstractSuperMemberReference_superHasNoSuchMethod();
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31625')
+  test_ambiguousImport_showCombinator() async {
+    return super.test_ambiguousImport_showCombinator();
   }
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/31625')
-  test_ambiguousImport_showCombinator() async {
-    return super.test_ambiguousImport_showCombinator();
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31758')
+  test_argumentTypeNotAssignable_classWithCall_Function() async {
+    return super.test_argumentTypeNotAssignable_classWithCall_Function();
+  }
+
+  @override
+  @failingTest
+  @notForDart2
+  test_async_return_flattens_futures() async {
+    // Only FutureOr is flattened.
+    return super.test_async_return_flattens_futures();
   }
 
   @override
@@ -130,13 +142,6 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_constDeferredClass_new() async {
-    return super.test_constDeferredClass_new();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_constructorDeclaration_scope_signature() async {
     return super.test_constructorDeclaration_scope_signature();
@@ -173,63 +178,12 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_genericTypeAlias_castsAndTypeChecks_hasTypeParameters() async {
-    return super.test_genericTypeAlias_castsAndTypeChecks_hasTypeParameters();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_genericTypeAlias_castsAndTypeChecks_noTypeParameters() async {
-    return super.test_genericTypeAlias_castsAndTypeChecks_noTypeParameters();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_genericTypeAlias_fieldAndReturnType_noTypeParameters() async {
-    return super.test_genericTypeAlias_fieldAndReturnType_noTypeParameters();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_genericTypeAlias_fieldAndReturnType_typeParameters_arguments() async {
-    return super
-        .test_genericTypeAlias_fieldAndReturnType_typeParameters_arguments();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_genericTypeAlias_fieldAndReturnType_typeParameters_noArguments() async {
-    return super
-        .test_genericTypeAlias_fieldAndReturnType_typeParameters_noArguments();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_genericTypeAlias_invalidGenericFunctionType() async {
     return super.test_genericTypeAlias_invalidGenericFunctionType();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_genericTypeAlias_noTypeParameters() async {
-    return super.test_genericTypeAlias_noTypeParameters();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_genericTypeAlias_typeParameters() async {
-    return super.test_genericTypeAlias_typeParameters();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31641')
   test_invalidAnnotation_constantVariable_field() async {
     return super.test_invalidAnnotation_constantVariable_field();
@@ -237,33 +191,37 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_invalidAnnotation_constantVariable_field_importWithPrefix() async {
-    return super
-        .test_invalidAnnotation_constantVariable_field_importWithPrefix();
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31758')
+  test_invalidAssignment_implicitlyImplementFunctionViaCall_1() async {
+    return super.test_invalidAssignment_implicitlyImplementFunctionViaCall_1();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_invalidAnnotation_constantVariable_topLevel_importWithPrefix() async {
-    return super
-        .test_invalidAnnotation_constantVariable_topLevel_importWithPrefix();
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31758')
+  test_invalidAssignment_implicitlyImplementFunctionViaCall_2() async {
+    return super.test_invalidAssignment_implicitlyImplementFunctionViaCall_2();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_invalidAnnotation_constConstructor_importWithPrefix() async {
-    return super.test_invalidAnnotation_constConstructor_importWithPrefix();
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31758')
+  test_invalidAssignment_implicitlyImplementFunctionViaCall_3() async {
+    return super.test_invalidAssignment_implicitlyImplementFunctionViaCall_3();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_invalidAnnotation_constConstructor_named_importWithPrefix() async {
-    return super
-        .test_invalidAnnotation_constConstructor_named_importWithPrefix();
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31758')
+  test_invalidAssignment_implicitlyImplementFunctionViaCall_4() async {
+    return super.test_invalidAssignment_implicitlyImplementFunctionViaCall_4();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31758')
+  test_invocationOfNonFunction_Object() async {
+    return super.test_invocationOfNonFunction_Object();
   }
 
   @override
@@ -290,8 +248,8 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_nonConstantValueInInitializer_namedArgument() async {
-    return super.test_nonConstantValueInInitializer_namedArgument();
+  test_nonBoolExpression_functionType() async {
+    return super.test_nonBoolExpression_functionType();
   }
 
   @override
@@ -310,9 +268,16 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_prefixCollidesWithTopLevelMembers() async {
-    return super.test_prefixCollidesWithTopLevelMembers();
+  @notForDart2
+  test_null_callMethod() async {
+    return super.test_null_callMethod();
+  }
+
+  @override
+  @failingTest
+  @notForDart2
+  test_null_callOperator() async {
+    return super.test_null_callOperator();
   }
 
   @override
@@ -353,7 +318,7 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_undefinedMethod_functionExpression_directCall() async {
-    return super.test_undefinedMethod_functionExpression_directCall();
+  test_forEach_genericFunctionType() async {
+    return super.test_forEach_genericFunctionType();
   }
 }
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index d95692e..cec534b 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -369,22 +369,6 @@
     verify([source]);
   }
 
-  test_abstractSuperMemberReference_superHasNoSuchMethod() async {
-    Source source = addSource('''
-abstract class A {
-  int m();
-  noSuchMethod(_) => 42;
-}
-
-class B extends A {
-  int m() => super.m();
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_abstractSuperMemberReference_superSuperHasConcrete_getter() async {
     Source source = addSource('''
 abstract class A {
@@ -1182,6 +1166,18 @@
     verify([source]);
   }
 
+  test_forEach_genericFunctionType() async {
+    Source source = addSource(r'''
+main() {
+  for (Null Function<T>(T, Null) e in []) {
+    e;
+  }
+}''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_caseBlockNotTerminated() async {
     Source source = addSource(r'''
 f(int p) {
diff --git a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
index 85e8b1c..c61a040 100644
--- a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
@@ -15,6 +15,11 @@
   });
 }
 
+/// Tests marked with this annotation fail because they test features that
+/// were implemented in Analyzer, but are intentionally not included into
+/// the Dart 2.0 plan, or disabled for Dart 2.0 altogether.
+const notForDart2 = const Object();
+
 /// Tests marked with this annotations fail because we either have not triaged
 /// them, or know that this is an analyzer problem.
 const potentialAnalyzerProblem = const Object();
@@ -35,27 +40,59 @@
   @failingTest
   @override
   @potentialAnalyzerProblem
-  test_deadCode_deadBlock_if_debugConst_propertyAccessor() async {
-    // Appears to be an issue with resolution of import prefixes.
-    await super.test_deadCode_deadBlock_if_debugConst_propertyAccessor();
-  }
-
-  @failingTest
-  @override
-  @potentialAnalyzerProblem
   test_deprecatedMemberUse_inDeprecatedLibrary() async {
     // LibraryAnalyzer is not applying resolution data to annotations on
     // directives.
     await super.test_deprecatedMemberUse_inDeprecatedLibrary();
   }
 
-  @failingTest
   @override
-  @potentialAnalyzerProblem
-  test_duplicateImport_as() async {
-    // Expected 0 errors of type HintCode.UNUSED_IMPORT, found 1 (38)
-    // Appears to be an issue with resolution of import prefixes.
-    await super.test_duplicateImport_as();
+  @failingTest
+  @notForDart2
+  test_undefinedGetter_inSubtype() async {
+    await super.test_undefinedGetter_inSubtype();
+  }
+
+  @override
+  @failingTest
+  @notForDart2
+  test_undefinedMethod_inSubtype() async {
+    await super.test_undefinedMethod_inSubtype();
+  }
+
+  @override
+  @failingTest
+  @notForDart2
+  test_undefinedOperator_binaryExpression_inSubtype() async {
+    await super.test_undefinedOperator_binaryExpression_inSubtype();
+  }
+
+  @override
+  @failingTest
+  @notForDart2
+  test_undefinedOperator_indexBoth_inSubtype() async {
+    await super.test_undefinedOperator_indexBoth_inSubtype();
+  }
+
+  @override
+  @failingTest
+  @notForDart2
+  test_undefinedOperator_indexGetter_inSubtype() async {
+    await super.test_undefinedOperator_indexGetter_inSubtype();
+  }
+
+  @override
+  @failingTest
+  @notForDart2
+  test_undefinedOperator_indexSetter_inSubtype() async {
+    await super.test_undefinedOperator_indexSetter_inSubtype();
+  }
+
+  @override
+  @failingTest
+  @notForDart2
+  test_undefinedSetter_inSubtype() async {
+    await super.test_undefinedSetter_inSubtype();
   }
 
   @override
@@ -86,13 +123,6 @@
   @failingTest
   @override
   @potentialAnalyzerProblem
-  test_unusedImport_as_equalPrefixes() async {
-    await super.test_unusedImport_as_equalPrefixes();
-  }
-
-  @failingTest
-  @override
-  @potentialAnalyzerProblem
   test_unusedImport_metadata() async {
     await super.test_unusedImport_metadata();
   }
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index 07cccf8..7a0139a 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -1117,7 +1117,7 @@
 
   @override
   void handleInvalidTopLevelDeclaration(Token endToken) {
-    expectIn('CompilationUnit');
+    end('TopLevelMember');
     listener.handleInvalidTopLevelDeclaration(endToken);
   }
 
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index eef6b16..8d6d88d 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -248,32 +248,6 @@
 
   @override
   @failingTest
-  void test_expectedExecutable_topLevel_afterType() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Expected CompilationUnit, but found [CompilationUnit, TopLevelMember]
-    //   package:test                                                       fail
-    //   test/generated/parser_fasta_listener.dart 50:7                     ForwardingTestListener.expectIn
-    //   test/generated/parser_fasta_listener.dart 1030:5                   ForwardingTestListener.endTopLevelDeclaration
-    //   package:front_end/src/fasta/parser/parser.dart 264:14              Parser.parseTopLevelDeclaration
-    //   test/generated/parser_fasta_test.dart 2815:22                      ParserProxy.parseTopLevelDeclaration
-    super.test_expectedExecutable_topLevel_afterType();
-  }
-
-  @override
-  @failingTest
-  void test_expectedExecutable_topLevel_afterVoid() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Expected CompilationUnit, but found [CompilationUnit, TopLevelMember]
-    //   package:test                                                       fail
-    //   test/generated/parser_fasta_listener.dart 50:7                     ForwardingTestListener.expectIn
-    //   test/generated/parser_fasta_listener.dart 1030:5                   ForwardingTestListener.endTopLevelDeclaration
-    //   package:front_end/src/fasta/parser/parser.dart 264:14              Parser.parseTopLevelDeclaration
-    //   test/generated/parser_fasta_test.dart 2815:22                      ParserProxy.parseTopLevelDeclaration
-    super.test_expectedExecutable_topLevel_afterVoid();
-  }
-
-  @override
-  @failingTest
   void test_expectedExecutable_topLevel_beforeType() {
     // TODO(brianwilkerson) Does not recover.
     //   Expected: true
@@ -2948,48 +2922,4 @@
     allowNativeClause = false;
     test_parseClassDeclaration_native();
   }
-
-  @override
-  void test_parseCompilationUnit_builtIn_asFunctionName_withTypeParameter() {
-    // Fasta correctly parses these, while analyzer does not.
-    super.test_parseCompilationUnit_builtIn_asFunctionName_withTypeParameter();
-  }
-
-  @override
-  @failingTest
-  void test_parseCompilationUnit_exportAsPrefix() {
-    // TODO(paulberry): As of commit 5de9108 this syntax is invalid.
-    super.test_parseCompilationUnit_exportAsPrefix();
-  }
-
-  @override
-  @failingTest
-  void test_parseCompilationUnit_exportAsPrefix_parameterized() {
-    // TODO(paulberry): As of commit 5de9108 this syntax is invalid.
-    super.test_parseCompilationUnit_exportAsPrefix_parameterized();
-  }
-
-  @override
-  @failingTest
-  void test_parseCompilationUnitMember_abstractAsPrefix() {
-    // TODO(danrubel): built-in "abstract" cannot be used as a prefix
-    super.test_parseCompilationUnitMember_abstractAsPrefix();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_abstractAsPrefix2() {
-    // TODO(danrubel): should not be generating an error
-    super.test_parseCompilationUnitMember_abstractAsPrefix();
-    assertNoErrors();
-  }
-
-  @override
-  void test_parseFunctionDeclaration_functionWithTypeParameters_comment() {
-    // Ignored: Fasta does not support the generic comment syntax.
-  }
-
-  @override
-  void test_parseFunctionDeclaration_getter_generic_comment_returnType() {
-    // Ignored: Fasta does not support the generic comment syntax.
-  }
 }
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 809fa22..9b18b50 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -2917,19 +2917,39 @@
   }
 
   void test_expectedExecutable_topLevel_afterType() {
-    createParser('heart 2 heart');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertErrors(
-        [expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 0, 5)]);
+    CompilationUnit unit = parseCompilationUnit('heart 2 heart',
+        errors: usingFastaParser
+            ? [
+                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 0, 5),
+                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 6, 1),
+                expectedError(ParserErrorCode.MISSING_IDENTIFIER, 13, 0),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 13, 0)
+              ]
+            : [
+                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 6, 1),
+                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 6, 1),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 6, 1),
+                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 8, 5)
+              ]);
+    expect(unit, isNotNull);
   }
 
   void test_expectedExecutable_topLevel_afterVoid() {
-    createParser('void 2 void');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertErrors(
-        [expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 5, 1)]);
+    CompilationUnit unit = parseCompilationUnit('void 2 void',
+        errors: usingFastaParser
+            ? [
+                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 0, 4),
+                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 5, 1),
+                expectedError(ParserErrorCode.MISSING_IDENTIFIER, 11, 0),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 11, 0)
+              ]
+            : [
+                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 6, 1),
+                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 6, 1),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 6, 1),
+                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 8, 5)
+              ]);
+    expect(unit, isNotNull);
   }
 
   void test_expectedExecutable_topLevel_beforeType() {
@@ -4140,6 +4160,29 @@
         [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 8, 1)]);
   }
 
+  void test_missingIdentifier_inParameterGroupNamed() {
+    createParser('(a, {})');
+    FormalParameterList list = parser.parseFormalParameterList();
+    expectNotNullIfNoErrors(list);
+    listener.assertErrors(
+        [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 5, 1)]);
+  }
+
+  void test_missingIdentifier_inParameterGroupOptional() {
+    createParser('(a, [])');
+    FormalParameterList list = parser.parseFormalParameterList();
+    expectNotNullIfNoErrors(list);
+    if (usingFastaParser) {
+      listener.assertErrors(
+          [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 5, 1)]);
+    } else {
+      listener.assertErrors([
+        expectedError(ParserErrorCode.MISSING_IDENTIFIER, 5, 1),
+        expectedError(ParserErrorCode.EXPECTED_TOKEN, 5, 1)
+      ]);
+    }
+  }
+
   void test_missingIdentifier_inSymbol_afterPeriod() {
     SymbolLiteral literal = parseSymbolLiteral('#a.');
     expectNotNullIfNoErrors(literal);
@@ -13861,6 +13904,22 @@
     expect(forStatement.body, isNotNull);
   }
 
+  void test_parseForStatement_each_genericFunctionType() {
+    var forStatement =
+        parseStatement('for (void Function<T>(T) element in list) {}')
+            as ForEachStatement;
+    assertNoErrors();
+    expect(forStatement.awaitKeyword, isNull);
+    expect(forStatement.forKeyword, isNotNull);
+    expect(forStatement.leftParenthesis, isNotNull);
+    expect(forStatement.loopVariable, isNotNull);
+    expect(forStatement.identifier, isNull);
+    expect(forStatement.inKeyword, isNotNull);
+    expect(forStatement.iterable, isNotNull);
+    expect(forStatement.rightParenthesis, isNotNull);
+    expect(forStatement.body, isNotNull);
+  }
+
   void test_parseForStatement_loop_c() {
     var forStatement = parseStatement('for (; i < count;) {}') as ForStatement;
     assertNoErrors();
@@ -15183,12 +15242,14 @@
     }
   }
 
-  @failingTest
   void test_parseCompilationUnit_builtIn_asFunctionName_withTypeParameter() {
-    for (Keyword keyword in Keyword.values) {
-      if (keyword.isBuiltIn) {
-        String lexeme = keyword.lexeme;
-        parseCompilationUnit('$lexeme<T>(x) => 0;');
+    // Fasta correctly parses these, while analyzer does not.
+    if (usingFastaParser) {
+      for (Keyword keyword in Keyword.values) {
+        if (keyword.isBuiltIn) {
+          String lexeme = keyword.lexeme;
+          parseCompilationUnit('$lexeme<T>(x) => 0;');
+        }
       }
     }
   }
@@ -15240,7 +15301,13 @@
     createParser('export<dynamic> _export = new export.A();');
     CompilationUnit unit = parser.parseCompilationUnit2();
     expect(unit, isNotNull);
-    assertNoErrors();
+    if (usingFastaParser) {
+      // This used to be deferred to later in the pipeline, but is now being
+      // reported by the parser.
+      assertErrorsWithCodes([CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
+    } else {
+      assertNoErrors();
+    }
     expect(unit.scriptTag, isNull);
     expect(unit.directives, hasLength(0));
     expect(unit.declarations, hasLength(1));
@@ -15300,13 +15367,7 @@
     createParser('typedef.A _typedef = new typedef.A();');
     CompilationUnit unit = parser.parseCompilationUnit2();
     expect(unit, isNotNull);
-    if (usingFastaParser) {
-      // This used to be deferred to later in the pipeline, but is now being
-      // reported by the parser.
-      assertErrorsWithCodes([CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
-    } else {
-      assertNoErrors();
-    }
+    assertNoErrors();
     expect(unit.scriptTag, isNull);
     expect(unit.directives, hasLength(0));
     expect(unit.declarations, hasLength(1));
@@ -16116,6 +16177,10 @@
   }
 
   void test_parseFunctionDeclaration_functionWithTypeParameters_comment() {
+    if (usingFastaParser) {
+      // Ignored: Fasta does not support the generic comment syntax.
+      return;
+    }
     enableGenericMethodComments = true;
     createParser('/// Doc\nT f/*<E>*/() {}');
     FunctionDeclaration declaration = parseFullCompilationUnitMember();
@@ -16153,6 +16218,10 @@
   }
 
   void test_parseFunctionDeclaration_getter_generic_comment_returnType() {
+    if (usingFastaParser) {
+      // Ignored: Fasta does not support the generic comment syntax.
+      return;
+    }
     enableGenericMethodComments = true;
     createParser('/*=T*/ f/*<S, T>*/(/*=S*/ s) => null;');
     var member = parseFullCompilationUnitMember();
diff --git a/pkg/analyzer/test/generated/resolver_kernel_test.dart b/pkg/analyzer/test/generated/resolver_kernel_test.dart
index fd664dc..ef8abbb 100644
--- a/pkg/analyzer/test/generated/resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/resolver_kernel_test.dart
@@ -9,7 +9,6 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(StrictModeTest_Kernel);
-    defineReflectiveTests(TypePropagationTest_Kernel);
   });
 }
 
@@ -77,317 +76,3 @@
     await super.test_localVar();
   }
 }
-
-@reflectiveTest
-class TypePropagationTest_Kernel extends TypePropagationTest_Driver {
-  @override
-  bool get enableKernelDriver => true;
-
-  @override
-  bool get previewDart2 => true;
-
-  @override
-  @failingTest
-  test_as() async {
-    // Expected: same instance as InterfaceTypeImpl:<A>
-    await super.test_as();
-  }
-
-  @override
-  @failingTest
-  test_assert() async {
-    // Expected: same instance as InterfaceTypeImpl:<A>
-    await super.test_assert();
-  }
-
-  @override
-  @failingTest
-  test_assignment() async {
-    // Expected: InterfaceTypeImpl:<int>
-    await super.test_assignment();
-  }
-
-  @override
-  @failingTest
-  test_assignment_afterInitializer() async {
-    // Expected: InterfaceTypeImpl:<double>
-    await super.test_assignment_afterInitializer();
-  }
-
-  @override
-  @failingTest
-  test_assignment_throwExpression() async {
-    // Bad state: Expected element reference for analyzer offset 25; got one for kernel offset 21
-    await super.test_assignment_throwExpression();
-  }
-
-  @override
-  @failingTest
-  test_CanvasElement_getContext() async {
-    // NoSuchMethodError: The getter 'name' was called on null.
-    await super.test_CanvasElement_getContext();
-  }
-
-  @override
-  @failingTest
-  test_forEach() async {
-    // Expected: InterfaceTypeImpl:<String>
-    await super.test_forEach();
-  }
-
-  @override
-  @failingTest
-  test_forEach_async() async {
-    // Expected: InterfaceTypeImpl:<String>
-    await super.test_forEach_async();
-  }
-
-  @override
-  @failingTest
-  test_forEach_async_inheritedStream() async {
-    // Expected: InterfaceTypeImpl:<List<String>>
-    await super.test_forEach_async_inheritedStream();
-  }
-
-  @override
-  @failingTest
-  test_functionExpression_asInvocationArgument() async {
-    // Expected: InterfaceTypeImpl:<int>
-    await super.test_functionExpression_asInvocationArgument();
-  }
-
-  @override
-  @failingTest
-  test_functionExpression_asInvocationArgument_fromInferredInvocation() async {
-    // Expected: InterfaceTypeImpl:<int>
-    await super
-        .test_functionExpression_asInvocationArgument_fromInferredInvocation();
-  }
-
-  @override
-  @failingTest
-  test_functionExpression_asInvocationArgument_functionExpressionInvocation() async {
-    // Bad state: Expected a type for v at 43; got one for kernel offset 32
-    await super
-        .test_functionExpression_asInvocationArgument_functionExpressionInvocation();
-  }
-
-  @override
-  @failingTest
-  test_functionExpression_asInvocationArgument_notSubtypeOfStaticType() async {
-    // Expected 1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
-    await super
-        .test_functionExpression_asInvocationArgument_notSubtypeOfStaticType();
-  }
-
-  @override
-  @failingTest
-  test_functionExpression_asInvocationArgument_replaceIfMoreSpecific() async {
-    // Expected: InterfaceTypeImpl:<String>
-    await super
-        .test_functionExpression_asInvocationArgument_replaceIfMoreSpecific();
-  }
-
-  @override
-  @failingTest
-  test_Future_then() async {
-    // Expected: InterfaceTypeImpl:<int>
-    await super.test_Future_then();
-  }
-
-  @override
-  @failingTest
-  test_initializer() async {
-    // Expected: DynamicTypeImpl:<dynamic>
-    await super.test_initializer();
-  }
-
-  @override
-  @failingTest
-  test_initializer_dereference() async {
-    // Expected: InterfaceTypeImpl:<String>
-    await super.test_initializer_dereference();
-  }
-
-  @override
-  @failingTest
-  test_is_conditional() async {
-    // Expected: same instance as InterfaceTypeImpl:<A>
-    await super.test_is_conditional();
-  }
-
-  @override
-  @failingTest
-  test_is_if() async {
-    // type 'ParenthesizedExpressionImpl' is not a subtype of type 'IsExpression' of 'isExpression' where
-    await super.test_is_if();
-  }
-
-  @override
-  @failingTest
-  test_is_if_logicalAnd() async {
-    // Expected: same instance as InterfaceTypeImpl:<A>
-    await super.test_is_if_logicalAnd();
-  }
-
-  @override
-  @failingTest
-  test_is_postConditional() async {
-    // Expected: same instance as InterfaceTypeImpl:<A>
-    await super.test_is_postConditional();
-  }
-
-  @override
-  @failingTest
-  test_is_postIf() async {
-    // Expected: same instance as InterfaceTypeImpl:<A>
-    await super.test_is_postIf();
-  }
-
-  @override
-  @failingTest
-  test_is_while() async {
-    // Expected: same instance as InterfaceTypeImpl:<A>
-    await super.test_is_while();
-  }
-
-  @override
-  @failingTest
-  test_isNot_conditional() async {
-    // Expected: same instance as InterfaceTypeImpl:<A>
-    await super.test_isNot_conditional();
-  }
-
-  @override
-  @failingTest
-  test_isNot_if() async {
-    // Expected: same instance as InterfaceTypeImpl:<A>
-    await super.test_isNot_if();
-  }
-
-  @override
-  @failingTest
-  test_isNot_if_logicalOr() async {
-    // Expected: same instance as InterfaceTypeImpl:<A>
-    await super.test_isNot_if_logicalOr();
-  }
-
-  @override
-  @failingTest
-  test_isNot_postConditional() async {
-    // Expected: same instance as InterfaceTypeImpl:<A>
-    await super.test_isNot_postConditional();
-  }
-
-  @override
-  @failingTest
-  test_isNot_postIf() async {
-    // Expected: same instance as InterfaceTypeImpl:<A>
-    await super.test_isNot_postIf();
-  }
-
-  @override
-  @failingTest
-  test_listLiteral_same() async {
-    // NoSuchMethodError: The getter 'element' was called on null.
-    await super.test_listLiteral_same();
-  }
-
-  @override
-  @failingTest
-  test_mapLiteral_different() async {
-    // NoSuchMethodError: The getter 'element' was called on null.
-    await super.test_mapLiteral_different();
-  }
-
-  @override
-  @failingTest
-  test_mapLiteral_same() async {
-    // NoSuchMethodError: The getter 'element' was called on null.
-    await super.test_mapLiteral_same();
-  }
-
-  @override
-  @failingTest
-  test_mergePropagatedTypes_afterIfThen_different() async {
-    // Expected: InterfaceTypeImpl:<String>
-    await super.test_mergePropagatedTypes_afterIfThen_different();
-  }
-
-  @override
-  @failingTest
-  test_mergePropagatedTypes_afterIfThen_same() async {
-    // Expected: InterfaceTypeImpl:<int>
-    await super.test_mergePropagatedTypes_afterIfThen_same();
-  }
-
-  @override
-  @failingTest
-  test_mergePropagatedTypes_afterIfThenElse_same() async {
-    // Expected: InterfaceTypeImpl:<int>
-    await super.test_mergePropagatedTypes_afterIfThenElse_same();
-  }
-
-  @override
-  @failingTest
-  test_mergePropagatedTypesAtJoinPoint_4() async {
-    // Expected: InterfaceTypeImpl:<int>
-    await super.test_mergePropagatedTypesAtJoinPoint_4();
-  }
-
-  @override
-  @failingTest
-  test_objectAccessInference_enabled_for_cascades() async {
-    // Expected: DynamicTypeImpl:<dynamic>
-    await super.test_objectAccessInference_enabled_for_cascades();
-  }
-
-  @override
-  @failingTest
-  test_objectMethodInference_enabled_for_cascades() async {
-    // Expected: DynamicTypeImpl:<dynamic>
-    await super.test_objectMethodInference_enabled_for_cascades();
-  }
-
-  @override
-  @failingTest
-  test_objectMethodOnDynamicExpression_doubleEquals() async {
-    // Expected: InterfaceTypeImpl:<bool>
-    await super.test_objectMethodOnDynamicExpression_doubleEquals();
-  }
-
-  @override
-  @failingTest
-  test_objectMethodOnDynamicExpression_hashCode() async {
-    // Expected: InterfaceTypeImpl:<int>
-    await super.test_objectMethodOnDynamicExpression_hashCode();
-  }
-
-  @override
-  @failingTest
-  test_objectMethodOnDynamicExpression_runtimeType() async {
-    // Expected: InterfaceTypeImpl:<Type>
-    await super.test_objectMethodOnDynamicExpression_runtimeType();
-  }
-
-  @override
-  @failingTest
-  test_objectMethodOnDynamicExpression_toString() async {
-    // Expected: InterfaceTypeImpl:<String>
-    await super.test_objectMethodOnDynamicExpression_toString();
-  }
-
-  @override
-  @failingTest
-  test_propagatedReturnType_localFunction() async {
-    // Expected: DynamicTypeImpl:<dynamic>
-    await super.test_propagatedReturnType_localFunction();
-  }
-
-  @override
-  @failingTest
-  test_query() async {
-    // NoSuchMethodError: The getter 'name' was called on null.
-    await super.test_query();
-  }
-}
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
index 5d997c0..34e8ad9 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
@@ -29,20 +29,6 @@
 
   @override
   @failingTest
-  test_FunctionExpressionInvocation_curried() async {
-    // Bad state: No reference information for f()() at 53
-    await super.test_FunctionExpressionInvocation_curried();
-  }
-
-  @override
-  @failingTest
-  test_FunctionExpressionInvocation_expression() async {
-    // Bad state: No reference information for (() => 1)() at 21
-    await super.test_FunctionExpressionInvocation_expression();
-  }
-
-  @override
-  @failingTest
   test_MethodInvocation_nameType_parameter_propagatedType() async {
     // Expected: DynamicTypeImpl:<dynamic>
     await super.test_MethodInvocation_nameType_parameter_propagatedType();
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
index 7260957..3f1eb5a 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
@@ -43,20 +43,6 @@
 
   @override
   @failingTest
-  test_await_flattened() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_await_flattened();
-  }
-
-  @override
-  @failingTest
-  test_await_simple() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_await_simple();
-  }
-
-  @override
-  @failingTest
   test_awaitForIn_declaredVariableWrongType() async {
     // Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, found 0
     await super.test_awaitForIn_declaredVariableWrongType();
@@ -78,13 +64,6 @@
 
   @override
   @failingTest
-  test_bug21912() async {
-    // Expected 2 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_bug21912();
-  }
-
-  @override
-  @failingTest
   test_expectedOneListTypeArgument() async {
     // Bad state: Found 1 argument types for 2 type arguments
     await super.test_expectedOneListTypeArgument();
@@ -275,13 +254,6 @@
 
   @override
   @failingTest
-  test_invalidAssignment_compoundAssignment() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_invalidAssignment_compoundAssignment();
-  }
-
-  @override
-  @failingTest
   test_invalidAssignment_defaultValue_named() async {
     // UnimplementedError: kernel: (Let) let final dynamic #t1 = 0 in let ...
     await super.test_invalidAssignment_defaultValue_named();
@@ -303,69 +275,6 @@
 
   @override
   @failingTest
-  test_invalidAssignment_functionExpressionInvocation() async {
-    // Bad state: No reference information for (() => 5)() at 22
-    await super.test_invalidAssignment_functionExpressionInvocation();
-  }
-
-  @override
-  @failingTest
-  test_invalidAssignment_ifNullAssignment() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_invalidAssignment_ifNullAssignment();
-  }
-
-  @override
-  @failingTest
-  test_invalidAssignment_instanceVariable() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_invalidAssignment_instanceVariable();
-  }
-
-  @override
-  @failingTest
-  test_invalidAssignment_localVariable() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_invalidAssignment_localVariable();
-  }
-
-  @override
-  @failingTest
-  test_invalidAssignment_regressionInIssue18468Fix() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_invalidAssignment_regressionInIssue18468Fix();
-  }
-
-  @override
-  @failingTest
-  test_invalidAssignment_staticVariable() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_invalidAssignment_staticVariable();
-  }
-
-  @override
-  @failingTest
-  test_invalidAssignment_topLevelVariableDeclaration() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_invalidAssignment_topLevelVariableDeclaration();
-  }
-
-  @override
-  @failingTest
-  test_invalidAssignment_typeParameter() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_invalidAssignment_typeParameter();
-  }
-
-  @override
-  @failingTest
-  test_invalidAssignment_variableDeclaration() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
-    await super.test_invalidAssignment_variableDeclaration();
-  }
-
-  @override
-  @failingTest
   test_invocationOfNonFunction_class() async {
     // Expected 1 errors of type StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, found 0
     await super.test_invocationOfNonFunction_class();
@@ -758,14 +667,6 @@
 
   @override
   @failingTest
-  test_typePromotion_booleanAnd_useInRight_accessedInClosureRight_mutated() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super
-        .test_typePromotion_booleanAnd_useInRight_accessedInClosureRight_mutated();
-  }
-
-  @override
-  @failingTest
   test_typePromotion_booleanAnd_useInRight_mutatedInLeft() async {
     // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
     await super.test_typePromotion_booleanAnd_useInRight_mutatedInLeft();
@@ -773,43 +674,6 @@
 
   @override
   @failingTest
-  test_typePromotion_booleanAnd_useInRight_mutatedInRight() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super.test_typePromotion_booleanAnd_useInRight_mutatedInRight();
-  }
-
-  @override
-  @failingTest
-  test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_after() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super
-        .test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_after();
-  }
-
-  @override
-  @failingTest
-  test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_before() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super
-        .test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_before();
-  }
-
-  @override
-  @failingTest
-  test_typePromotion_conditional_useInThen_hasAssignment() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super.test_typePromotion_conditional_useInThen_hasAssignment();
-  }
-
-  @override
-  @failingTest
-  test_typePromotion_if_accessedInClosure_hasAssignment() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super.test_typePromotion_if_accessedInClosure_hasAssignment();
-  }
-
-  @override
-  @failingTest
   test_typePromotion_if_and_right_hasAssignment() async {
     // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
     await super.test_typePromotion_if_and_right_hasAssignment();
@@ -817,78 +681,6 @@
 
   @override
   @failingTest
-  test_typePromotion_if_extends_notMoreSpecific_dynamic() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super.test_typePromotion_if_extends_notMoreSpecific_dynamic();
-  }
-
-  @override
-  @failingTest
-  test_typePromotion_if_extends_notMoreSpecific_notMoreSpecificTypeArg() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super
-        .test_typePromotion_if_extends_notMoreSpecific_notMoreSpecificTypeArg();
-  }
-
-  @override
-  @failingTest
-  test_typePromotion_if_hasAssignment_after() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super.test_typePromotion_if_hasAssignment_after();
-  }
-
-  @override
-  @failingTest
-  test_typePromotion_if_hasAssignment_before() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super.test_typePromotion_if_hasAssignment_before();
-  }
-
-  @override
-  @failingTest
-  test_typePromotion_if_hasAssignment_inClosure_anonymous_after() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super.test_typePromotion_if_hasAssignment_inClosure_anonymous_after();
-  }
-
-  @override
-  @failingTest
-  test_typePromotion_if_hasAssignment_inClosure_anonymous_before() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super
-        .test_typePromotion_if_hasAssignment_inClosure_anonymous_before();
-  }
-
-  @override
-  @failingTest
-  test_typePromotion_if_hasAssignment_inClosure_function_after() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super.test_typePromotion_if_hasAssignment_inClosure_function_after();
-  }
-
-  @override
-  @failingTest
-  test_typePromotion_if_hasAssignment_inClosure_function_before() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super.test_typePromotion_if_hasAssignment_inClosure_function_before();
-  }
-
-  @override
-  @failingTest
-  test_typePromotion_if_implements_notMoreSpecific_dynamic() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super.test_typePromotion_if_implements_notMoreSpecific_dynamic();
-  }
-
-  @override
-  @failingTest
-  test_typePromotion_if_with_notMoreSpecific_dynamic() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super.test_typePromotion_if_with_notMoreSpecific_dynamic();
-  }
-
-  @override
-  @failingTest
   test_undefinedFunction() async {
     // Bad state: No reference information for g at 13
     await super.test_undefinedFunction();
@@ -910,13 +702,6 @@
 
   @override
   @failingTest
-  test_undefinedGetter() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super.test_undefinedGetter();
-  }
-
-  @override
-  @failingTest
   test_undefinedGetter_generic_function_call() async {
     // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
     await super.test_undefinedGetter_generic_function_call();
@@ -924,20 +709,6 @@
 
   @override
   @failingTest
-  test_undefinedGetter_object_call() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super.test_undefinedGetter_object_call();
-  }
-
-  @override
-  @failingTest
-  test_undefinedGetter_proxy_annotation_fakeProxy() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super.test_undefinedGetter_proxy_annotation_fakeProxy();
-  }
-
-  @override
-  @failingTest
   test_undefinedGetter_static() async {
     // Bad state: No reference information for A at 19
     await super.test_undefinedGetter_static();
@@ -945,13 +716,6 @@
 
   @override
   @failingTest
-  test_undefinedGetter_typeLiteral_cascadeTarget() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super.test_undefinedGetter_typeLiteral_cascadeTarget();
-  }
-
-  @override
-  @failingTest
   test_undefinedGetter_typeLiteral_conditionalAccess() async {
     // Bad state: No reference information for A at 18
     await super.test_undefinedGetter_typeLiteral_conditionalAccess();
@@ -959,13 +723,6 @@
 
   @override
   @failingTest
-  test_undefinedGetter_void() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
-    await super.test_undefinedGetter_void();
-  }
-
-  @override
-  @failingTest
   test_undefinedGetter_wrongNumberOfTypeArguments_tooLittle() async {
     // AnalysisException: Element mismatch in /test.dart at main(A<dynamic, dynamic> a) → dynamic
     await super.test_undefinedGetter_wrongNumberOfTypeArguments_tooLittle();
@@ -987,20 +744,6 @@
 
   @override
   @failingTest
-  test_undefinedMethod() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
-    await super.test_undefinedMethod();
-  }
-
-  @override
-  @failingTest
-  test_undefinedMethod_assignmentExpression() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
-    await super.test_undefinedMethod_assignmentExpression();
-  }
-
-  @override
-  @failingTest
   test_undefinedMethod_generic_function_call() async {
     // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
     await super.test_undefinedMethod_generic_function_call();
@@ -1036,13 +779,6 @@
 
   @override
   @failingTest
-  test_undefinedMethod_private() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
-    await super.test_undefinedMethod_private();
-  }
-
-  @override
-  @failingTest
   test_undefinedMethod_proxy_annotation_fakeProxy() async {
     // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
     await super.test_undefinedMethod_proxy_annotation_fakeProxy();
@@ -1113,13 +849,6 @@
 
   @override
   @failingTest
-  test_undefinedSetter() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_SETTER, found 0
-    await super.test_undefinedSetter();
-  }
-
-  @override
-  @failingTest
   test_undefinedSetter_static() async {
     // Bad state: No reference information for A at 17
     await super.test_undefinedSetter_static();
@@ -1127,20 +856,6 @@
 
   @override
   @failingTest
-  test_undefinedSetter_typeLiteral_cascadeTarget() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_SETTER, found 0
-    await super.test_undefinedSetter_typeLiteral_cascadeTarget();
-  }
-
-  @override
-  @failingTest
-  test_undefinedSetter_void() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_SETTER, found 0
-    await super.test_undefinedSetter_void();
-  }
-
-  @override
-  @failingTest
   test_undefinedSuperGetter() async {
     // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_SUPER_GETTER, found 0
     await super.test_undefinedSuperGetter();
diff --git a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
index aa9081d..a6292e4 100644
--- a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
@@ -12,13 +12,13 @@
   });
 }
 
+const potentialAnalyzerProblem = const Object();
+
 /// Tests marked with this annotation fail because of a Fasta problem.
 class FastaProblem {
   const FastaProblem(String issueUri);
 }
 
-const potentialAnalyzerProblem = const Object();
-
 @reflectiveTest
 class StaticWarningCodeTest_Kernel extends StaticWarningCodeTest_Driver {
   @override
@@ -29,34 +29,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/31073')
-  test_finalNotInitialized_inConstructor_1() async {
-    return super.test_finalNotInitialized_inConstructor_1();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/31073')
-  test_finalNotInitialized_inConstructor_2() async {
-    return super.test_finalNotInitialized_inConstructor_2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/31073')
-  test_finalNotInitialized_inConstructor_3() async {
-    return super.test_finalNotInitialized_inConstructor_3();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/30959')
-  test_importOfNonLibrary() async {
-    return super.test_importOfNonLibrary();
-  }
-
-  @override
-  @failingTest
   @potentialAnalyzerProblem
   test_ambiguousImport_as() async {
     return super.test_ambiguousImport_as();
@@ -743,6 +715,27 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31073')
+  test_finalNotInitialized_inConstructor_1() async {
+    return super.test_finalNotInitialized_inConstructor_1();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31073')
+  test_finalNotInitialized_inConstructor_2() async {
+    return super.test_finalNotInitialized_inConstructor_2();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31073')
+  test_finalNotInitialized_inConstructor_3() async {
+    return super.test_finalNotInitialized_inConstructor_3();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_finalNotInitialized_instanceField_final() async {
     return super.test_finalNotInitialized_instanceField_final();
@@ -827,6 +820,13 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/30959')
+  test_importOfNonLibrary() async {
+    return super.test_importOfNonLibrary();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_inconsistentMethodInheritanceGetterAndMethod() async {
     return super.test_inconsistentMethodInheritanceGetterAndMethod();
@@ -1499,13 +1499,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_notAType() async {
-    return super.test_notAType();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_notEnoughRequiredArguments() async {
     return super.test_notEnoughRequiredArguments();
   }
diff --git a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
index 9439e01..b03f69f 100644
--- a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
@@ -65,13 +65,6 @@
 
   @override
   @failingTest
-  test_constrainedByBounds4() async {
-    // Bad state: Expected a type for 4 at 119; got one for kernel offset 118
-    await super.test_constrainedByBounds4();
-  }
-
-  @override
-  @failingTest
   test_constrainedByBounds5() async {
     // Bad state: Expected a type for 4 at 119; got one for kernel offset 118
     await super.test_constrainedByBounds5();
@@ -277,6 +270,14 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31759')
+  test_inference_simplePolymorphicRecursion_function() async {
+    // Expected 0 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 2 (114, 99)
+    await super.test_inference_simplePolymorphicRecursion_function();
+  }
+
+  @override
+  @failingTest
   test_inferGenericInstantiation2() async {
     // Expected 1 errors of type StrongModeCode.STRONG_MODE_COULD_NOT_INFER, found 0;
     //          1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
@@ -320,6 +321,8 @@
   test_redirectingConstructor_propagation() async {
     // AnalysisException: Element mismatch in /test.dart at class A
     await super.test_redirectingConstructor_propagation();
+    // TODO(brianwilkerson) Figure out why this test is flaky.
+    fail('Flaky test');
   }
 }
 
@@ -434,13 +437,6 @@
 
   @override
   @failingTest
-  test_genericMethod_then_prefixed() async {
-    // Expected 0 errors of type HintCode.UNUSED_IMPORT, found 1 (7)
-    await super.test_genericMethod_then_prefixed();
-  }
-
-  @override
-  @failingTest
   test_implicitBounds() async {
     // Expected: 'B<num>'
     await super.test_implicitBounds();
@@ -455,62 +451,6 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_instantiateToBounds_class_error_recursion_self() async {
-    return super.test_instantiateToBounds_class_error_recursion_self();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_instantiateToBounds_class_error_recursion_self2() async {
-    return super.test_instantiateToBounds_class_error_recursion_self2();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_instantiateToBounds_class_error_typedef() async {
-    return super.test_instantiateToBounds_class_error_typedef();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_instantiateToBounds_class_ok_implicitDynamic_multi() async {
-    return super.test_instantiateToBounds_class_ok_implicitDynamic_multi();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/30724')
-  test_instantiateToBounds_class_ok_referenceOther_after() async {
-    return super.test_instantiateToBounds_class_ok_referenceOther_after();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/30724')
-  test_instantiateToBounds_class_ok_referenceOther_after2() async {
-    return super.test_instantiateToBounds_class_ok_referenceOther_after2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/30724')
-  test_instantiateToBounds_class_ok_referenceOther_before() async {
-    return super.test_instantiateToBounds_class_ok_referenceOther_before();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/30724')
-  test_instantiateToBounds_class_ok_referenceOther_multi() async {
-    return super.test_instantiateToBounds_class_ok_referenceOther_multi();
-  }
-
-  @override
-  @failingTest
   test_instantiateToBounds_class_ok_simpleBounds() async {
     // Expected: 'B<num>'
     await super.test_instantiateToBounds_class_ok_simpleBounds();
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 7331a7d..3bbf4dd 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -186,13 +186,8 @@
     var atD = AstFinder.getTopLevelFunction(result.unit, 'f').metadata[0];
     InstanceCreationExpression constC = atD.arguments.arguments[0];
 
-    if (previewDart2) {
-      expect(atD.name.staticElement, constructorD);
-      expect(atD.element, constructorD);
-    } else {
-      expect(atD.name.staticElement, elementD);
-      expect(atD.element, constructorD);
-    }
+    expect(atD.name.staticElement, elementD);
+    expect(atD.element, constructorD);
 
     expect(constC.staticElement, constructorC);
     expect(constC.staticType, elementC.type);
@@ -241,6 +236,168 @@
     expect(identifier_2.staticType, typeProvider.intType);
   }
 
+  test_annotation_prefixed_classConstructor() async {
+    var a = _p('/test/lib/a.dart');
+    provider.newFile(a, r'''
+class A {
+  const A(int a, {int b});
+}
+''');
+    addTestFile(r'''
+import 'a.dart' as p;
+
+@p.A(1, b: 2)
+main() {}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    CompilationUnit unit = result.unit;
+
+    ImportElement aImport = unit.element.library.imports[0];
+    PrefixElement aPrefix = aImport.prefix;
+    LibraryElement aLibrary = aImport.importedLibrary;
+
+    CompilationUnitElement aUnitElement = aLibrary.definingCompilationUnit;
+    ClassElement aClass = aUnitElement.getType('A');
+    ConstructorElement constructor = aClass.unnamedConstructor;
+
+    Annotation annotation = unit.declarations[0].metadata.single;
+    expect(annotation.element, same(constructor));
+    PrefixedIdentifier prefixed = annotation.name;
+
+    expect(prefixed.prefix.staticElement, same(aPrefix));
+    expect(prefixed.prefix.staticType, isNull);
+
+    expect(prefixed.identifier.staticElement, same(aClass));
+    expect(prefixed.prefix.staticType, isNull);
+
+    expect(annotation.constructorName, isNull);
+
+    var arguments = annotation.arguments.arguments;
+    var parameters = constructor.parameters;
+    _assertArgumentToParameter(arguments[0], parameters[0]);
+    _assertArgumentToParameter(arguments[1], parameters[1]);
+  }
+
+  test_annotation_prefixed_classConstructorNamed() async {
+    var a = _p('/test/lib/a.dart');
+    provider.newFile(a, r'''
+class A {
+  const A.named(int a, {int b});
+}
+''');
+    addTestFile(r'''
+import 'a.dart' as p;
+
+@p.A.named(1, b: 2)
+main() {}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    CompilationUnit unit = result.unit;
+
+    ImportElement aImport = unit.element.library.imports[0];
+    PrefixElement aPrefix = aImport.prefix;
+    LibraryElement aLibrary = aImport.importedLibrary;
+
+    CompilationUnitElement aUnitElement = aLibrary.definingCompilationUnit;
+    ClassElement aClass = aUnitElement.getType('A');
+    ConstructorElement constructor = aClass.getNamedConstructor('named');
+
+    Annotation annotation = unit.declarations[0].metadata.single;
+    expect(annotation.element, same(constructor));
+    PrefixedIdentifier prefixed = annotation.name;
+
+    expect(prefixed.prefix.staticElement, same(aPrefix));
+    expect(prefixed.prefix.staticType, isNull);
+
+    expect(prefixed.identifier.staticElement, same(aClass));
+    expect(prefixed.prefix.staticType, isNull);
+
+    SimpleIdentifier constructorName = annotation.constructorName;
+    expect(constructorName.staticElement, same(constructor));
+    expect(constructorName.staticType.toString(), '(int, {b: int}) → A');
+
+    var arguments = annotation.arguments.arguments;
+    var parameters = constructor.parameters;
+    _assertArgumentToParameter(arguments[0], parameters[0]);
+    _assertArgumentToParameter(arguments[1], parameters[1]);
+  }
+
+  test_annotation_prefixed_classField() async {
+    var a = _p('/test/lib/a.dart');
+    provider.newFile(a, r'''
+class A {
+  static const a = 1;
+}
+''');
+    addTestFile(r'''
+import 'a.dart' as p;
+
+@p.A.a
+main() {}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    CompilationUnit unit = result.unit;
+    var typeProvider = unit.element.context.typeProvider;
+
+    ImportElement aImport = unit.element.library.imports[0];
+    PrefixElement aPrefix = aImport.prefix;
+    LibraryElement aLibrary = aImport.importedLibrary;
+
+    CompilationUnitElement aUnitElement = aLibrary.definingCompilationUnit;
+    ClassElement aClass = aUnitElement.getType('A');
+    var aGetter = aClass.getField('a').getter;
+
+    Annotation annotation = unit.declarations[0].metadata.single;
+    expect(annotation.element, same(aGetter));
+    PrefixedIdentifier prefixed = annotation.name;
+
+    expect(prefixed.prefix.staticElement, same(aPrefix));
+    expect(prefixed.prefix.staticType, isNull);
+
+    expect(prefixed.identifier.staticElement, same(aClass));
+    expect(prefixed.prefix.staticType, isNull);
+
+    expect(annotation.constructorName.staticElement, aGetter);
+    expect(annotation.constructorName.staticType, typeProvider.intType);
+
+    expect(annotation.arguments, isNull);
+  }
+
+  test_annotation_prefixed_topLevelVariable() async {
+    var a = _p('/test/lib/a.dart');
+    provider.newFile(a, r'''
+const topAnnotation = 1;
+''');
+    addTestFile(r'''
+import 'a.dart' as p;
+
+@p.topAnnotation
+main() {}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    CompilationUnit unit = result.unit;
+
+    ImportElement aImport = unit.element.library.imports[0];
+    PrefixElement aPrefix = aImport.prefix;
+    LibraryElement aLibrary = aImport.importedLibrary;
+
+    CompilationUnitElement aUnitElement = aLibrary.definingCompilationUnit;
+    var topAnnotation = aUnitElement.topLevelVariables[0].getter;
+
+    Annotation annotation = unit.declarations[0].metadata.single;
+    expect(annotation.element, same(topAnnotation));
+    PrefixedIdentifier prefixed = annotation.name;
+
+    expect(prefixed.prefix.staticElement, same(aPrefix));
+    expect(prefixed.prefix.staticType, isNull);
+
+    expect(prefixed.identifier.staticElement, same(topAnnotation));
+    expect(prefixed.prefix.staticType, isNull);
+
+    expect(annotation.constructorName, isNull);
+    expect(annotation.arguments, isNull);
+  }
+
   test_asExpression() async {
     String content = r'''
 void main() {
@@ -1304,11 +1461,11 @@
     addTestFile(r'''
 class A {
   A(int a);
-  A.named(int a);
+  A.named(int a, {int b});
 }
 class B extends A {
-  B.one(int b) : super(b + 1);
-  B.two(int b) : super.named(b + 1);
+  B.one(int p) : super(p + 1);
+  B.two(int p) : super.named(p + 1, b: p + 2);
 }
 ''');
     AnalysisResult result = await driver.getResult(testFile);
@@ -1335,6 +1492,10 @@
       var constructorName = initializer.constructorName;
       expect(constructorName.staticElement, same(namedConstructor));
       expect(constructorName.staticType, isNull);
+
+      List<Expression> arguments = initializer.argumentList.arguments;
+      _assertArgumentToParameter(arguments[0], namedConstructor.parameters[0]);
+      _assertArgumentToParameter(arguments[1], namedConstructor.parameters[1]);
     }
   }
 
@@ -1702,6 +1863,30 @@
     expect(parameterNode.identifier.staticType, typeProvider.intType);
   }
 
+  test_functionExpressionInvocation() async {
+    addTestFile(r'''
+typedef Foo<S> = S Function<T>(T x);
+void main(f) {
+  (f as Foo<int>)<String>('hello');
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    var typeProvider = result.unit.element.context.typeProvider;
+
+    List<Statement> statements = _getMainStatements(result);
+
+    ExpressionStatement statement = statements[0];
+    FunctionExpressionInvocation invocation = statement.expression;
+
+    expect(invocation.staticElement, isNull);
+    expect(invocation.staticInvokeType.toString(), '(String) → int');
+    expect(invocation.staticType, typeProvider.intType);
+
+    List<TypeAnnotation> typeArguments = invocation.typeArguments.arguments;
+    expect(typeArguments, hasLength(1));
+    _assertTypeNameSimple(typeArguments[0], typeProvider.stringType);
+  }
+
   test_indexExpression() async {
     String content = r'''
 main() {
@@ -1896,6 +2081,126 @@
     }
   }
 
+  test_instanceCreation_prefixed() async {
+    var a = _p('/test/lib/a.dart');
+    provider.newFile(a, r'''
+class C<T> {
+  C(T p);
+  C.named(T p);
+}
+''');
+    addTestFile(r'''
+import 'a.dart' as p;
+main() {
+  new p.C(0);
+  new p.C.named(1.2);
+  new p.C<bool>.named(false);
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    CompilationUnit unit = result.unit;
+    var typeProvider = unit.element.context.typeProvider;
+
+    ImportElement aImport = unit.element.library.imports[0];
+    LibraryElement aLibrary = aImport.importedLibrary;
+
+    ClassElement cElement = aLibrary.getType('C');
+    ConstructorElement defaultConstructor = cElement.constructors[0];
+    ConstructorElement namedConstructor = cElement.constructors[1];
+    InterfaceType cType = cElement.type;
+    var cTypeDynamic = cType.instantiate([DynamicTypeImpl.instance]);
+
+    var statements = _getMainStatements(result);
+    {
+      var cTypeInt = cType.instantiate([typeProvider.intType]);
+
+      ExpressionStatement statement = statements[0];
+      InstanceCreationExpression creation = statement.expression;
+      expect(creation.staticElement, defaultConstructor);
+      expect(creation.staticType, cTypeInt);
+
+      TypeName typeName = creation.constructorName.type;
+      expect(typeName.typeArguments, isNull);
+
+      PrefixedIdentifier typeIdentifier = typeName.name;
+      expect(typeIdentifier.staticElement, same(cElement));
+      if (previewDart2) {
+        expect(typeIdentifier.staticType, cTypeInt);
+      } else {
+        expect(typeIdentifier.staticType, cTypeDynamic);
+      }
+
+      SimpleIdentifier typePrefix = typeIdentifier.prefix;
+      expect(typePrefix.name, 'p');
+      expect(typePrefix.staticElement, same(aImport.prefix));
+      expect(typePrefix.staticType, isNull);
+
+      expect(typeIdentifier.identifier.staticElement, same(cElement));
+
+      expect(creation.constructorName.name, isNull);
+    }
+
+    {
+      var cTypeDouble = cType.instantiate([typeProvider.doubleType]);
+
+      ExpressionStatement statement = statements[1];
+      InstanceCreationExpression creation = statement.expression;
+      expect(creation.staticElement, namedConstructor);
+      expect(creation.staticType, cTypeDouble);
+
+      TypeName typeName = creation.constructorName.type;
+      expect(typeName.typeArguments, isNull);
+
+      PrefixedIdentifier typeIdentifier = typeName.name;
+      expect(typeIdentifier.staticElement, cElement);
+      if (previewDart2) {
+        expect(typeIdentifier.staticType, cTypeDouble);
+      } else {
+        expect(typeIdentifier.staticType, cTypeDynamic);
+      }
+
+      SimpleIdentifier typePrefix = typeIdentifier.prefix;
+      expect(typePrefix.name, 'p');
+      expect(typePrefix.staticElement, same(aImport.prefix));
+      expect(typePrefix.staticType, isNull);
+
+      expect(typeIdentifier.identifier.staticElement, same(cElement));
+
+      SimpleIdentifier constructorName = creation.constructorName.name;
+      expect(constructorName.staticElement, namedConstructor);
+      expect(constructorName.staticType, isNull);
+    }
+
+    {
+      var cTypeBool = cType.instantiate([typeProvider.boolType]);
+
+      ExpressionStatement statement = statements[2];
+      InstanceCreationExpression creation = statement.expression;
+      expect(creation.staticElement, namedConstructor);
+      expect(creation.staticType, cTypeBool);
+
+      TypeName typeName = creation.constructorName.type;
+      expect(typeName.typeArguments.arguments, hasLength(1));
+      _assertTypeNameSimple(
+          typeName.typeArguments.arguments[0], typeProvider.boolType);
+
+      PrefixedIdentifier typeIdentifier = typeName.name;
+      expect(typeIdentifier.staticElement, cElement);
+      expect(typeIdentifier.staticType, cTypeBool);
+
+      SimpleIdentifier typePrefix = typeIdentifier.prefix;
+      expect(typePrefix.name, 'p');
+      expect(typePrefix.staticElement, same(aImport.prefix));
+      expect(typePrefix.staticType, isNull);
+
+      expect(typeIdentifier.identifier.staticElement, same(cElement));
+
+      SimpleIdentifier constructorName = creation.constructorName.name;
+      expect(constructorName.staticElement, namedConstructor);
+      expect(constructorName.staticType, isNull);
+    }
+  }
+
   test_instanceCreation_withTypeArguments() async {
     String content = r'''
 class C<K, V> {
@@ -3080,6 +3385,42 @@
     expect(argument.staticParameterElement, isNull);
   }
 
+  test_methodInvocation_notFunction_getter_typedef() async {
+    addTestFile(r'''
+typedef String Fun(int a, {int b});
+class C {
+  Fun get f => null;
+  foo() {
+    f(1, b: 2);
+  }
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    var typeProvider = result.unit.element.context.typeProvider;
+
+    FunctionTypeAlias funDeclaration = result.unit.declarations[0];
+    FunctionTypeAliasElement funElement = funDeclaration.element;
+
+    ClassDeclaration cDeclaration = result.unit.declarations[1];
+
+    MethodDeclaration fDeclaration = cDeclaration.members[0];
+    PropertyAccessorElement fElement = fDeclaration.element;
+
+    MethodDeclaration fooDeclaration = cDeclaration.members[1];
+    BlockFunctionBody fooBody = fooDeclaration.body;
+    List<Statement> fooStatements = fooBody.block.statements;
+
+    ExpressionStatement statement = fooStatements[0];
+    MethodInvocation invocation = statement.expression;
+    expect(invocation.methodName.staticElement, same(fElement));
+    expect(invocation.staticInvokeType.toString(), '(int, {b: int}) → String');
+    expect(invocation.staticType, typeProvider.stringType);
+
+    List<Expression> arguments = invocation.argumentList.arguments;
+    _assertArgumentToParameter(arguments[0], funElement.parameters[0]);
+    _assertArgumentToParameter(arguments[1], funElement.parameters[1]);
+  }
+
   test_methodInvocation_notFunction_local_dynamic() async {
     addTestFile(r'''
 main(f) {
@@ -3098,7 +3439,7 @@
     ExpressionStatement statement = mainStatements[0];
     MethodInvocation invocation = statement.expression;
     expect(invocation.methodName.staticElement, same(fElement));
-    expect(invocation.staticInvokeType, DynamicTypeImpl.instance);
+    _assertDynamicFunctionType(invocation.staticInvokeType);
     expect(invocation.staticType, DynamicTypeImpl.instance);
 
     List<Expression> arguments = invocation.argumentList.arguments;
@@ -3152,7 +3493,7 @@
     ExpressionStatement statement = mainStatements[0];
     MethodInvocation invocation = statement.expression;
     expect(invocation.methodName.staticElement, same(fElement.getter));
-    expect(invocation.staticInvokeType, DynamicTypeImpl.instance);
+    _assertDynamicFunctionType(invocation.staticInvokeType);
     expect(invocation.staticType, DynamicTypeImpl.instance);
 
     List<Expression> arguments = invocation.argumentList.arguments;
@@ -5028,6 +5369,56 @@
     _assertTypeNameSimple(typeArguments[0], typeProvider.intType);
   }
 
+  test_typeAnnotation_prefixed() async {
+    var a = _p('/test/lib/a.dart');
+    var b = _p('/test/lib/b.dart');
+    var c = _p('/test/lib/c.dart');
+    provider.newFile(a, 'class A {}');
+    provider.newFile(b, "export 'a.dart';");
+    provider.newFile(c, "export 'a.dart';");
+    addTestFile(r'''
+import 'b.dart' as b;
+import 'c.dart' as c;
+b.A a1;
+c.A a2;
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    CompilationUnit unit = result.unit;
+
+    ImportElement bImport = unit.element.library.imports[0];
+    ImportElement cImport = unit.element.library.imports[1];
+
+    LibraryElement bLibrary = bImport.importedLibrary;
+    LibraryElement aLibrary = bLibrary.exports[0].exportedLibrary;
+    ClassElement aClass = aLibrary.getType('A');
+
+    {
+      TopLevelVariableDeclaration declaration = unit.declarations[0];
+      TypeName typeName = declaration.variables.type;
+
+      PrefixedIdentifier typeIdentifier = typeName.name;
+      expect(typeIdentifier.staticElement, aClass);
+
+      expect(typeIdentifier.prefix.name, 'b');
+      expect(typeIdentifier.prefix.staticElement, same(bImport.prefix));
+
+      expect(typeIdentifier.identifier.staticElement, aClass);
+    }
+
+    {
+      TopLevelVariableDeclaration declaration = unit.declarations[1];
+      TypeName typeName = declaration.variables.type;
+
+      PrefixedIdentifier typeIdentifier = typeName.name;
+      expect(typeIdentifier.staticElement, aClass);
+
+      expect(typeIdentifier.prefix.name, 'c');
+      expect(typeIdentifier.prefix.staticElement, same(cImport.prefix));
+
+      expect(typeIdentifier.identifier.staticElement, aClass);
+    }
+  }
+
   test_typeLiteral() async {
     addTestFile(r'''
 void main() {
@@ -5069,6 +5460,10 @@
     ParameterElement actualParameter = argument.staticParameterElement;
     if (previewDart2) {
       expect(actualParameter, isNull);
+      if (argument is NamedExpression) {
+        SimpleIdentifier name = argument.name.label;
+        expect(name.staticElement, same(expectedParameter));
+      }
     } else {
       ParameterElement baseActualParameter;
       if (actualParameter is ParameterMember) {
@@ -5086,9 +5481,9 @@
         baseActualParameter = actualParameter;
       }
       expect(baseActualParameter, same(expectedParameter));
-      // TODO(scheglov) Make this work for previewDart2 too.
       if (argument is NamedExpression) {
-        expect(argument.name.label.staticElement, same(expectedParameter));
+        SimpleIdentifier name = argument.name.label;
+        expect(name.staticElement, same(actualParameter));
       }
     }
   }
@@ -5103,9 +5498,12 @@
   }
 
   /// Assert that the [type] is a function type `() -> dynamic`.
-  void _assertDynamicFunctionType(FunctionType type) {
-    expect(type.parameters, isEmpty);
-    expect(type.returnType, DynamicTypeImpl.instance);
+  void _assertDynamicFunctionType(DartType type) {
+    if (previewDart2) {
+      expect(type.toString(), '() → dynamic');
+    } else {
+      expect(type, DynamicTypeImpl.instance);
+    }
   }
 
   void _assertParameterElement(ParameterElement element,
diff --git a/pkg/analyzer/test/src/dart/ast/ast_test.dart b/pkg/analyzer/test/src/dart/ast/ast_test.dart
new file mode 100644
index 0000000..d2b842a
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/ast/ast_test.dart
@@ -0,0 +1,188 @@
+// 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/ast/ast.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(IntegerLiteralImplTest);
+  });
+}
+
+@reflectiveTest
+class IntegerLiteralImplTest {
+  test_isValidLiteral_dec_negative_equalMax() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('9223372036854775808', true), true);
+  }
+
+  test_isValidLiteral_dec_negative_fewDigits() async {
+    expect(IntegerLiteralImpl.isValidLiteral('24', true), true);
+  }
+
+  test_isValidLiteral_dec_negative_leadingZeros_overMax() async {
+    expect(IntegerLiteralImpl.isValidLiteral('009923372036854775807', true),
+        false);
+  }
+
+  test_isValidLiteral_dec_negative_leadingZeros_underMax() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('004223372036854775807', true), true);
+  }
+
+  test_isValidLiteral_dec_negative_oneOverMax() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('9223372036854775809', true), false);
+  }
+
+  test_isValidLiteral_dec_negative_tooManyDigits() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('10223372036854775808', true), false);
+  }
+
+  test_isValidLiteral_dec_positive_equalMax() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('9223372036854775807', false), true);
+  }
+
+  test_isValidLiteral_dec_positive_fewDigits() async {
+    expect(IntegerLiteralImpl.isValidLiteral('42', false), true);
+  }
+
+  test_isValidLiteral_dec_positive_leadingZeros_overMax() async {
+    expect(IntegerLiteralImpl.isValidLiteral('009923372036854775807', false),
+        false);
+  }
+
+  test_isValidLiteral_dec_positive_leadingZeros_underMax() async {
+    expect(IntegerLiteralImpl.isValidLiteral('004223372036854775807', false),
+        true);
+  }
+
+  test_isValidLiteral_dec_positive_oneOverMax() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('9223372036854775808', false), false);
+  }
+
+  test_isValidLiteral_dec_positive_tooManyDigits() async {
+    expect(IntegerLiteralImpl.isValidLiteral('10223372036854775808', false),
+        false);
+  }
+
+  test_isValidLiteral_hex_negative_equalMax() async {
+    expect(IntegerLiteralImpl.isValidLiteral('0x7FFFFFFFFFFFFFFF', true), true);
+  }
+
+  test_isValidLiteral_heX_negative_equalMax() async {
+    expect(IntegerLiteralImpl.isValidLiteral('0X7FFFFFFFFFFFFFFF', true), true);
+  }
+
+  test_isValidLiteral_hex_negative_fewDigits() async {
+    expect(IntegerLiteralImpl.isValidLiteral('0xFF', true), true);
+  }
+
+  test_isValidLiteral_heX_negative_fewDigits() async {
+    expect(IntegerLiteralImpl.isValidLiteral('0XFF', true), true);
+  }
+
+  test_isValidLiteral_hex_negative_leadingZeros_overMax() async {
+    expect(IntegerLiteralImpl.isValidLiteral('0x00FFFFFFFFFFFFFFFFF', true),
+        false);
+  }
+
+  test_isValidLiteral_heX_negative_leadingZeros_overMax() async {
+    expect(IntegerLiteralImpl.isValidLiteral('0X00FFFFFFFFFFFFFFFFF', true),
+        false);
+  }
+
+  test_isValidLiteral_hex_negative_leadingZeros_underMax() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('0x007FFFFFFFFFFFFFFF', true), true);
+  }
+
+  test_isValidLiteral_heX_negative_leadingZeros_underMax() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('0X007FFFFFFFFFFFFFFF', true), true);
+  }
+
+  test_isValidLiteral_hex_negative_oneOverMax() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('0x8000000000000000', true), false);
+  }
+
+  test_isValidLiteral_heX_negative_oneOverMax() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('0X8000000000000000', true), false);
+  }
+
+  test_isValidLiteral_hex_negative_tooManyDigits() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('0x10000000000000000', true), false);
+  }
+
+  test_isValidLiteral_heX_negative_tooManyDigits() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('0X10000000000000000', true), false);
+  }
+
+  test_isValidLiteral_hex_positive_equalMax() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('0x7FFFFFFFFFFFFFFF', false), true);
+  }
+
+  test_isValidLiteral_heX_positive_equalMax() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('0X7FFFFFFFFFFFFFFF', false), true);
+  }
+
+  test_isValidLiteral_hex_positive_fewDigits() async {
+    expect(IntegerLiteralImpl.isValidLiteral('0xFF', false), true);
+  }
+
+  test_isValidLiteral_heX_positive_fewDigits() async {
+    expect(IntegerLiteralImpl.isValidLiteral('0XFF', false), true);
+  }
+
+  test_isValidLiteral_hex_positive_leadingZeros_overMax() async {
+    expect(IntegerLiteralImpl.isValidLiteral('0x00FFFFFFFFFFFFFFFFF', false),
+        false);
+  }
+
+  test_isValidLiteral_heX_positive_leadingZeros_overMax() async {
+    expect(IntegerLiteralImpl.isValidLiteral('0X00FFFFFFFFFFFFFFFFF', false),
+        false);
+  }
+
+  test_isValidLiteral_hex_positive_leadingZeros_underMax() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('0x007FFFFFFFFFFFFFFF', false), true);
+  }
+
+  test_isValidLiteral_heX_positive_leadingZeros_underMax() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('0X007FFFFFFFFFFFFFFF', false), true);
+  }
+
+  test_isValidLiteral_hex_positive_oneOverMax() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('0x10000000000000000', false), false);
+  }
+
+  test_isValidLiteral_heX_positive_oneOverMax() async {
+    expect(
+        IntegerLiteralImpl.isValidLiteral('0X10000000000000000', false), false);
+  }
+
+  test_isValidLiteral_hex_positive_tooManyDigits() async {
+    expect(IntegerLiteralImpl.isValidLiteral('0xFF0000000000000000', false),
+        false);
+  }
+
+  test_isValidLiteral_heX_positive_tooManyDigits() async {
+    expect(IntegerLiteralImpl.isValidLiteral('0XFF0000000000000000', false),
+        false);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/ast/test_all.dart b/pkg/analyzer/test/src/dart/ast/test_all.dart
index da75f77..2330fd9 100644
--- a/pkg/analyzer/test/src/dart/ast/test_all.dart
+++ b/pkg/analyzer/test/src/dart/ast/test_all.dart
@@ -2,15 +2,14 @@
 // 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 analyzer.test.src.dart.ast.test_all;
-
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'ast_test.dart' as ast;
 import 'utilities_test.dart' as utilities;
 
-/// Utility for manually running all tests.
 main() {
   defineReflectiveSuite(() {
+    ast.main();
     utilities.main();
   }, name: 'ast');
 }
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/instance_creation_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/instance_creation_test.dart
index 24dc9d9..7c584c8 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/instance_creation_test.dart
@@ -49,6 +49,14 @@
           ],
           "$keyword A.b()"),
       new TestDescriptor(
+          '${keyword}_name_dot',
+          '$keyword A.',
+          [
+            ParserErrorCode.MISSING_IDENTIFIER,
+            ParserErrorCode.EXPECTED_TOKEN,
+          ],
+          "$keyword A._s_()"),
+      new TestDescriptor(
           '${keyword}_leftParen_unnamed',
           '$keyword A(',
           [
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/method_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/method_declaration_test.dart
index 6fc5af9..d104bcf 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/method_declaration_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/method_declaration_test.dart
@@ -39,6 +39,24 @@
           new TestDescriptor('noType_params', 'm(b, c)',
               [ParserErrorCode.EXPECTED_TOKEN], "m(b, c);",
               allFailing: true),
+          new TestDescriptor(
+              'noType_emptyOptional',
+              'm(B b, [])',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_FUNCTION_BODY
+              ],
+              "m(B b, [_s_]){}",
+              failing: ['fieldConst']),
+          new TestDescriptor(
+              'noType_emptyNamed',
+              'm(B b, {})',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_FUNCTION_BODY
+              ],
+              "m(B b, {_s_}){}",
+              failing: ['fieldConst']),
           new TestDescriptor('type_leftParen', 'A m(',
               [ParserErrorCode.EXPECTED_TOKEN], "A m();",
               allFailing: true),
@@ -63,6 +81,24 @@
           new TestDescriptor('type_params', 'A m(b, c)',
               [ParserErrorCode.EXPECTED_TOKEN], "A m(b, c);",
               allFailing: true),
+          new TestDescriptor(
+              'type_emptyOptional',
+              'A m(B b, [])',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_FUNCTION_BODY
+              ],
+              "A m(B b, [_s_]){}",
+              failing: ['fieldConst']),
+          new TestDescriptor(
+              'type_emptyNamed',
+              'A m(B b, {})',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_FUNCTION_BODY
+              ],
+              "A m(B b, {_s_}){}",
+              failing: ['fieldConst']),
         ],
         PartialCodeTest.classMemberSuffixes,
         head: 'class C { ',
diff --git a/pkg/analyzer/test/src/fasta/resolution_applier_test.dart b/pkg/analyzer/test/src/fasta/resolution_applier_test.dart
index bdd7051..1b1a23b 100644
--- a/pkg/analyzer/test/src/fasta/resolution_applier_test.dart
+++ b/pkg/analyzer/test/src/fasta/resolution_applier_test.dart
@@ -43,6 +43,7 @@
     FunctionDeclaration function = unit.declarations[0];
     FunctionBody body = function.functionExpression.body;
     ResolutionApplier applier = new ResolutionApplier(
+        null,
         new _TestTypeContext(),
         declaredElements,
         referencedElements,
@@ -74,6 +75,7 @@
     ], <DartType>[
       typeProvider.stringType,
       new FunctionTypeImpl(new FunctionElementImpl('+', -1)),
+      new FunctionTypeImpl(new FunctionElementImpl('+', -1)),
       new TypeArgumentsDartType([]),
       typeProvider.intType,
       typeProvider.stringType,
@@ -92,9 +94,11 @@
     ], <DartType>[
       typeProvider.objectType,
       typeProvider.objectType,
+      typeProvider.objectType,
       new TypeArgumentsDartType([]),
       typeProvider.objectType,
       typeProvider.objectType,
+      typeProvider.objectType,
       new TypeArgumentsDartType([]),
       typeProvider.objectType
     ]);
@@ -250,6 +254,8 @@
   }
 
   void test_methodInvocation_method() {
+    var substringType =
+        new FunctionTypeImpl(new FunctionElementImpl('substring', -1));
     applyTypes(r'''
 f(String s) {
   return s.substring(3, 7);
@@ -259,7 +265,8 @@
       new MethodElementImpl('length', -1)
     ], <DartType>[
       typeProvider.stringType,
-      typeProvider.intType,
+      substringType,
+      substringType,
       new TypeArgumentsDartType([]),
       typeProvider.intType,
       typeProvider.stringType,
diff --git a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
index c2e11d0..84c9688 100644
--- a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
+++ b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
@@ -53,7 +53,7 @@
     validator = new PubspecValidator(resourceProvider, source);
   }
 
-  test_assetDoesNotExist_error() {
+  test_assetDoesNotExist_path_error() {
     assertErrors('''
 name: sample
 flutter:
@@ -62,7 +62,7 @@
 ''', [PubspecWarningCode.ASSET_DOES_NOT_EXIST]);
   }
 
-  test_assetDoesNotExist_noError() {
+  test_assetDoesNotExist_path_noError() {
     newFile('/sample/assets/my_icon.png');
     assertNoErrors('''
 name: sample
@@ -72,6 +72,27 @@
 ''');
   }
 
+  @failingTest
+  test_assetDoesNotExist_uri_error() {
+    assertErrors('''
+name: sample
+flutter:
+  assets:
+    - packages/icons/my_icon.png
+''', [PubspecWarningCode.ASSET_DOES_NOT_EXIST]);
+  }
+
+  test_assetDoesNotExist_uri_noError() {
+    // TODO(brianwilkerson) Create a package named `icons` that contains the
+    // referenced file, and a `.packages` file that references that package.
+    assertNoErrors('''
+name: sample
+flutter:
+  assets:
+    - packages/icons/my_icon.png
+''');
+  }
+
   test_assetFieldNotList_error_empty() {
     assertErrors('''
 name: sample
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 46cf716..903fd18 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -328,8 +328,10 @@
     } else if (e is DoubleLiteral) {
       buffer.write(e.value);
     } else if (e is InstanceCreationExpression) {
-      buffer.write(e.keyword.lexeme);
-      buffer.write(' ');
+      if (e.keyword != null) {
+        buffer.write(e.keyword.lexeme);
+        buffer.write(' ');
+      }
       writeExpression(e.constructorName);
       writeList('(', ')', e.argumentList.arguments, ', ', writeExpression,
           includeEmpty: true);
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
index 13d060c..c821b21 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
@@ -64,6 +64,12 @@
 
   @override
   @failingTest
+  test_instantiateToBounds_functionTypeAlias_simple() async {
+    await super.test_instantiateToBounds_functionTypeAlias_simple();
+  }
+
+  @override
+  @failingTest
   test_syntheticFunctionType_genericClosure() async {
     await super.test_syntheticFunctionType_genericClosure();
   }
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 14ef322d..c6cd476 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -2263,6 +2263,15 @@
     }
   }
 
+  test_class_setter_invalid_named_parameter() async {
+    var library = await checkLibrary('class C { void set x({a}) {} }');
+    checkElementText(library, r'''
+class C {
+  void set x({dynamic a}) {}
+}
+''');
+  }
+
   test_class_setter_invalid_no_parameter() async {
     var library = await checkLibrary('class C { void set x() {} }');
     checkElementText(library, r'''
@@ -2272,15 +2281,6 @@
 ''');
   }
 
-  test_class_setter_invalid_too_many_parameters() async {
-    var library = await checkLibrary('class C { void set x(a, b) {} }');
-    checkElementText(library, r'''
-class C {
-  void set x(dynamic a, dynamic b) {}
-}
-''');
-  }
-
   test_class_setter_invalid_optional_parameter() async {
     var library = await checkLibrary('class C { void set x([a]) {} }');
     checkElementText(library, r'''
@@ -2290,11 +2290,11 @@
 ''');
   }
 
-  test_class_setter_invalid_named_parameter() async {
-    var library = await checkLibrary('class C { void set x({a}) {} }');
+  test_class_setter_invalid_too_many_parameters() async {
+    var library = await checkLibrary('class C { void set x(a, b) {} }');
     checkElementText(library, r'''
 class C {
-  void set x({dynamic a}) {}
+  void set x(dynamic a, dynamic b) {}
 }
 ''');
   }
@@ -4076,6 +4076,7 @@
     }
   }
 
+  @failingTest // https://github.com/dart-lang/sdk/issues/31768
   test_const_topLevel_literal() async {
     var library = await checkLibrary(r'''
 const vNull = null;
@@ -4277,6 +4278,27 @@
     }
   }
 
+  test_const_topLevel_typedList_typedefArgument() async {
+    shouldCompareLibraryElements = false;
+    var library = await checkLibrary(r'''
+typedef int F(String id);
+const v = const <F>[];
+''');
+    if (isStrongMode) {
+      checkElementText(library, r'''
+typedef F = int Function(String id);
+const List<(String) → int> v = const <
+        null/*location: test.dart;F;-*/>[];
+''');
+    } else {
+      checkElementText(library, r'''
+typedef F = int Function(String id);
+const dynamic v = const <
+        null/*location: test.dart;F;-*/>[];
+''');
+    }
+  }
+
   test_const_topLevel_typedMap() async {
     var library = await checkLibrary(r'''
 const vDynamic1 = const <dynamic, int>{};
@@ -7175,7 +7197,7 @@
     if (isStrongMode) {
       checkElementText(library, r'''
 typedef F<T extends num> = dynamic Function(T p);
-(dynamic) → dynamic f;
+(num) → dynamic f;
 ''');
     } else {
       checkElementText(library, r'''
diff --git a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
index 40060b1..651b216 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
@@ -268,22 +268,10 @@
 
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30724')
-  test_instantiateToBounds_boundRefersToItself() async {
-    await super.test_instantiateToBounds_boundRefersToItself();
-  }
-
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/30724')
   test_instantiateToBounds_boundRefersToLaterTypeArgument() async {
     await super.test_instantiateToBounds_boundRefersToLaterTypeArgument();
   }
 
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/30724')
-  test_instantiateToBounds_simple() async {
-    await super.test_instantiateToBounds_simple();
-  }
-
   @override
   @failingTest
   test_invalid_annotation_prefixed_constructor() {
@@ -396,6 +384,16 @@
   }
 
   @failingTest
+  test_typedef_type_parameters_bound_recursive() async {
+    await super.test_typedef_type_parameters_bound_recursive();
+  }
+
+  @failingTest
+  test_typedef_type_parameters_bound_recursive2() async {
+    await super.test_typedef_type_parameters_bound_recursive2();
+  }
+
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30267')
   test_unresolved_annotation_instanceCreation_argument_super() async {
     await super.test_unresolved_annotation_instanceCreation_argument_super();
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index 9e853e2..7ec895f 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -18,6 +18,7 @@
     as public_namespace;
 import 'package:path/path.dart' show posix;
 import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../context/mock_sdk.dart';
 
@@ -2808,6 +2809,7 @@
     ]);
   }
 
+  @failingTest // https://github.com/dart-lang/sdk/issues/31768
   test_constExpr_pushLongInt() {
     UnlinkedVariable variable =
         serializeVariableText('const v = 0xA123456789ABCDEF012345678;');
@@ -2827,6 +2829,7 @@
     ]);
   }
 
+  @failingTest // https://github.com/dart-lang/sdk/issues/31768
   test_constExpr_pushLongInt_min3() {
     UnlinkedVariable variable =
         serializeVariableText('const v = 0x10000000000000000;');
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 4f06012..7163d40 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -1401,6 +1401,9 @@
   /// Returns the type of [function].
   FunctionType getFunctionType(FunctionEntity function);
 
+  /// Returns the function type variables defined on [function].
+  List<TypeVariableType> getFunctionTypeVariables(FunctionEntity function);
+
   /// Returns the type of [field].
   DartType getFieldType(FieldEntity field);
 
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index d05ba4b..50a5ebb 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -926,6 +926,7 @@
   /// If [assumeInUserCode] is `true`, [element] is assumed to be in user code
   /// if no entrypoints have been set.
   bool inUserCode(Entity element, {bool assumeInUserCode: false}) {
+    if (element == null) return assumeInUserCode;
     Uri libraryUri = _uriFromElement(element);
     if (libraryUri == null) return false;
     Iterable<CodeLocation> userCodeLocations =
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index c803871..c19fefb 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -3841,7 +3841,7 @@
     assert(() {
       computeMessage();
       return true;
-    });
+    }());
   }
 
   MessageKind get kind => template.kind;
diff --git a/pkg/compiler/lib/src/frontend_strategy.dart b/pkg/compiler/lib/src/frontend_strategy.dart
index 1e58614..e06ed4f 100644
--- a/pkg/compiler/lib/src/frontend_strategy.dart
+++ b/pkg/compiler/lib/src/frontend_strategy.dart
@@ -75,6 +75,9 @@
   /// this strategy.
   NoSuchMethodResolver createNoSuchMethodResolver();
 
+  /// Returns the [RuntimeTypesNeedBuilder] used by this frontend strategy.
+  RuntimeTypesNeedBuilder get runtimeTypesNeedBuilderForTesting;
+
   /// Creates the [ResolutionWorldBuilder] corresponding to the element model
   /// used in this strategy.
   ResolutionWorldBuilder createResolutionWorldBuilder(
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index 51e274e..492087c 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -649,6 +649,8 @@
         return asName(typedefTag);
       case JsGetName.FUNCTION_TYPE_TAG:
         return asName(functionTypeTag);
+      case JsGetName.FUNCTION_TYPE_GENERIC_BOUNDS_TAG:
+        return asName(functionTypeGenericBoundsTag);
       case JsGetName.FUNCTION_TYPE_VOID_RETURN_TAG:
         return asName(functionTypeVoidReturnTag);
       case JsGetName.FUNCTION_TYPE_RETURN_TYPE_TAG:
@@ -1617,6 +1619,8 @@
 
   String get functionTypeNamedParametersTag => r'named';
 
+  String get functionTypeGenericBoundsTag => r'bounds';
+
   Map<ResolutionFunctionType, jsAst.Name> functionTypeNameMap =
       new HashMap<ResolutionFunctionType, jsAst.Name>();
 
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index 79057a1..dcadac5 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -39,6 +39,7 @@
   bool classNeedsRti(ClassEntity cls);
   bool classNeedsRtiField(ClassEntity cls);
   bool methodNeedsRti(FunctionEntity function);
+  bool methodNeedsGenericRti(FunctionEntity function);
   // TODO(redemption): Remove this when the old frontend is deleted.
   bool localFunctionNeedsRti(Local function);
   bool classUsesTypeVariableExpression(ClassEntity cls);
@@ -90,14 +91,14 @@
 
   /// Computes the [RuntimeTypesChecks] for the data in this builder.
   RuntimeTypesChecks computeRequiredChecks(
-      CodegenWorldBuilder codegenWorldBuilder);
+      CodegenWorldBuilder codegenWorldBuilder, Set<DartType> implicitIsChecks);
 
   /// Compute type arguments of classes that use one of their type variables in
   /// is-checks and add the is-checks that they imply.
   ///
   /// This function must be called after all is-checks have been registered.
-  void registerImplicitChecks(
-      WorldBuilder worldBuilder, Iterable<ClassEntity> classesUsingChecks);
+  void registerImplicitChecks(Set<InterfaceType> instantiatedTypes,
+      Iterable<ClassEntity> classesUsingChecks, Set<DartType> implicitIsChecks);
 }
 
 /// Interface for computing substitutions need for runtime type checks.
@@ -169,16 +170,17 @@
    * immutable datastructure.
    */
   void registerImplicitChecks(
-      WorldBuilder worldBuilder, Iterable<ClassEntity> classesUsingChecks) {
+      Set<InterfaceType> instantiatedTypes,
+      Iterable<ClassEntity> classesUsingChecks,
+      Set<DartType> implicitIsChecks) {
     // If there are no classes that use their variables in checks, there is
     // nothing to do.
     if (classesUsingChecks.isEmpty) return;
-    Set<InterfaceType> instantiatedTypes = worldBuilder.instantiatedTypes;
     if (cannotDetermineInstantiatedTypesPrecisely) {
       for (InterfaceType type in instantiatedTypes) {
         do {
           for (DartType argument in type.typeArguments) {
-            worldBuilder.registerIsCheck(argument);
+            implicitIsChecks.add(argument.unaliased);
           }
           // TODO(johnniwinther): This seems wrong; the type arguments of [type]
           // are not substituted - `List<int>` yields `Iterable<E>` and not
@@ -201,7 +203,7 @@
             InterfaceType instance = _types.asInstanceOf(type, cls);
             if (instance == null) break;
             for (DartType argument in instance.typeArguments) {
-              worldBuilder.registerIsCheck(argument);
+              implicitIsChecks.add(argument.unaliased);
             }
             // TODO(johnniwinther): This seems wrong; the type arguments of
             // [type] are not substituted - `List<int>` yields `Iterable<E>` and
@@ -253,6 +255,10 @@
         _backendUsage.isRuntimeTypeUsed;
   }
 
+  // TODO(johnniwinther): Optimize to only include generic methods that really
+  // need the RTI.
+  bool methodNeedsGenericRti(FunctionEntity function) => true;
+
   bool localFunctionNeedsRti(Local function) {
     if (localFunctionsNeedingRti == null) {
       // [localFunctionNeedsRti] is only used by the old frontend.
@@ -297,6 +303,12 @@
   final Set<ClassEntity> classesUsingTypeVariableExpression =
       new Set<ClassEntity>();
 
+  final Set<ClassEntity> classesUsingTypeVariableTests = new Set<ClassEntity>();
+
+  Set<DartType> isChecks;
+
+  final Set<DartType> implicitIsChecks = new Set<DartType>();
+
   RuntimeTypesNeedBuilderImpl(this._elementEnvironment, DartTypes types)
       : super(types);
 
@@ -320,6 +332,7 @@
   RuntimeTypesNeed computeRuntimeTypesNeed(
       ResolutionWorldBuilder resolutionWorldBuilder, ClosedWorld closedWorld,
       {bool enableTypeAssertions}) {
+    isChecks = new Set<DartType>.from(resolutionWorldBuilder.isChecks);
     Set<ClassEntity> classesNeedingRti = new Set<ClassEntity>();
     Set<FunctionEntity> methodsNeedingRti = new Set<FunctionEntity>();
     Set<Local> localFunctionsNeedingRti = new Set<Local>();
@@ -348,8 +361,7 @@
       }
     }
 
-    Set<ClassEntity> classesUsingTypeVariableTests = new Set<ClassEntity>();
-    resolutionWorldBuilder.isChecks.forEach((DartType type) {
+    isChecks.forEach((DartType type) {
       if (type.isTypeVariable) {
         TypeVariableType typeVariableType = type;
         TypeVariableEntity variable = typeVariableType.element;
@@ -362,8 +374,8 @@
       }
     });
     // Add is-checks that result from classes using type variables in checks.
-    registerImplicitChecks(
-        resolutionWorldBuilder, classesUsingTypeVariableTests);
+    registerImplicitChecks(resolutionWorldBuilder.instantiatedTypes,
+        classesUsingTypeVariableTests, implicitIsChecks);
     // Add the rti dependencies that are implicit in the way the backend
     // generates code: when we create a new [List], we actually create
     // a JSArray in the backend and we need to add type arguments to
@@ -406,25 +418,32 @@
 
     // Compute the set of all classes and methods that need runtime type
     // information.
-    resolutionWorldBuilder.isChecks.forEach((DartType type) {
-      if (type.isInterfaceType) {
-        InterfaceType itf = type;
-        if (!itf.treatAsRaw) {
-          potentiallyAddForRti(itf.element);
+
+    void processChecks(Set<DartType> checks) {
+      checks.forEach((DartType type) {
+        if (type.isInterfaceType) {
+          InterfaceType itf = type;
+          if (!itf.treatAsRaw) {
+            potentiallyAddForRti(itf.element);
+          }
+        } else {
+          ClassEntity contextClass = DartTypes.getClassContext(type);
+          if (contextClass != null) {
+            // [type] contains type variables (declared in [contextClass]) if
+            // [contextClass] is non-null. This handles checks against type
+            // variables and function types containing type variables.
+            potentiallyAddForRti(contextClass);
+          }
+          if (type.isFunctionType) {
+            checkClosures(potentialSubtypeOf: type);
+          }
         }
-      } else {
-        ClassEntity contextClass = DartTypes.getClassContext(type);
-        if (contextClass != null) {
-          // [type] contains type variables (declared in [contextClass]) if
-          // [contextClass] is non-null. This handles checks against type
-          // variables and function types containing type variables.
-          potentiallyAddForRti(contextClass);
-        }
-        if (type.isFunctionType) {
-          checkClosures(potentialSubtypeOf: type);
-        }
-      }
-    });
+      });
+    }
+
+    processChecks(isChecks);
+    processChecks(implicitIsChecks);
+
     if (enableTypeAssertions) {
       checkClosures();
     }
@@ -562,8 +581,10 @@
   }
 
   RuntimeTypesChecks computeRequiredChecks(
-      CodegenWorldBuilder codegenWorldBuilder) {
-    Set<DartType> isChecks = codegenWorldBuilder.isChecks;
+      CodegenWorldBuilder codegenWorldBuilder, Set<DartType> implicitIsChecks) {
+    Set<DartType> isChecks =
+        new Set<DartType>.from(codegenWorldBuilder.isChecks);
+    isChecks.addAll(implicitIsChecks);
     // These types are needed for is-checks against function types.
     Set<DartType> instantiatedTypesAndClosures =
         computeInstantiatedTypesAndClosures(codegenWorldBuilder);
@@ -956,6 +977,7 @@
   OnVariableCallback onVariable;
   ShouldEncodeTypedefCallback shouldEncodeTypedef;
   Map<TypeVariableType, jsAst.Expression> typedefBindings;
+  List<FunctionTypeVariable> functionTypeVariables = <FunctionTypeVariable>[];
 
   TypeRepresentationGenerator(this.namer);
 
@@ -976,6 +998,7 @@
     jsAst.Expression representation = visit(type, emitter);
     this.onVariable = null;
     this.shouldEncodeTypedef = null;
+    assert(functionTypeVariables.isEmpty);
     return representation;
   }
 
@@ -1006,9 +1029,9 @@
 
   jsAst.Expression visitFunctionTypeVariable(
       FunctionTypeVariable type, Emitter emitter) {
-    // TODO(johnniwinther): Create a runtime representation for existential
-    // types.
-    return getDynamicValue();
+    int position = functionTypeVariables.indexOf(type);
+    assert(position >= 0);
+    return js.number(functionTypeVariables.length - position - 1);
   }
 
   jsAst.Expression visitDynamicType(DynamicType type, Emitter emitter) {
@@ -1055,6 +1078,20 @@
     // Type representations for functions have a property which is a tag marking
     // them as function types. The value is not used, so '1' is just a dummy.
     addProperty(namer.functionTypeTag, js.number(1));
+
+    if (type.typeVariables.isNotEmpty) {
+      // Generic function types have type parameters which are reduced to de
+      // Bruijn indexes.
+      for (FunctionTypeVariable variable in type.typeVariables.reversed) {
+        functionTypeVariables.add(variable);
+      }
+      // TODO(sra): This emits `P.Object` for the common unbounded case. We
+      // could replace the Object bounds with an array hole for a compact `[,,]`
+      // representation.
+      addProperty(namer.functionTypeGenericBoundsTag,
+          visitList(type.typeVariables.map((v) => v.bound).toList(), emitter));
+    }
+
     if (type.returnType.isVoid) {
       addProperty(namer.functionTypeVoidReturnTag, js('true'));
     } else if (!type.returnType.treatAsDynamic) {
@@ -1082,6 +1119,12 @@
       addProperty(namer.functionTypeNamedParametersTag,
           new jsAst.ObjectInitializer(namedArguments));
     }
+
+    // Exit generic function scope.
+    if (type.typeVariables.isNotEmpty) {
+      functionTypeVariables.length -= type.typeVariables.length;
+    }
+
     return new jsAst.ObjectInitializer(properties);
   }
 
diff --git a/pkg/compiler/lib/src/js_emitter/type_test_registry.dart b/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
index 20ec76a..b6a3a8e 100644
--- a/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
+++ b/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
@@ -180,18 +180,26 @@
   void computeRequiredTypeChecks(RuntimeTypesChecksBuilder rtiChecksBuilder) {
     assert(checkedClasses == null && checkedFunctionTypes == null);
 
+    Set<DartType> implicitIsChecks = new Set<DartType>();
     rtiChecksBuilder.registerImplicitChecks(
-        _codegenWorldBuilder, classesUsingTypeVariableTests);
-    _rtiChecks = rtiChecksBuilder.computeRequiredChecks(_codegenWorldBuilder);
+        _codegenWorldBuilder.instantiatedTypes,
+        classesUsingTypeVariableTests,
+        implicitIsChecks);
+    _rtiChecks = rtiChecksBuilder.computeRequiredChecks(
+        _codegenWorldBuilder, implicitIsChecks);
 
     checkedClasses = new Set<ClassEntity>();
     checkedFunctionTypes = new Set<FunctionType>();
-    _codegenWorldBuilder.isChecks.forEach((DartType t) {
+
+    processType(DartType t) {
       if (t is InterfaceType) {
         checkedClasses.add(t.element);
       } else if (t is FunctionType) {
         checkedFunctionTypes.add(t);
       }
-    });
+    }
+
+    _codegenWorldBuilder.isChecks.forEach(processType);
+    implicitIsChecks.forEach(processType);
   }
 }
diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart
index 7f82042..b34cd47 100644
--- a/pkg/compiler/lib/src/js_model/closure.dart
+++ b/pkg/compiler/lib/src/js_model/closure.dart
@@ -624,7 +624,9 @@
   }
 }
 
-class ClosureFunctionData extends ClosureMemberData implements FunctionData {
+class ClosureFunctionData extends ClosureMemberData
+    with FunctionDataMixin
+    implements FunctionData {
   final FunctionType functionType;
   final ir.FunctionNode functionNode;
   final ClassTypeVariableAccess classTypeVariableAccess;
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index e11bf46..db3de60 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -76,7 +76,7 @@
   Expression instantiateInvocation(CoreTypes coreTypes, Expression receiver,
       String name, Arguments arguments, int offset, bool isSuper) {
     // TODO(sigmund): implement;
-    return new InvalidExpression();
+    return new InvalidExpression(null);
   }
 
   @override
@@ -93,6 +93,6 @@
       bool isConstructor: false,
       bool isTopLevel: false}) {
     // TODO(sigmund): implement;
-    return new InvalidExpression();
+    return new InvalidExpression(null);
   }
 }
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 92e71cd..b01eea5 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -640,6 +640,12 @@
     return data.getFunctionType(this);
   }
 
+  List<TypeVariableType> _getFunctionTypeVariables(IndexedFunction function) {
+    assert(checkFamily(function));
+    FunctionData data = _members.getData(function);
+    return data.getFunctionTypeVariables(this);
+  }
+
   DartType _getFieldType(IndexedField field) {
     assert(checkFamily(field));
     FieldData data = _members.getData(field);
@@ -1341,6 +1347,11 @@
   }
 
   @override
+  List<TypeVariableType> getFunctionTypeVariables(FunctionEntity function) {
+    return elementMap._getFunctionTypeVariables(function);
+  }
+
+  @override
   DartType getFieldType(FieldEntity field) {
     return elementMap._getFieldType(field);
   }
@@ -1583,7 +1594,8 @@
         node.parameter.parent.parent is ir.Procedure) {
       // Special case for Dart 1 compatibility in checked mode.
       ir.Procedure typeParameterParent = node.parameter.parent.parent;
-      if (typeParameterParent.kind != ir.ProcedureKind.Factory) {
+      if (typeParameterParent.kind != ir.ProcedureKind.Factory &&
+          !elementMap.options.strongMode) {
         return new Dart1MethodTypeVariableType(
             elementMap.getTypeVariable(node.parameter));
       }
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index a4a9011..37d97ef 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -564,11 +564,38 @@
 abstract class FunctionData implements MemberData {
   FunctionType getFunctionType(KernelToElementMap elementMap);
 
+  List<TypeVariableType> getFunctionTypeVariables(
+      KernelToElementMap elementMap);
+
   void forEachParameter(KernelToElementMapForBuilding elementMap,
       void f(DartType type, String name, ConstantValue defaultValue));
 }
 
-class FunctionDataImpl extends MemberDataImpl implements FunctionData {
+abstract class FunctionDataMixin implements FunctionData {
+  ir.FunctionNode get functionNode;
+  List<TypeVariableType> _typeVariables;
+
+  List<TypeVariableType> getFunctionTypeVariables(
+      covariant KernelToElementMapBase elementMap) {
+    if (_typeVariables == null) {
+      if (functionNode.typeParameters.isEmpty ||
+          !elementMap.options.strongMode) {
+        _typeVariables = const <TypeVariableType>[];
+      } else {
+        _typeVariables = functionNode.typeParameters
+            .map<TypeVariableType>((ir.TypeParameter typeParameter) {
+          return elementMap
+              .getDartType(new ir.TypeParameterType(typeParameter));
+        }).toList();
+      }
+    }
+    return _typeVariables;
+  }
+}
+
+class FunctionDataImpl extends MemberDataImpl
+    with FunctionDataMixin
+    implements FunctionData {
   final ir.FunctionNode functionNode;
   FunctionType _type;
 
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index 76b19b4..825c81f 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -51,6 +51,7 @@
   CompilerOptions _options;
   CompilerTask _compilerTask;
   KernelToElementMapForImpactImpl _elementMap;
+  RuntimeTypesNeedBuilder _runtimeTypesNeedBuilder;
 
   KernelAnnotationProcessor _annotationProcesser;
 
@@ -133,10 +134,13 @@
   }
 
   RuntimeTypesNeedBuilder createRuntimeTypesNeedBuilder() {
-    return new RuntimeTypesNeedBuilderImpl(
-        elementEnvironment, _elementMap.types);
+    return _runtimeTypesNeedBuilder ??=
+        new RuntimeTypesNeedBuilderImpl(elementEnvironment, _elementMap.types);
   }
 
+  RuntimeTypesNeedBuilder get runtimeTypesNeedBuilderForTesting =>
+      _runtimeTypesNeedBuilder;
+
   ResolutionWorldBuilder createResolutionWorldBuilder(
       NativeBasicData nativeBasicData,
       NativeDataBuilder nativeDataBuilder,
diff --git a/pkg/compiler/lib/src/parser/element_listener.dart b/pkg/compiler/lib/src/parser/element_listener.dart
index 1f516dc..d3d9476 100644
--- a/pkg/compiler/lib/src/parser/element_listener.dart
+++ b/pkg/compiler/lib/src/parser/element_listener.dart
@@ -414,6 +414,11 @@
         buildFieldElement, beginToken, endToken, hasParseError);
   }
 
+  @override
+  void handleInvalidTopLevelDeclaration(Token endToken) {
+    memberErrors = memberErrors.tail;
+  }
+
   void buildFieldElements(
       Modifiers modifiers,
       NodeList variables,
diff --git a/pkg/compiler/lib/src/resolution/resolution_strategy.dart b/pkg/compiler/lib/src/resolution/resolution_strategy.dart
index 1c4b55c..fd5efea 100644
--- a/pkg/compiler/lib/src/resolution/resolution_strategy.dart
+++ b/pkg/compiler/lib/src/resolution/resolution_strategy.dart
@@ -58,6 +58,7 @@
   final Compiler _compiler;
   final _CompilerElementEnvironment _elementEnvironment;
   final CommonElements commonElements;
+  RuntimeTypesNeedBuilder _runtimeTypesNeedBuilder;
 
   AnnotationProcessor _annotationProcessor;
 
@@ -128,10 +129,14 @@
       new MirrorsResolutionAnalysisImpl(backend, _compiler.resolution);
 
   RuntimeTypesNeedBuilder createRuntimeTypesNeedBuilder() {
-    return new ResolutionRuntimeTypesNeedBuilderImpl(
-        elementEnvironment, dartTypes);
+    return _runtimeTypesNeedBuilder ??=
+        new ResolutionRuntimeTypesNeedBuilderImpl(
+            elementEnvironment, dartTypes);
   }
 
+  RuntimeTypesNeedBuilder get runtimeTypesNeedBuilderForTesting =>
+      _runtimeTypesNeedBuilder;
+
   ResolutionWorldBuilder createResolutionWorldBuilder(
       NativeBasicData nativeBasicData,
       NativeDataBuilder nativeDataBuilder,
@@ -349,7 +354,7 @@
           }
         }
         return true;
-      }, failedAt(currentElement, message));
+      }(), failedAt(currentElement, message));
     }
     return new SourceSpan.fromTokens(uri, begin, end);
   }
@@ -730,6 +735,12 @@
   }
 
   @override
+  List<TypeVariableType> getFunctionTypeVariables(FunctionEntity function) {
+    throw new UnsupportedError(
+        "_CompilerElementEnvironment.getFunctionTypeVariables");
+  }
+
+  @override
   DartType getFieldType(covariant FieldElement field) {
     field.computeType(_resolution);
     return field.type;
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 0f0724b..aae6afd 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -371,6 +371,34 @@
     });
   }
 
+  /// Extend current method parameters with parameters for the function type
+  /// variables.
+  ///
+  /// TODO(johnniwinther): Do we need this?
+  /// If the method has type variables but does not need them, bind to `dynamic`
+  /// (represented as `null`).
+  void _addFunctionTypeVariablesIfNeeded(MemberEntity member) {
+    if (member is! FunctionEntity) return;
+
+    List<TypeVariableType> typeVariables =
+        _elementMap.elementEnvironment.getFunctionTypeVariables(member);
+    if (typeVariables.isEmpty) {
+      return;
+    }
+    bool needsRti = rtiNeed.methodNeedsGenericRti(member);
+    typeVariables.forEach((TypeVariableType typeVariableType) {
+      HInstruction param;
+      if (needsRti) {
+        param = addParameter(typeVariableType.element, commonMasks.nonNullType);
+      } else {
+        // Unused, so bind to `dynamic`.
+        param = graph.addConstantNull(closedWorld);
+      }
+      localsHandler.directLocals[
+          localsHandler.getTypeVariableAsLocal(typeVariableType)] = param;
+    });
+  }
+
   /// Builds a generative constructor.
   ///
   /// Generative constructors are built in stages, in effect inlining the
@@ -1023,6 +1051,8 @@
     open(block);
 
     _addClassTypeVariablesIfNeeded(member);
+    _addFunctionTypeVariablesIfNeeded(member);
+
     if (function != null) {
       _potentiallyAddFunctionParameterTypeChecks(function);
     }
@@ -2808,8 +2838,9 @@
 
   /// Build argument list in canonical order for a static [target], including
   /// filling in the default argument value.
-  List<HInstruction> _visitArgumentsForStaticTarget(
-      ir.FunctionNode target, ir.Arguments arguments) {
+  List<HInstruction> _visitArgumentsForStaticTarget(ir.FunctionNode target,
+      ir.Arguments arguments, SourceInformation sourceInformation,
+      {bool addFunctionTypeArguments: false}) {
     // Visit arguments in source order, then re-order and fill in defaults.
     var values = _visitPositionalArguments(arguments);
 
@@ -2848,6 +2879,9 @@
       assert(arguments.named.isEmpty);
     }
 
+    if (options.strongMode && addFunctionTypeArguments) {
+      _addTypeArguments(values, arguments, sourceInformation);
+    }
     return values;
   }
 
@@ -2883,7 +2917,9 @@
     List<HInstruction> arguments = closedWorld.nativeData
             .isJsInteropMember(function)
         ? _visitArgumentsForNativeStaticTarget(target.function, node.arguments)
-        : _visitArgumentsForStaticTarget(target.function, node.arguments);
+        : _visitArgumentsForStaticTarget(
+            target.function, node.arguments, sourceInformation,
+            addFunctionTypeArguments: rtiNeed.methodNeedsGenericRti(function));
 
     // Error in the arguments provided. Do not process further.
     if (arguments == null) {
@@ -3913,7 +3949,7 @@
       return;
     }
     List<HInstruction> arguments = _visitArgumentsForStaticTarget(
-        node.interfaceTarget.function, node.arguments);
+        node.interfaceTarget.function, node.arguments, sourceInformation);
     _buildInvokeSuper(
         _elementMap.getSelector(node),
         _elementMap.getClass(_containingClass(node)),
@@ -4037,8 +4073,8 @@
       // Native class generative constructors take a pre-constructed object.
       arguments.add(graph.addConstantNull(closedWorld));
     }
-    arguments.addAll(
-        _visitArgumentsForStaticTarget(target.function, node.arguments));
+    arguments.addAll(_visitArgumentsForStaticTarget(
+        target.function, node.arguments, sourceInformation));
     if (commonElements.isSymbolConstructor(constructor)) {
       constructor = commonElements.symbolValidatedConstructor;
     }
@@ -4636,6 +4672,14 @@
             localsHandler.getTypeVariableAsLocal(typeVariable), argument);
       });
     }
+    if (rtiNeed.methodNeedsGenericRti(function) && options.strongMode) {
+      for (TypeVariableType typeVariable in _elementMap.elementEnvironment
+          .getFunctionTypeVariables(function)) {
+        HInstruction argument = compiledArguments[argumentIndex++];
+        localsHandler.updateLocal(
+            localsHandler.getTypeVariableAsLocal(typeVariable), argument);
+      }
+    }
     assert(argumentIndex == compiledArguments.length);
 
     _returnType =
diff --git a/pkg/compiler/lib/src/ssa/switch_continue_analysis.dart b/pkg/compiler/lib/src/ssa/switch_continue_analysis.dart
index e11b8f4..1efc255 100644
--- a/pkg/compiler/lib/src/ssa/switch_continue_analysis.dart
+++ b/pkg/compiler/lib/src/ssa/switch_continue_analysis.dart
@@ -95,7 +95,6 @@
   bool defaultStatement(ir.Statement node) {
     if (node is ir.ExpressionStatement ||
         node is ir.EmptyStatement ||
-        node is ir.InvalidStatement ||
         node is ir.BreakStatement ||
         node is ir.ReturnStatement ||
         node is ir.AssertStatement ||
diff --git a/pkg/compiler/lib/src/ssa/type_builder.dart b/pkg/compiler/lib/src/ssa/type_builder.dart
index 6d7945c..c005b86 100644
--- a/pkg/compiler/lib/src/ssa/type_builder.dart
+++ b/pkg/compiler/lib/src/ssa/type_builder.dart
@@ -102,7 +102,8 @@
       TypeVariableType type, MemberEntity member,
       {SourceInformation sourceInformation}) {
     assert(assertTypeInContext(type));
-    if (type.element.typeDeclaration is! ClassEntity) {
+    if (type.element.typeDeclaration is! ClassEntity &&
+        !builder.options.strongMode) {
       // GENERIC_METHODS:  We currently don't reify method type variables.
       return builder.graph.addConstantNull(builder.closedWorld);
     }
@@ -121,8 +122,12 @@
           .readLocal(typeVariableLocal, sourceInformation: sourceInformation);
     }
 
-    ClassTypeVariableAccess typeVariableAccess =
-        computeTypeVariableAccess(member);
+    ClassTypeVariableAccess typeVariableAccess;
+    if (type.element.typeDeclaration is ClassEntity) {
+      typeVariableAccess = computeTypeVariableAccess(member);
+    } else {
+      typeVariableAccess = ClassTypeVariableAccess.parameter;
+    }
     switch (typeVariableAccess) {
       case ClassTypeVariableAccess.parameter:
         return readAsParameter();
diff --git a/pkg/compiler/testing.json b/pkg/compiler/testing.json
index 2b05936..9a4b50d 100644
--- a/pkg/compiler/testing.json
+++ b/pkg/compiler/testing.json
@@ -15,6 +15,7 @@
 
     "exclude": [
       "^tests/compiler/dart2js/data/.*",
+      "^tests/compiler/dart2js/inference/data/super_invoke\\.dart",
       "^tests/compiler/dart2js/path with spaces/.*"
     ]
   }
diff --git a/pkg/compiler/testing_dart.json b/pkg/compiler/testing_dart.json
index 736a55f..3441f2a 100644
--- a/pkg/compiler/testing_dart.json
+++ b/pkg/compiler/testing_dart.json
@@ -48,6 +48,7 @@
       "^tests/compiler/dart2js/serialization/equivalence_test\\.dart",
       "^tests/compiler/dart2js/serialization/model_test_helper\\.dart",
       "^tests/compiler/dart2js/serialization/test_helper\\.dart",
+      "^tests/compiler/dart2js/inference/data/super_invoke\\.dart",
       "^tests/compiler/dart2js/inference/simple_inferrer_closure_test\\.dart",
       "^tests/compiler/dart2js/inference/simple_inferrer_const_closure2_test\\.dart",
       "^tests/compiler/dart2js/inference/simple_inferrer_const_closure_test\\.dart",
diff --git a/pkg/dev_compiler/lib/src/analyzer/ast_builder.dart b/pkg/dev_compiler/lib/src/analyzer/ast_builder.dart
index 4e1fe71..ec7174d 100644
--- a/pkg/dev_compiler/lib/src/analyzer/ast_builder.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/ast_builder.dart
@@ -7,12 +7,9 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:logging/logging.dart' as logger;
 
 export 'package:analyzer/dart/ast/standard_ast_factory.dart';
 
-final _log = new logger.Logger('dev_compiler.ast_builder');
-
 final ast = new AstBuilder();
 
 class AstBuilder {
diff --git a/pkg/dev_compiler/lib/src/analyzer/context.dart b/pkg/dev_compiler/lib/src/analyzer/context.dart
index aa9d84b..8c6e135 100644
--- a/pkg/dev_compiler/lib/src/analyzer/context.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/context.dart
@@ -2,23 +2,25 @@
 // 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:args/args.dart' show ArgParser, ArgResults;
-import 'package:analyzer/src/command_line/arguments.dart';
 import 'package:analyzer/file_system/file_system.dart'
     show ResourceProvider, ResourceUriResolver;
 import 'package:analyzer/file_system/physical_file_system.dart'
     show PhysicalResourceProvider;
 import 'package:analyzer/source/custom_resolver.dart';
 import 'package:analyzer/source/package_map_resolver.dart';
+import 'package:analyzer/src/command_line/arguments.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/source.dart'
     show DartUriResolver, SourceFactory, UriResolver;
 import 'package:analyzer/src/summary/package_bundle_reader.dart'
     show InSummaryUriResolver, SummaryDataStore;
+import 'package:args/args.dart' show ArgParser, ArgResults;
 import 'package:cli_util/cli_util.dart' show getSdkDir;
 import 'package:path/path.dart' as path;
 
+// ignore_for_file: deprecated_member_use
+
 /// Options used to set up Source URI resolution in the analysis context.
 class AnalyzerOptions {
   final ContextBuilderOptions contextBuilderOptions;
diff --git a/pkg/dev_compiler/lib/src/analyzer/reify_coercions.dart b/pkg/dev_compiler/lib/src/analyzer/reify_coercions.dart
index 11476a8..4192eb5 100644
--- a/pkg/dev_compiler/lib/src/analyzer/reify_coercions.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/reify_coercions.dart
@@ -11,13 +11,10 @@
 import 'package:analyzer/src/dart/element/type.dart' show DynamicTypeImpl;
 import 'package:analyzer/src/generated/parser.dart' show ResolutionCopier;
 import 'package:analyzer/src/task/strong/ast_properties.dart' as ast_properties;
-import 'package:logging/logging.dart' as logger;
 
 import 'ast_builder.dart';
 import 'element_helpers.dart' show isInlineJS;
 
-final _log = new logger.Logger('dev_compiler.reify_coercions');
-
 // This class implements a pass which modifies (in place) the ast replacing
 // abstract coercion nodes with their dart implementations.
 class CoercionReifier extends analyzer.GeneralizingAstVisitor<Object> {
diff --git a/pkg/dev_compiler/lib/src/analyzer/source_map_printer.dart b/pkg/dev_compiler/lib/src/analyzer/source_map_printer.dart
index d2933f8..20d4a7b 100644
--- a/pkg/dev_compiler/lib/src/analyzer/source_map_printer.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/source_map_printer.dart
@@ -3,11 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:collection';
+
 import 'package:analyzer/dart/ast/ast.dart'
     show AstNode, CompilationUnit, Identifier;
 import 'package:analyzer/dart/element/element.dart'
     show Element, CompilationUnitElement;
-import 'package:analyzer/src/generated/source.dart' show LineInfo, Source;
+import 'package:analyzer/src/generated/source.dart' show LineInfo;
 import 'package:source_maps/source_maps.dart' hide Printer;
 import 'package:source_span/source_span.dart' show SourceLocation;
 
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index c25dd88..1d5f990 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -32,7 +32,7 @@
     {fe.InitializedCompilerState compilerState}) async {
   try {
     return await _compile(args, compilerState: compilerState);
-  } catch (error) {
+  } catch (error, stackTrace) {
     print('''
 We're sorry, you've found a bug in our compiler.
 You can report this bug at:
@@ -42,6 +42,9 @@
 -------------------- %< --------------------
     $_binaryName arguments: ${args.join(' ')}
     dart --version: ${Platform.version}
+
+$error
+$stackTrace
 ''');
     rethrow;
   }
@@ -53,6 +56,7 @@
     'Usage: $_binaryName [options...] <sources...>\n\n'
     '${ddcArgParser.usage}';
 
+/// Resolve [s] as a URI, possibly relative to the current directory.
 Uri stringToUri(String s, {bool windows}) {
   windows ??= Platform.isWindows;
   if (windows) {
@@ -67,6 +71,32 @@
   return result;
 }
 
+/// Resolve [s] as a URI, and if the URI is a uri under a directory in [roots],
+/// then return a custom URI containing only the subpath from that root and the
+/// provided [scheme]. For example,
+///
+///    stringToCustomUri('a/b/c.dart', [Uri.base.resolve('a/')], 'foo')
+///
+/// returns:
+///
+///    foo:/b/c.dart
+///
+/// This is used to create machine agnostic URIs both for input files and for
+/// summaries. We do so for input files to ensure we don't leak any
+/// user-specific paths into non-package library names, and we do so for input
+/// summaries to be able to easily derive a module name from the summary path.
+Uri stringToCustomUri(String s, List<Uri> roots, String scheme) {
+  Uri resolvedUri = stringToUri(s);
+  if (resolvedUri.scheme != 'file') return resolvedUri;
+  for (var root in roots) {
+    if (resolvedUri.path.startsWith(root.path)) {
+      var path = resolvedUri.path.substring(root.path.length);
+      return Uri.parse('$scheme:///$path');
+    }
+  }
+  return resolvedUri;
+}
+
 class CompilerResult {
   final fe.InitializedCompilerState compilerState;
   final bool result;
@@ -86,8 +116,13 @@
     ..addOption('dart-sdk-summary',
         help: 'The path to the Dart SDK summary file.', hide: true)
     ..addOption('summary',
-        abbr: 's', help: 'summaries to link to', allowMultiple: true)
-    ..addFlag('source-map', help: 'emit source mapping', defaultsTo: true);
+        abbr: 's',
+        help: 'path to a summary of a transitive dependency of this module.\n'
+            'This path should be under a provided summary-input-dir',
+        allowMultiple: true)
+    ..addFlag('source-map', help: 'emit source mapping', defaultsTo: true)
+    ..addOption('summary-input-dir', allowMultiple: true)
+    ..addOption('custom-app-scheme', defaultsTo: 'org-dartlang-app');
 
   addModuleFormatOptions(argParser, singleOutFile: false);
 
@@ -102,8 +137,20 @@
   var moduleFormat = parseModuleFormatOption(argResults).first;
   var ddcPath = path.dirname(path.dirname(path.fromUri(Platform.script)));
 
-  var summaryUris =
-      (argResults['summary'] as List<String>).map(stringToUri).toList();
+  var multiRoots = [];
+  for (var s in argResults['summary-input-dir']) {
+    var uri = stringToUri(s);
+    if (!uri.path.endsWith('/')) {
+      uri = uri.replace(path: '${uri.path}/');
+    }
+    multiRoots.add(uri);
+  }
+  multiRoots.add(Uri.base);
+
+  var customScheme = argResults['custom-app-scheme'];
+  var summaryUris = argResults['summary']
+      .map((s) => stringToCustomUri(s, multiRoots, customScheme))
+      .toList();
 
   var sdkSummaryPath = argResults['dart-sdk-summary'] ??
       path.absolute(ddcPath, 'gen', 'sdk', 'ddc_sdk.dill');
@@ -111,7 +158,9 @@
   var packageFile =
       argResults['packages'] ?? path.absolute(ddcPath, '..', '..', '.packages');
 
-  var inputs = argResults.rest.map(stringToUri).toList();
+  var inputs = argResults.rest
+      .map((s) => stringToCustomUri(s, [Uri.base], customScheme))
+      .toList();
 
   var succeeded = true;
   void errorHandler(fe.CompilationMessage error) {
@@ -129,16 +178,13 @@
   // lib folder). The following [FileSystem] will resolve those references to
   // the correct location and keeps the real file location hidden from the
   // front end.
-  // TODO(sigmund): technically we don't need a "multi-root" file system,
-  // because we are providing a single root, the alternative here is to
-  // implement a new file system with a single root instead.
   var fileSystem = new MultiRootFileSystem(
-      'org-dartlang-app', [Uri.base], PhysicalFileSystem.instance);
+      customScheme, multiRoots, PhysicalFileSystem.instance);
 
   compilerState = await fe.initializeCompiler(
       compilerState,
-      path.toUri(sdkSummaryPath),
-      path.toUri(packageFile),
+      stringToUri(sdkSummaryPath),
+      stringToUri(packageFile),
       summaryUris,
       new DevCompilerTarget(),
       fileSystem: fileSystem);
@@ -161,7 +207,8 @@
   var jsCode = jsProgramToCode(jsModule, moduleFormat,
       buildSourceMap: argResults['source-map'],
       jsUrl: path.toUri(output).toString(),
-      mapUrl: path.toUri(output + '.map').toString());
+      mapUrl: path.toUri(output + '.map').toString(),
+      customScheme: customScheme);
   file.writeAsStringSync(jsCode.code);
 
   if (jsCode.sourceMap != null) {
@@ -199,7 +246,10 @@
 }
 
 JSCode jsProgramToCode(JS.Program moduleTree, ModuleFormat format,
-    {bool buildSourceMap: false, String jsUrl, String mapUrl}) {
+    {bool buildSourceMap: false,
+    String jsUrl,
+    String mapUrl,
+    String customScheme}) {
   var opts = new JS.JavaScriptPrintingOptions(
       allowKeywordsInProperties: true, allowSingleLineIfStatements: true);
   var printer;
@@ -218,8 +268,8 @@
 
   Map builtMap;
   if (buildSourceMap && sourceMap != null) {
-    builtMap =
-        placeSourceMap(sourceMap.build(jsUrl), mapUrl, <String, String>{});
+    builtMap = placeSourceMap(
+        sourceMap.build(jsUrl), mapUrl, <String, String>{}, customScheme);
     var jsDir = path.dirname(path.fromUri(jsUrl));
     var relative = path.relative(path.fromUri(mapUrl), from: jsDir);
     var relativeMapUrl = path.toUri(relative).toString();
@@ -239,18 +289,23 @@
 /// and returns the new map.  Relative paths are in terms of URIs ('/'), not
 /// local OS paths (e.g., windows '\').
 // TODO(jmesserly): find a new home for this.
-Map placeSourceMap(
-    Map sourceMap, String sourceMapPath, Map<String, String> bazelMappings) {
+// TODO(sigmund): delete bazelMappings - customScheme should be used instead.
+Map placeSourceMap(Map sourceMap, String sourceMapPath,
+    Map<String, String> bazelMappings, String customScheme) {
   var map = new Map.from(sourceMap);
   // Convert to a local file path if it's not.
-  sourceMapPath = path.fromUri(_sourceToUri(sourceMapPath));
+  sourceMapPath = path.fromUri(_sourceToUri(sourceMapPath, customScheme));
   var sourceMapDir = path.dirname(path.absolute(sourceMapPath));
   var list = new List.from(map['sources']);
   map['sources'] = list;
 
   String makeRelative(String sourcePath) {
-    var uri = _sourceToUri(sourcePath);
-    if (uri.scheme == 'dart' || uri.scheme == 'package') return sourcePath;
+    var uri = _sourceToUri(sourcePath, customScheme);
+    if (uri.scheme == 'dart' ||
+        uri.scheme == 'package' ||
+        uri.scheme == customScheme) {
+      return sourcePath;
+    }
 
     // Convert to a local file path if it's not.
     sourcePath = path.absolute(path.fromUri(uri));
@@ -276,20 +331,19 @@
 /// This was copied from module_compiler.dart.
 /// Convert a source string to a Uri.  The [source] may be a Dart URI, a file
 /// URI, or a local win/mac/linux path.
-Uri _sourceToUri(String source) {
+Uri _sourceToUri(String source, customScheme) {
   var uri = Uri.parse(source);
   var scheme = uri.scheme;
-  switch (scheme) {
-    case "dart":
-    case "package":
-    case "file":
-      // A valid URI.
-      return uri;
-    default:
-      // Assume a file path.
-      // TODO(jmesserly): shouldn't this be `path.toUri(path.absolute)`?
-      return new Uri.file(path.absolute(source));
+  if (scheme == "dart" ||
+      scheme == "package" ||
+      scheme == "file" ||
+      scheme == customScheme) {
+    // A valid URI.
+    return uri;
   }
+  // Assume a file path.
+  // TODO(jmesserly): shouldn't this be `path.toUri(path.absolute)`?
+  return new Uri.file(path.absolute(source));
 }
 
 /// Parses Dart's non-standard `-Dname=value` syntax for declared variables,
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 6e97625..024bcb1 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -4,14 +4,15 @@
 
 import 'dart:collection';
 import 'dart:math' show max, min;
-import 'package:kernel/kernel.dart' hide ConstantVisitor;
+
+import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
+import 'package:kernel/kernel.dart' hide ConstantVisitor;
+import 'package:kernel/src/incremental_class_hierarchy.dart';
 import 'package:kernel/type_algebra.dart';
 import 'package:kernel/type_environment.dart';
-import 'package:kernel/src/incremental_class_hierarchy.dart';
-import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
-import 'package:path/path.dart' as path;
+
 import '../compiler/js_names.dart' as JS;
 import '../compiler/js_utils.dart' as JS;
 import '../compiler/module_builder.dart' show pathToJSIdentifier;
@@ -340,7 +341,13 @@
     // TODO(jmesserly): look up the appropriate relative import path if the user
     // specified that on the command line.
     var uri = _summaryToUri[summary];
-    var moduleName = path.basenameWithoutExtension(path.fromUri(uri));
+    var summaryPath = uri.path;
+    var extensionIndex = summaryPath.lastIndexOf('.');
+    // Note: These URIs do not contain absolute paths from the physical file
+    // system, but only the relevant path within a user's project. This path
+    // will match the path where the .js file is generated, so we use it as
+    // the module name.
+    var moduleName = summaryPath.substring(1, extensionIndex);
     return moduleName;
   }
 
@@ -3000,9 +3007,6 @@
   defaultStatement(Statement node) => _emitInvalidNode(node).toStatement();
 
   @override
-  visitInvalidStatement(InvalidStatement node) => defaultStatement(node);
-
-  @override
   visitExpressionStatement(ExpressionStatement node) =>
       _visitAndMarkExpression(node.expression).toStatement();
 
@@ -4763,6 +4767,11 @@
   }
 
   @override
+  visitInstantiation(Instantiation node) {
+    return defaultExpression(node);
+  }
+
+  @override
   visitLoadLibrary(LoadLibrary node) => _callHelper('loadLibrary()');
 
   // TODO(jmesserly): DDC loads all libraries eagerly.
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 3fb3927..cb4f95b 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -70,7 +70,7 @@
   Expression instantiateInvocation(CoreTypes coreTypes, Expression receiver,
       String name, Arguments arguments, int offset, bool isSuper) {
     // TODO(sigmund): implement;
-    return new InvalidExpression();
+    return new InvalidExpression(null);
   }
 
   @override
@@ -87,6 +87,6 @@
       bool isConstructor: false,
       bool isTopLevel: false}) {
     // TODO(sigmund): implement;
-    return new InvalidExpression();
+    return new InvalidExpression(null);
   }
 }
diff --git a/pkg/dev_compiler/test/codegen_test.dart b/pkg/dev_compiler/test/codegen_test.dart
index 9dabf3a..6e270c9 100644
--- a/pkg/dev_compiler/test/codegen_test.dart
+++ b/pkg/dev_compiler/test/codegen_test.dart
@@ -168,7 +168,9 @@
       // some static error is produced.
       var intentionalCompileError =
           (contents.contains(': compile-time error') ||
-                  contents.contains('/*@compile-error=')) &&
+                  // Use adjacent strings so test.dart doesn't match this line
+                  // as an expected compile error.
+                  contents.contains('/*@' 'compile-error=')) &&
               !status.contains(Expectation.missingCompileTimeError);
 
       var crashing = status.contains(Expectation.crash);
diff --git a/pkg/front_end/lib/src/api_unstable/summary_worker.dart b/pkg/front_end/lib/src/api_unstable/summary_worker.dart
index 33c09af..b34fc82 100644
--- a/pkg/front_end/lib/src/api_unstable/summary_worker.dart
+++ b/pkg/front_end/lib/src/api_unstable/summary_worker.dart
@@ -56,6 +56,6 @@
   processedOpts.inputs.addAll(inputs);
 
   var result = await generateKernel(processedOpts,
-      buildSummary: true, buildProgram: false);
+      buildSummary: true, buildProgram: false, truncateSummary: true);
   return result?.summary;
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/library_builder.dart b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
index 7a77519..dbbc106 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -174,6 +174,14 @@
 
   int finishTypeVariables(ClassBuilder object) => 0;
 
+  /// This method instantiates type parameters to their bounds in some cases
+  /// where they were omitted by the programmer and not provided by the type
+  /// inference.  The method returns the number of distinct type variables
+  /// that were instantiated in this library.
+  int instantiateToBound(TypeBuilder dynamicType, ClassBuilder objectClass) {
+    return 0;
+  }
+
   void becomeCoreLibrary(dynamicType) {
     if (scope.local["dynamic"] == null) {
       addBuilder("dynamic",
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index 35c1851..eca2778 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -17,7 +17,7 @@
 abstract class NamedTypeBuilder<T extends TypeBuilder, R> extends TypeBuilder {
   final Object name;
 
-  final List<T> arguments;
+  List<T> arguments;
 
   TypeDeclarationBuilder<T, R> builder;
 
diff --git a/pkg/front_end/lib/src/fasta/dill/built_type_builder.dart b/pkg/front_end/lib/src/fasta/dill/built_type_builder.dart
new file mode 100644
index 0000000..2117d24
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/dill/built_type_builder.dart
@@ -0,0 +1,38 @@
+// 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.
+
+library fasta.built_type_builder;
+
+import 'package:kernel/ast.dart' show DartType, Supertype;
+
+import '../kernel/kernel_builder.dart' show KernelTypeBuilder, LibraryBuilder;
+
+import '../problems.dart' show unimplemented;
+
+class BuiltTypeBuilder extends KernelTypeBuilder {
+  final DartType builtType;
+
+  BuiltTypeBuilder(this.builtType);
+
+  DartType build(LibraryBuilder library) => builtType;
+
+  Supertype buildSupertype(
+      LibraryBuilder library, int charOffset, Uri fileUri) {
+    return unimplemented("buildSupertype", -1, null);
+  }
+
+  buildInvalidType(int charOffset, Uri fileUri) {
+    return unimplemented("buildInvalidType", -1, null);
+  }
+
+  String get debugName => "BuiltTypeBuilder";
+
+  StringBuffer printOn(StringBuffer buffer) {
+    return buffer..write(builtType.toString());
+  }
+
+  String get name {
+    return unimplemented("name", -1, null);
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/dill/built_type_variable_builder.dart b/pkg/front_end/lib/src/fasta/dill/built_type_variable_builder.dart
new file mode 100644
index 0000000..0776650
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/dill/built_type_variable_builder.dart
@@ -0,0 +1,44 @@
+// 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.
+
+library fasta.built_type_variable_builder;
+
+import 'package:kernel/ast.dart'
+    show DartType, TypeParameter, TypeParameterType;
+
+import '../kernel/kernel_builder.dart'
+    show
+        TypeVariableBuilder,
+        KernelTypeBuilder,
+        LibraryBuilder,
+        KernelNamedTypeBuilder,
+        KernelLibraryBuilder;
+
+class BuiltTypeVariableBuilder
+    extends TypeVariableBuilder<KernelTypeBuilder, DartType> {
+  final TypeParameter builtTypeParameter;
+
+  TypeParameter get target => builtTypeParameter;
+
+  BuiltTypeVariableBuilder(String name, this.builtTypeParameter,
+      KernelLibraryBuilder compilationUnit, int charOffset,
+      [KernelTypeBuilder bound])
+      : super(name, bound, compilationUnit, charOffset);
+
+  DartType buildType(
+      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
+    // TODO(dmitryas): Do we need a check for [arguments] here?
+    return new TypeParameterType(builtTypeParameter);
+  }
+
+  DartType buildTypesWithBuiltArguments(
+      LibraryBuilder library, List<DartType> arguments) {
+    // TODO(dmitryas): Do we need a check for [arguments] here?
+    return new TypeParameterType(builtTypeParameter);
+  }
+
+  KernelTypeBuilder asTypeBuilder() {
+    return new KernelNamedTypeBuilder(name, null)..bind(this);
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
index 455d2f7..8605dcb 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
@@ -1,15 +1,22 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
 library fasta.dill_class_builder;
 
-import 'package:kernel/ast.dart' show Class, Member;
+import 'package:kernel/ast.dart' show Class, Member, TypeParameter, DartType;
+
+import 'package:kernel/type_algebra.dart' show calculateBounds;
 
 import '../problems.dart' show unimplemented;
 
 import '../kernel/kernel_builder.dart'
-    show MemberBuilder, KernelClassBuilder, KernelTypeBuilder, Scope;
+    show
+        MemberBuilder,
+        KernelClassBuilder,
+        KernelTypeBuilder,
+        Scope,
+        TypeVariableBuilder;
 
 import '../modifier.dart' show abstractMask;
 
@@ -17,6 +24,10 @@
 
 import 'dill_library_builder.dart' show DillLibraryBuilder;
 
+import 'built_type_variable_builder.dart' show BuiltTypeVariableBuilder;
+
+import 'built_type_builder.dart' show BuiltTypeBuilder;
+
 class DillClassBuilder extends KernelClassBuilder {
   final Class cls;
 
@@ -51,6 +62,24 @@
     }
   }
 
+  List<TypeVariableBuilder> get typeVariables {
+    DillLibraryBuilder parentLibraryBuilder = parent;
+    DillClassBuilder objectClassBuilder =
+        parentLibraryBuilder.loader.coreLibrary["Object"];
+    Class objectClass = objectClassBuilder.cls;
+    List<TypeParameter> targetTypeParameters = target.typeParameters;
+    List<DartType> calculatedBounds =
+        calculateBounds(targetTypeParameters, objectClass);
+    List<TypeVariableBuilder> typeVariables =
+        new List<BuiltTypeVariableBuilder>(targetTypeParameters.length);
+    for (int i = 0; i < typeVariables.length; i++) {
+      TypeParameter parameter = targetTypeParameters[i];
+      typeVariables[i] = new BuiltTypeVariableBuilder(parameter.name, parameter,
+          null, charOffset, new BuiltTypeBuilder(calculatedBounds[i]));
+    }
+    return typeVariables;
+  }
+
   /// Returns true if this class is the result of applying a mixin to its
   /// superclass.
   bool get isMixinApplication => cls.isMixinApplication;
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_typedef_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_typedef_builder.dart
index d73fe7b..66b097c 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_typedef_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_typedef_builder.dart
@@ -4,7 +4,9 @@
 
 library fasta.dill_typedef_builder;
 
-import 'package:kernel/ast.dart' show DartType, Typedef;
+import 'package:kernel/ast.dart' show DartType, Typedef, TypeParameter, Class;
+
+import 'package:kernel/type_algebra.dart' show calculateBounds;
 
 import '../kernel/kernel_builder.dart'
     show
@@ -18,6 +20,12 @@
 
 import 'dill_library_builder.dart' show DillLibraryBuilder;
 
+import 'dill_class_builder.dart' show DillClassBuilder;
+
+import 'built_type_variable_builder.dart' show BuiltTypeVariableBuilder;
+
+import 'built_type_builder.dart' show BuiltTypeBuilder;
+
 class DillFunctionTypeAliasBuilder extends KernelFunctionTypeAliasBuilder {
   DillFunctionTypeAliasBuilder(Typedef typedef, DillLibraryBuilder parent)
       : super(null, typedef.name, null, null, parent, typedef.fileOffset,
@@ -29,7 +37,21 @@
 
   @override
   List<TypeVariableBuilder> get typeVariables {
-    return unimplemented("typeVariables", -1, null);
+    DillLibraryBuilder parentLibraryBuilder = parent;
+    DillClassBuilder objectClassBuilder =
+        parentLibraryBuilder.loader.coreLibrary["Object"];
+    Class objectClass = objectClassBuilder.cls;
+    List<TypeParameter> targetTypeParameters = target.typeParameters;
+    List<DartType> calculatedBounds =
+        calculateBounds(targetTypeParameters, objectClass);
+    List<TypeVariableBuilder> typeVariables =
+        new List<BuiltTypeVariableBuilder>(targetTypeParameters.length);
+    for (int i = 0; i < typeVariables.length; i++) {
+      TypeParameter parameter = targetTypeParameters[i];
+      typeVariables[i] = new BuiltTypeVariableBuilder(parameter.name, parameter,
+          null, charOffset, new BuiltTypeBuilder(calculatedBounds[i]));
+    }
+    return typeVariables;
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
index dad91b9..f84087b 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -1064,6 +1064,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageEmptyNamedParameterList = const MessageCode(
     "EmptyNamedParameterList",
+    analyzerCode: "MISSING_IDENTIFIER",
     dart2jsCode: "EMPTY_NAMED_PARAMETER_LIST",
     message: r"""Named parameter lists cannot be empty.""",
     tip: r"""Try adding a named parameter to the list.""");
@@ -1075,6 +1076,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageEmptyOptionalParameterList = const MessageCode(
     "EmptyOptionalParameterList",
+    analyzerCode: "MISSING_IDENTIFIER",
     dart2jsCode: "EMPTY_OPTIONAL_PARAMETER_LIST",
     message: r"""Optional parameter lists cannot be empty.""",
     tip: r"""Try adding an optional parameter to the list.""");
@@ -3278,10 +3280,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeNotAType =
-    const Code<Message Function(String name)>(
-  "NotAType",
-  templateNotAType,
-);
+    const Code<Message Function(String name)>("NotAType", templateNotAType,
+        analyzerCode: "NOT_A_TYPE");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsNotAType(String name) {
@@ -3543,6 +3543,97 @@
 const Template<
     Message Function(
         String name,
+        String name2,
+        DartType _type,
+        DartType
+            _type2)> templateOverrideTypeMismatchParameter = const Template<
+        Message Function(String name, String name2, DartType _type,
+            DartType _type2)>(
+    messageTemplate:
+        r"""The parameter '#name' of the method '#name2' has type #type, which does not match the corresponding type in the overridden method (#type2).""",
+    tipTemplate:
+        r"""Change to a supertype of #type2 (or, for a covariant parameter, a subtype).""",
+    withArguments: _withArgumentsOverrideTypeMismatchParameter);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            String name, String name2, DartType _type, DartType _type2)>
+    codeOverrideTypeMismatchParameter = const Code<
+            Message Function(
+                String name, String name2, DartType _type, DartType _type2)>(
+        "OverrideTypeMismatchParameter", templateOverrideTypeMismatchParameter,
+        analyzerCode: "INVALID_METHOD_OVERRIDE", dart2jsCode: "*ignored*");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsOverrideTypeMismatchParameter(
+    String name, String name2, DartType _type, DartType _type2) {
+  NameSystem nameSystem = new NameSystem();
+  StringBuffer buffer = new StringBuffer();
+  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
+  String type = '$buffer';
+
+  buffer = new StringBuffer();
+  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
+  String type2 = '$buffer';
+
+  return new Message(codeOverrideTypeMismatchParameter,
+      message:
+          """The parameter '$name' of the method '$name2' has type $type, which does not match the corresponding type in the overridden method ($type2).""",
+      tip: """Change to a supertype of $type2 (or, for a covariant parameter, a subtype).""",
+      arguments: {
+        'name': name,
+        'name2': name2,
+        'type': _type,
+        'type2': _type2
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String name,
+        DartType _type,
+        DartType
+            _type2)> templateOverrideTypeMismatchReturnType = const Template<
+        Message Function(String name, DartType _type, DartType _type2)>(
+    messageTemplate:
+        r"""The return type of the method '#name' is #type, which does not match the return type of the overridden method (#type2).""",
+    tipTemplate: r"""Change to a subtype of #type2.""",
+    withArguments: _withArgumentsOverrideTypeMismatchReturnType);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, DartType _type, DartType _type2)>
+    codeOverrideTypeMismatchReturnType =
+    const Code<Message Function(String name, DartType _type, DartType _type2)>(
+        "OverrideTypeMismatchReturnType",
+        templateOverrideTypeMismatchReturnType,
+        analyzerCode: "INVALID_METHOD_OVERRIDE",
+        dart2jsCode: "*ignored*");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsOverrideTypeMismatchReturnType(
+    String name, DartType _type, DartType _type2) {
+  NameSystem nameSystem = new NameSystem();
+  StringBuffer buffer = new StringBuffer();
+  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
+  String type = '$buffer';
+
+  buffer = new StringBuffer();
+  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
+  String type2 = '$buffer';
+
+  return new Message(codeOverrideTypeMismatchReturnType,
+      message:
+          """The return type of the method '$name' is $type, which does not match the return type of the overridden method ($type2).""",
+      tip: """Change to a subtype of $type2.""",
+      arguments: {'name': name, 'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String name,
         String
             name2)> templateOverrideTypeVariablesMismatch = const Template<
         Message Function(String name, String name2)>(
@@ -4251,9 +4342,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeSuperclassHasNoMethod =
     const Code<Message Function(String name)>(
-  "SuperclassHasNoMethod",
-  templateSuperclassHasNoMethod,
-);
+        "SuperclassHasNoMethod", templateSuperclassHasNoMethod,
+        analyzerCode: "UNDEFINED_SUPER_METHOD");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSuperclassHasNoMethod(String name) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index d960ce9..6184d00 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -4,8 +4,9 @@
 
 library fasta.body_builder;
 
-import 'package:kernel/ast.dart'
-    hide InvalidExpression, InvalidInitializer, InvalidStatement;
+import 'package:kernel/ast.dart' hide InvalidExpression, InvalidInitializer;
+
+import 'package:kernel/type_algebra.dart' show instantiateToBounds;
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
@@ -1715,6 +1716,8 @@
         typeArgument = null;
         warningNotError(fasta.messageListLiteralTooManyTypeArguments,
             beginToken.charOffset);
+      } else {
+        typeArgument = instantiateToBounds(typeArgument, coreTypes.objectClass);
       }
     }
     bool isConst = constKeyword != null;
@@ -1763,8 +1766,9 @@
         warningNotError(fasta.messageListLiteralTypeArgumentMismatch,
             beginToken.charOffset);
       } else {
-        keyType = typeArguments[0];
-        valueType = typeArguments[1];
+        keyType = instantiateToBounds(typeArguments[0], coreTypes.objectClass);
+        valueType =
+            instantiateToBounds(typeArguments[1], coreTypes.objectClass);
       }
     }
 
@@ -2316,7 +2320,8 @@
       var prefix = type[0];
       identifier = type[1];
       if (prefix is PrefixBuilder) {
-        type = scopeLookup(prefix.exportScope, identifier.name, start,
+        type = scopeLookup(
+            prefix.exportScope, identifier.name, identifier.token,
             isQualified: true, prefix: prefix);
         identifier = null;
       } else if (prefix is TypeDeclarationAccessor) {
@@ -2364,7 +2369,8 @@
         return deprecated_buildCompileTimeError(
             "Not a const constructor.", charOffset);
       }
-      return new ShadowConstructorInvocation(target, initialTarget, arguments,
+      return new ShadowConstructorInvocation(
+          prefixName, target, initialTarget, arguments,
           isConst: isConst)
         ..fileOffset = charOffset;
     } else {
@@ -2374,7 +2380,7 @@
             "Not a const factory.", charOffset);
       } else if (procedure.isFactory) {
         return new ShadowFactoryConstructorInvocation(
-            target, initialTarget, arguments,
+            prefixName, target, initialTarget, arguments,
             isConst: isConst)
           ..fileOffset = charOffset;
       } else {
@@ -2459,11 +2465,18 @@
     ShadowArguments arguments = pop();
     String name = pop();
     List<DartType> typeArguments = pop();
+
+    String prefixName;
     var type = pop();
     if (type is TypeDeclarationAccessor) {
       TypeDeclarationAccessor accessor = type;
+      if (accessor.prefix != null) {
+        prefixName = accessor.prefix.name;
+        nameToken = nameToken.next.next;
+      }
       type = accessor.declaration;
     }
+
     bool savedConstantExpressionRequired = pop();
     () {
       if (arguments == null) {
@@ -2538,6 +2551,7 @@
           push(buildStaticInvocation(target, arguments,
               isConst: optional("const", token) || optional("@", token),
               charOffset: nameToken.charOffset,
+              prefixName: prefixName,
               initialTarget: initialTarget));
           return;
         } else {
diff --git a/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart b/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
index 40d70e2..2dc4f3b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
@@ -4,8 +4,7 @@
 
 library fasta.fasta_accessors;
 
-import 'package:kernel/ast.dart'
-    hide InvalidExpression, InvalidInitializer, InvalidStatement;
+import 'package:kernel/ast.dart' hide InvalidExpression, InvalidInitializer;
 
 import '../../scanner/token.dart' show Token;
 
@@ -1099,6 +1098,7 @@
         }
         accessor = new StaticAccessor.fromBuilder(
             helper, builder, send.token, setter,
+            prefix: prefix,
             targetOffset: declarationReferenceOffset,
             targetClass: declaration.target);
       }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
index f261875..98a27ca 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
@@ -4,6 +4,7 @@
 
 library fasta.kernel_class_builder;
 
+import 'package:front_end/src/fasta/fasta_codes.dart';
 import 'package:kernel/ast.dart'
     show
         Class,
@@ -20,10 +21,16 @@
         ProcedureKind,
         StaticGet,
         Supertype,
+        TypeParameter,
+        TypeParameterType,
         VariableDeclaration;
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
+import 'package:kernel/type_algebra.dart' show Substitution;
+
+import 'package:kernel/type_environment.dart' show TypeEnvironment;
+
 import '../dill/dill_member_builder.dart' show DillMemberBuilder;
 
 import '../fasta_codes.dart'
@@ -37,6 +44,8 @@
         templateOverrideFewerPositionalArguments,
         templateOverrideMismatchNamedParameter,
         templateOverrideMoreRequiredArguments,
+        templateOverrideTypeMismatchParameter,
+        templateOverrideTypeMismatchReturnType,
         templateOverrideTypeVariablesMismatch,
         templateRedirectionTargetNotFound;
 
@@ -202,38 +211,46 @@
         .add(new StaticGet(constructor.target)..parent = literal);
   }
 
-  void checkOverrides(ClassHierarchy hierarchy) {
-    hierarchy.forEachOverridePair(cls, checkOverride);
-  }
-
-  void checkOverride(
-      Member declaredMember, Member interfaceMember, bool isSetter) {
-    if (declaredMember is Constructor || interfaceMember is Constructor) {
-      unimplemented(
-          "Constructor in override check.", declaredMember.fileOffset, fileUri);
-    }
-    if (declaredMember is Procedure && interfaceMember is Procedure) {
-      if (declaredMember.kind == ProcedureKind.Method &&
-          interfaceMember.kind == ProcedureKind.Method) {
-        checkMethodOverride(declaredMember, interfaceMember);
+  void checkOverrides(
+      ClassHierarchy hierarchy, TypeEnvironment typeEnvironment) {
+    hierarchy.forEachOverridePair(cls,
+        (Member declaredMember, Member interfaceMember, bool isSetter) {
+      if (declaredMember is Constructor || interfaceMember is Constructor) {
+        unimplemented("Constructor in override check.",
+            declaredMember.fileOffset, fileUri);
       }
-    }
-    // TODO(ahe): Handle other cases: accessors, operators, and fields.
+      if (declaredMember is Procedure && interfaceMember is Procedure) {
+        if (declaredMember.kind == ProcedureKind.Method &&
+            interfaceMember.kind == ProcedureKind.Method) {
+          checkMethodOverride(
+              hierarchy, typeEnvironment, declaredMember, interfaceMember);
+        }
+      }
+      // TODO(ahe): Handle other cases: accessors, operators, and fields.
+    });
   }
 
-  void checkMethodOverride(
-      Procedure declaredMember, Procedure interfaceMember) {
-    if (declaredMember.enclosingClass != cls) {
-      // TODO(ahe): Include these checks as well, but the message needs to
-      // explain that [declaredMember] is inherited.
-      return;
+  Uri _getMemberUri(Member member) {
+    if (member is Field) return member.fileUri;
+    if (member is Procedure) return member.fileUri;
+    // Other member types won't be seen because constructors don't participate
+    // in override relationships
+    return unhandled('${member.runtimeType}', '_getMemberUri', -1, null);
+  }
+
+  Substitution _computeInterfaceSubstitution(
+      ClassHierarchy hierarchy,
+      Member declaredMember,
+      Member interfaceMember,
+      FunctionNode declaredFunction,
+      FunctionNode interfaceFunction) {
+    Substitution interfaceSubstitution;
+    if (interfaceMember.enclosingClass.typeParameters.isNotEmpty) {
+      interfaceSubstitution = Substitution.fromSupertype(
+          hierarchy.getClassAsInstanceOf(cls, interfaceMember.enclosingClass));
     }
-    assert(declaredMember.kind == ProcedureKind.Method);
-    assert(interfaceMember.kind == ProcedureKind.Method);
-    FunctionNode declaredFunction = declaredMember.function;
-    FunctionNode interfaceFunction = interfaceMember.function;
-    if (declaredFunction.typeParameters?.length !=
-        interfaceFunction.typeParameters?.length) {
+    if (declaredFunction?.typeParameters?.length !=
+        interfaceFunction?.typeParameters?.length) {
       addWarning(
           templateOverrideTypeVariablesMismatch.withArguments(
               "$name::${declaredMember.name.name}",
@@ -243,8 +260,106 @@
           context: templateOverriddenMethodCause
               .withArguments(interfaceMember.name.name)
               .withLocation(
-                  interfaceMember.fileUri, interfaceMember.fileOffset));
+                  _getMemberUri(interfaceMember), interfaceMember.fileOffset));
+    } else if (library.loader.target.backendTarget.strongMode &&
+        declaredFunction?.typeParameters != null) {
+      var substitution = <TypeParameter, DartType>{};
+      for (int i = 0; i < declaredFunction.typeParameters.length; ++i) {
+        var declaredParameter = declaredFunction.typeParameters[i];
+        var interfaceParameter = interfaceFunction.typeParameters[i];
+        substitution[interfaceParameter] =
+            new TypeParameterType(declaredParameter);
+      }
+      var newSubstitution = Substitution.fromMap(substitution);
+      interfaceSubstitution = interfaceSubstitution == null
+          ? newSubstitution
+          : Substitution.combine(interfaceSubstitution, newSubstitution);
     }
+    return interfaceSubstitution;
+  }
+
+  bool _checkTypes(
+      TypeEnvironment typeEnvironment,
+      Substitution interfaceSubstitution,
+      Member declaredMember,
+      Member interfaceMember,
+      DartType declaredType,
+      DartType interfaceType,
+      bool isCovariant,
+      VariableDeclaration declaredParameter) {
+    if (!library.loader.target.backendTarget.strongMode) return false;
+
+    if (interfaceSubstitution != null) {
+      interfaceType = interfaceSubstitution.substituteType(interfaceType);
+    }
+
+    bool inParameter = declaredParameter != null;
+    DartType subtype = inParameter ? interfaceType : declaredType;
+    DartType supertype = inParameter ? declaredType : interfaceType;
+
+    if (typeEnvironment.isSubtypeOf(subtype, supertype)) {
+      // No problem--the proper subtyping relation is satisfied.
+    } else if (isCovariant && typeEnvironment.isSubtypeOf(supertype, subtype)) {
+      // No problem--the overriding parameter is marked "covariant" and has
+      // a type which is a subtype of the parameter it overrides.
+    } else {
+      // Report an error.
+      var declaredMemberName = '$name::${declaredMember.name.name}';
+      Message message;
+      int fileOffset;
+      if (declaredParameter == null) {
+        message = templateOverrideTypeMismatchReturnType.withArguments(
+            declaredMemberName, declaredType, interfaceType);
+        fileOffset = declaredMember.fileOffset;
+      } else {
+        message = templateOverrideTypeMismatchParameter.withArguments(
+            declaredParameter.name,
+            declaredMemberName,
+            declaredType,
+            interfaceType);
+        fileOffset = declaredParameter.fileOffset;
+      }
+      library.addCompileTimeError(message, fileOffset, fileUri,
+          context: templateOverriddenMethodCause
+              .withArguments(interfaceMember.name.name)
+              .withLocation(
+                  _getMemberUri(interfaceMember), interfaceMember.fileOffset));
+      return true;
+    }
+    return false;
+  }
+
+  void checkMethodOverride(
+      ClassHierarchy hierarchy,
+      TypeEnvironment typeEnvironment,
+      Procedure declaredMember,
+      Procedure interfaceMember) {
+    if (declaredMember.enclosingClass != cls) {
+      // TODO(ahe): Include these checks as well, but the message needs to
+      // explain that [declaredMember] is inherited.
+      return;
+    }
+    assert(declaredMember.kind == ProcedureKind.Method);
+    assert(interfaceMember.kind == ProcedureKind.Method);
+    FunctionNode declaredFunction = declaredMember.function;
+    FunctionNode interfaceFunction = interfaceMember.function;
+
+    Substitution interfaceSubstitution = _computeInterfaceSubstitution(
+        hierarchy,
+        declaredMember,
+        interfaceMember,
+        declaredFunction,
+        interfaceFunction);
+
+    _checkTypes(
+        typeEnvironment,
+        interfaceSubstitution,
+        declaredMember,
+        interfaceMember,
+        declaredFunction.returnType,
+        interfaceFunction.returnType,
+        false,
+        null);
     if (declaredFunction.positionalParameters.length <
             interfaceFunction.requiredParameterCount ||
         declaredFunction.positionalParameters.length <
@@ -273,6 +388,21 @@
               .withLocation(
                   interfaceMember.fileUri, interfaceMember.fileOffset));
     }
+    for (int i = 0;
+        i < declaredFunction.positionalParameters.length &&
+            i < interfaceFunction.positionalParameters.length;
+        i++) {
+      var declaredParameter = declaredFunction.positionalParameters[i];
+      _checkTypes(
+          typeEnvironment,
+          interfaceSubstitution,
+          declaredMember,
+          interfaceMember,
+          declaredParameter.type,
+          interfaceFunction.positionalParameters[i].type,
+          declaredParameter.isCovariant,
+          declaredParameter);
+    }
     if (declaredFunction.namedParameters.isEmpty &&
         interfaceFunction.namedParameters.isEmpty) {
       return;
@@ -314,6 +444,16 @@
           break outer;
         }
       }
+      var declaredParameter = declaredNamedParameters.current;
+      _checkTypes(
+          typeEnvironment,
+          interfaceSubstitution,
+          declaredMember,
+          interfaceMember,
+          declaredParameter.type,
+          interfaceNamedParameters.current.type,
+          declaredParameter.isCovariant,
+          declaredParameter);
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index 84bfc98..0060ec9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -51,6 +51,7 @@
         ConstructorReferenceBuilder,
         FormalParameterBuilder,
         InvalidTypeBuilder,
+        KernelClassBuilder,
         KernelConstructorBuilder,
         KernelEnumBuilder,
         KernelFieldBuilder,
@@ -74,6 +75,7 @@
         QualifiedName,
         Scope,
         TypeBuilder,
+        TypeDeclarationBuilder,
         TypeVariableBuilder,
         VoidTypeBuilder,
         compareProcedures,
@@ -81,6 +83,8 @@
 
 import 'metadata_collector.dart';
 
+import 'type_algorithms.dart' show calculateBounds;
+
 class KernelLibraryBuilder
     extends SourceLibraryBuilder<KernelTypeBuilder, Library> {
   final Library library;
@@ -1005,6 +1009,38 @@
     return count;
   }
 
+  /// Instantiates the type parameters in all raw generic types in [types] to
+  /// their bounds.  The list of types is cleared when done.
+  int instantiateToBound(TypeBuilder dynamicType, ClassBuilder objectClass) {
+    int count = 0;
+
+    for (var type in types) {
+      if (type.builder is! NamedTypeBuilder) {
+        continue;
+      }
+      NamedTypeBuilder typeBuilder = type.builder as NamedTypeBuilder;
+      TypeDeclarationBuilder typeDeclarationBuilder = typeBuilder.builder;
+      List<TypeVariableBuilder> typeParameters;
+
+      if (typeDeclarationBuilder is KernelClassBuilder) {
+        typeParameters = typeDeclarationBuilder.typeVariables;
+      } else if (typeDeclarationBuilder is KernelFunctionTypeAliasBuilder) {
+        typeParameters = typeDeclarationBuilder.typeVariables;
+      }
+
+      if (typeParameters != null &&
+          typeParameters.length > 0 &&
+          typeBuilder.arguments == null) {
+        typeBuilder.arguments =
+            calculateBounds(typeParameters, dynamicType, objectClass);
+        count += typeParameters.length;
+      }
+    }
+    types.clear();
+
+    return count;
+  }
+
   @override
   void includePart(covariant KernelLibraryBuilder part) {
     part.mixinApplicationClasses
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index 3025f01..ab33cc1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -30,8 +30,7 @@
 import 'package:front_end/src/fasta/type_inference/type_schema.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema_elimination.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
-import 'package:kernel/ast.dart'
-    hide InvalidExpression, InvalidInitializer, InvalidStatement;
+import 'package:kernel/ast.dart' hide InvalidExpression, InvalidInitializer;
 import 'package:kernel/frontend/accessors.dart';
 import 'package:kernel/type_algebra.dart';
 
@@ -571,19 +570,23 @@
 /// Shadow object for [ConstructorInvocation].
 class ShadowConstructorInvocation extends ConstructorInvocation
     implements ShadowExpression {
+  /// The name of the import prefix preceding the instantiated type; or `null`
+  /// if the type is not prefixed.
+  final String _prefixName;
+
   final Member _initialTarget;
 
-  ShadowConstructorInvocation(
-      Constructor target, this._initialTarget, Arguments arguments,
+  ShadowConstructorInvocation(this._prefixName, Constructor target,
+      this._initialTarget, Arguments arguments,
       {bool isConst: false})
       : super(target, arguments, isConst: isConst);
 
   @override
   DartType _inferExpression(
       ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
-    typeNeeded =
-        inferrer.listener.constructorInvocationEnter(this, typeContext) ||
-            typeNeeded;
+    typeNeeded = inferrer.listener
+            .constructorInvocationEnter(this, _prefixName, typeContext) ||
+        typeNeeded;
     var inferredType = inferrer.inferInvocation(
         typeContext,
         typeNeeded,
@@ -680,19 +683,23 @@
 /// factory constructor.
 class ShadowFactoryConstructorInvocation extends StaticInvocation
     implements ShadowExpression {
+  /// The name of the import prefix preceding the instantiated type; or `null`
+  /// if the type is not prefixed.
+  final String _prefixName;
+
   final Member _initialTarget;
 
-  ShadowFactoryConstructorInvocation(
-      Procedure target, this._initialTarget, Arguments arguments,
+  ShadowFactoryConstructorInvocation(this._prefixName, Procedure target,
+      this._initialTarget, Arguments arguments,
       {bool isConst: false})
       : super(target, arguments, isConst: isConst);
 
   @override
   DartType _inferExpression(
       ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
-    typeNeeded =
-        inferrer.listener.constructorInvocationEnter(this, typeContext) ||
-            typeNeeded;
+    typeNeeded = inferrer.listener
+            .constructorInvocationEnter(this, _prefixName, typeContext) ||
+        typeNeeded;
     var inferredType = inferrer.inferInvocation(
         typeContext,
         typeNeeded,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 431bd48..3244bb5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -229,6 +229,9 @@
       loader.resolveParts();
       loader.computeLibraryScopes();
       loader.resolveTypes();
+      if (loader.target.strongMode) {
+        loader.instantiateToBound(dynamicType, objectClassBuilder);
+      }
       List<SourceClassBuilder> myClasses = collectMyClasses();
       loader.checkSemantics(myClasses);
       loader.finishTypeVariables(objectClassBuilder);
@@ -243,11 +246,11 @@
       }
       loader.computeHierarchy(program);
       computeCoreTypes();
-      loader.checkOverrides(myClasses);
       if (!loader.target.disableTypeInference) {
         loader.prepareTopLevelInference(myClasses);
         loader.performTopLevelInference(myClasses);
       }
+      loader.checkOverrides(myClasses);
     } on deprecated_InputError catch (e) {
       ticker.logMs("Got deprecated_InputError");
       handleInputError(e, isFullProgram: false);
diff --git a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
index 1fa7dd8..cdc332b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
@@ -22,7 +22,7 @@
 class RedirectingFactoryBody extends ExpressionStatement {
   RedirectingFactoryBody.internal(Expression value)
       : super(new Let(new VariableDeclaration(letName, initializer: value),
-            new InvalidExpression()));
+            new InvalidExpression(null)));
 
   RedirectingFactoryBody(Member target) : this.internal(new StaticGet(target));
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
new file mode 100644
index 0000000..3a1ccb2
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -0,0 +1,77 @@
+// 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.md file.
+
+import 'kernel_builder.dart'
+    show
+        TypeVariableBuilder,
+        KernelTypeBuilder,
+        KernelNamedTypeBuilder,
+        KernelTypeVariableBuilder,
+        KernelClassBuilder,
+        KernelFunctionTypeAliasBuilder;
+
+KernelTypeBuilder substituteRec(
+    KernelTypeBuilder type,
+    Map<TypeVariableBuilder, KernelTypeBuilder> substitution,
+    KernelTypeBuilder dynamicType,
+    int depth) {
+  if (type is KernelNamedTypeBuilder) {
+    if (type.builder is KernelTypeVariableBuilder &&
+        substitution.containsKey(type.builder)) {
+      if (depth > 0) {
+        return substituteRec(
+            substitution[type.builder], substitution, dynamicType, depth - 1);
+      }
+      return dynamicType;
+    } else if (type.builder is KernelClassBuilder ||
+        type.builder is KernelFunctionTypeAliasBuilder) {
+      if (type.arguments == null || type.arguments.length == 0) {
+        return type;
+      }
+      List<KernelTypeBuilder> typeArguments =
+          new List<KernelTypeBuilder>(type.arguments.length);
+      for (int i = 0; i < typeArguments.length; i++) {
+        typeArguments[i] =
+            substituteRec(type.arguments[i], substitution, dynamicType, depth);
+      }
+      return new KernelNamedTypeBuilder(type.name, typeArguments)
+        ..bind(type.builder);
+    }
+  }
+  return type;
+}
+
+List<KernelTypeBuilder> calculateBounds(
+    List<TypeVariableBuilder> typeParameters,
+    KernelTypeBuilder dynamicType,
+    KernelClassBuilder objectClass) {
+  var refinedBounds = new List<KernelTypeBuilder>(typeParameters.length);
+  var substitution = new Map<TypeVariableBuilder, KernelTypeBuilder>();
+
+  for (int i = 0; i < typeParameters.length; i++) {
+    KernelTypeBuilder type = typeParameters[i].bound;
+    if (type == null ||
+        type is KernelNamedTypeBuilder &&
+            type.builder is KernelClassBuilder &&
+            (type.builder as KernelClassBuilder).cls == objectClass?.cls) {
+      type = dynamicType;
+    }
+
+    refinedBounds[i] = type;
+    substitution[typeParameters[i]] = type;
+  }
+
+  // TODO(dmitryas): Replace the call to [substituteRec] with actual
+  // instantiate-to-bounds algorithm.
+  List<KernelTypeBuilder> result =
+      new List<KernelTypeBuilder>(typeParameters.length);
+  for (int i = 0; i < result.length; i++) {
+    // The current bound `refinedBounds[i]` is used as a starting point for
+    // [substituteRec], that is, the first substitution of a type parameter with
+    // its bound is already performed, so the depth parameter is lessened by 1.
+    result[i] = substituteRec(
+        refinedBounds[i], substitution, dynamicType, typeParameters.length - 1);
+  }
+  return result;
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/verifier.dart b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
index 401ae92..5473540 100644
--- a/pkg/front_end/lib/src/fasta/kernel/verifier.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
@@ -10,9 +10,7 @@
         Class,
         ExpressionStatement,
         Field,
-        InvalidExpression,
         InvalidInitializer,
-        InvalidStatement,
         Library,
         Member,
         Procedure,
@@ -154,16 +152,6 @@
   }
 
   @override
-  visitInvalidExpression(InvalidExpression node) {
-    problem(node, "Invalid expression.");
-  }
-
-  @override
-  visitInvalidStatement(InvalidStatement node) {
-    problem(node, "Invalid statement.");
-  }
-
-  @override
   visitInvalidInitializer(InvalidInitializer node) {
     problem(node, "Invalid initializer.");
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 08cfbc2..786d564 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -471,9 +471,8 @@
       return parseTopLevelMember(next);
     }
     // Ignore any preceding modifiers and just report the unexpected token
-    reportRecoverableErrorWithToken(next, fasta.templateExpectedDeclaration);
-    listener.handleInvalidTopLevelDeclaration(next);
-    return next;
+    listener.beginTopLevelMember(next);
+    return reportInvalidTopLevelDeclaration(next);
   }
 
   // Report an error for the given modifier preceding a top level keyword
@@ -513,19 +512,21 @@
       return parseEnum(previous);
     } else if (identical(value, 'typedef')) {
       Token next = token.next;
+      directiveState?.checkDeclaration();
       if (next.isIdentifier || optional("void", next)) {
-        directiveState?.checkDeclaration();
         return parseTypedef(previous);
       } else {
-        directiveState?.checkDeclaration();
         return parseTopLevelMember(previous);
       }
     } else {
       // The remaining top level keywords are built-in keywords
-      // and can be used as an identifier in a top level declaration
-      // such as "abstract<T>() => 0;".
+      // and can be used in a top level declaration
+      // as an identifier such as "abstract<T>() => 0;"
+      // or as a prefix such as "abstract.A b() => 0;".
       String nextValue = token.next.stringValue;
-      if (identical(nextValue, '(') || identical(nextValue, '<')) {
+      if (identical(nextValue, '(') ||
+          identical(nextValue, '<') ||
+          identical(nextValue, '.')) {
         directiveState?.checkDeclaration();
         return parseTopLevelMember(previous);
       } else if (identical(value, 'library')) {
@@ -1096,9 +1097,10 @@
         token = ensureCloseParen(token, begin);
         break;
       } else if (identical(value, '[]')) {
-        --parameterCount;
-        reportRecoverableError(next, fasta.messageEmptyOptionalParameterList);
-        token = ensureCloseParen(next, begin);
+        // Recovery
+        token = rewriteSquareBrackets(token);
+        token = parseOptionalPositionalParameters(token, kind);
+        token = ensureCloseParen(token, begin);
         break;
       }
       token = parseFormalParameter(token, FormalParameterKind.mandatory, kind);
@@ -1164,21 +1166,42 @@
     assert(optional('[', token));
     listener.beginOptionalFormalParameters(begin);
     int parameterCount = 0;
-    do {
+    while (true) {
       Token next = token.next;
       if (optional(']', next)) {
-        token = next;
         break;
       }
       token = parseFormalParameter(
-              token, FormalParameterKind.optionalPositional, kind)
-          .next;
+          token, FormalParameterKind.optionalPositional, kind);
+      next = token.next;
       ++parameterCount;
-    } while (optional(',', token));
-    if (parameterCount == 0) {
-      reportRecoverableError(token, fasta.messageEmptyOptionalParameterList);
+      if (!optional(',', next)) {
+        if (!optional(']', next)) {
+          // Recovery
+          reportRecoverableError(
+              next, fasta.templateExpectedButGot.withArguments(']'));
+          // Scanner guarantees a closing bracket.
+          next = begin.endGroup;
+          while (token.next != next) {
+            token = token.next;
+          }
+        }
+        break;
+      }
+      token = next;
     }
-    expect(']', token);
+    if (parameterCount == 0) {
+      token = rewriteAndRecover(
+          token,
+          fasta.messageEmptyOptionalParameterList,
+          new SyntheticStringToken(
+              TokenType.IDENTIFIER, '', token.next.charOffset, 0));
+      token = parseFormalParameter(
+          token, FormalParameterKind.optionalPositional, kind);
+      ++parameterCount;
+    }
+    token = token.next;
+    assert(optional(']', token));
     listener.endOptionalFormalParameters(parameterCount, begin, token);
     return token;
   }
@@ -1194,21 +1217,42 @@
     assert(optional('{', token));
     listener.beginOptionalFormalParameters(begin);
     int parameterCount = 0;
-    do {
+    while (true) {
       Token next = token.next;
       if (optional('}', next)) {
-        token = next;
         break;
       }
       token =
-          parseFormalParameter(token, FormalParameterKind.optionalNamed, kind)
-              .next;
+          parseFormalParameter(token, FormalParameterKind.optionalNamed, kind);
+      next = token.next;
       ++parameterCount;
-    } while (optional(',', token));
-    if (parameterCount == 0) {
-      reportRecoverableError(token, fasta.messageEmptyNamedParameterList);
+      if (!optional(',', next)) {
+        if (!optional('}', next)) {
+          // Recovery
+          reportRecoverableError(
+              next, fasta.templateExpectedButGot.withArguments('}'));
+          // Scanner guarantees a closing bracket.
+          next = begin.endGroup;
+          while (token.next != next) {
+            token = token.next;
+          }
+        }
+        break;
+      }
+      token = next;
     }
-    expect('}', token);
+    if (parameterCount == 0) {
+      token = rewriteAndRecover(
+          token,
+          fasta.messageEmptyNamedParameterList,
+          new SyntheticStringToken(
+              TokenType.IDENTIFIER, '', token.next.charOffset, 0));
+      token =
+          parseFormalParameter(token, FormalParameterKind.optionalNamed, kind);
+      ++parameterCount;
+    }
+    token = token.next;
+    assert(optional('}', token));
     listener.endOptionalFormalParameters(parameterCount, begin, token);
     return token;
   }
@@ -1695,8 +1739,13 @@
         reportRecoverableErrorWithToken(
             next, fasta.templateBuiltInIdentifierInDeclaration);
       } else if (!optional("dynamic", next)) {
-        reportRecoverableErrorWithToken(
-            next, fasta.templateBuiltInIdentifierAsType);
+        if (context == IdentifierContext.typeReference &&
+            optional('.', next.next)) {
+          // Built in identifiers may be used as a prefix
+        } else {
+          reportRecoverableErrorWithToken(
+              next, fasta.templateBuiltInIdentifierAsType);
+        }
       }
       token = next;
     } else if (!inPlainSync && next.type.isPseudo) {
@@ -1756,6 +1805,8 @@
       followingValues = ['<', 'extends', 'with', 'implements', '{'];
     } else if (context == IdentifierContext.combinator) {
       followingValues = [';'];
+    } else if (context == IdentifierContext.constructorReferenceContinuation) {
+      followingValues = ['.', ',', '(', ')', '[', ']', '}', ';'];
     } else if (context == IdentifierContext.fieldDeclaration) {
       followingValues = [';', '=', ',', '}'];
     } else if (context == IdentifierContext.enumDeclaration) {
@@ -2651,16 +2702,14 @@
             token, IdentifierContext.topLevelVariableDeclaration);
         return parseFields(beforeStart, const Link<Token>(), token, true);
       } else {
-        return reportUnrecoverableErrorWithToken(
-            token, fasta.templateExpectedDeclaration);
+        return reportInvalidTopLevelDeclaration(token);
       }
     }
     Token afterName = identifiers.head.next;
     identifiers = identifiers.tail;
 
     if (identifiers.isEmpty) {
-      return reportUnrecoverableErrorWithToken(
-          token, fasta.templateExpectedDeclaration);
+      return reportInvalidTopLevelDeclaration(token);
     }
     Token beforeName = identifiers.head;
     identifiers = identifiers.tail;
@@ -2919,7 +2968,8 @@
         // A field or abstract getter.
         identifiers = identifiers.prepend(previous);
         return identifiers;
-      } else if (optional('native', token) &&
+      } else if (hasName &&
+          optional('native', token) &&
           (token.next.kind == STRING_TOKEN || optional(';', token.next))) {
         // Skip.
         previous = token;
@@ -3218,6 +3268,18 @@
     return token;
   }
 
+  /// Replace the token after [token] with `[` followed by `]`
+  /// and return [token].
+  Token rewriteSquareBrackets(Token token) {
+    Token next = token.next;
+    assert(optional('[]', next));
+    Token replacement = link(
+        new BeginToken(TokenType.OPEN_SQUARE_BRACKET, next.offset),
+        new Token(TokenType.CLOSE_SQUARE_BRACKET, next.offset + 1));
+    rewriter.replaceTokenFollowing(token, replacement);
+    return token;
+  }
+
   void rewriteGtCompositeOrRecover(Token token, Token next, String value) {
     assert(value != '>');
     Token replacement = new Token(TokenType.GT, next.charOffset);
@@ -4754,14 +4816,9 @@
       expect(']', token);
       return token;
     }
-    BeginToken replacement = link(
-        new BeginToken(TokenType.OPEN_SQUARE_BRACKET, token.offset),
-        new Token(TokenType.CLOSE_SQUARE_BRACKET, token.offset + 1));
-    rewriter.replaceTokenFollowing(beforeToken, replacement);
-    replacement.endToken = replacement.next;
-    token = replacement.next;
-    listener.handleLiteralList(0, replacement, constKeyword, token);
-    return token;
+    token = rewriteSquareBrackets(beforeToken).next;
+    listener.handleLiteralList(0, token, constKeyword, token.next);
+    return token.next;
   }
 
   /// This method parses the portion of a map literal that starts with the left
@@ -6060,6 +6117,12 @@
     return nextToken;
   }
 
+  Token reportInvalidTopLevelDeclaration(Token token) {
+    reportRecoverableErrorWithToken(token, fasta.templateExpectedDeclaration);
+    listener.handleInvalidTopLevelDeclaration(token);
+    return token;
+  }
+
   Token reportUnmatchedToken(BeginToken token) {
     return reportUnrecoverableError(
         token,
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index e8d2bc3..e62a87d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -582,14 +582,13 @@
     }
   }
 
-  /// Resolves all unresolved types in [types]. The list of types is cleared
-  /// when done.
+  /// Resolves all unresolved types in [types]. The list of types is retained
+  /// and is used in [KernelLibraryBuilder.instantiateToBound] later.
   int resolveTypes() {
     int typeCount = types.length;
     for (UnresolvedType<T> t in types) {
       t.resolveIn(scope);
     }
-    types.clear();
     return typeCount;
   }
 
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 ac4e347..c3a81e6 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -351,6 +351,16 @@
     ticker.logMs("Resolved $count type-variable bounds");
   }
 
+  void instantiateToBound(TypeBuilder dynamicType, ClassBuilder objectClass) {
+    int count = 0;
+    builders.forEach((Uri uri, LibraryBuilder library) {
+      if (library.loader == this) {
+        count += library.instantiateToBound(dynamicType, objectClass);
+      }
+    });
+    ticker.logMs("Instantiated $count type variables to their bounds");
+  }
+
   void finishNativeMethods() {
     int count = 0;
     builders.forEach((Uri uri, LibraryBuilder library) {
@@ -547,7 +557,8 @@
     assert(hierarchy != null);
     for (SourceClassBuilder builder in sourceClasses) {
       if (builder.library.loader == this) {
-        builder.checkOverrides(hierarchy);
+        builder.checkOverrides(
+            hierarchy, typeInferenceEngine?.typeSchemaEnvironment);
       }
     }
     ticker.logMs("Checked overrides");
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
index 51f8484..1de0b4d 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
@@ -160,8 +160,8 @@
           ConditionalExpression expression, DartType inferredType) =>
       genericExpressionExit("conditionalExpression", expression, inferredType);
 
-  bool constructorInvocationEnter(
-          InvocationExpression expression, DartType typeContext) =>
+  bool constructorInvocationEnter(InvocationExpression expression,
+          String prefixName, DartType typeContext) =>
       genericExpressionEnter("constructorInvocation", expression, typeContext);
 
   void constructorInvocationExit(
@@ -323,8 +323,13 @@
           DartType inferredType) =>
       genericExpressionExit("methodInvocation", expression, inferredType);
 
-  void methodInvocationExitCall(Expression expression, Arguments arguments,
-          bool isImplicitCall, DartType inferredType) =>
+  void methodInvocationExitCall(
+          Expression expression,
+          Arguments arguments,
+          bool isImplicitCall,
+          FunctionType calleeType,
+          Substitution substitution,
+          DartType inferredType) =>
       genericExpressionExit("methodInvocation", expression, inferredType);
 
   bool namedFunctionExpressionEnter(Let expression, DartType typeContext) =>
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 aab2c19..0af6595 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
@@ -1205,8 +1205,8 @@
     handleInvocationContravariance(checkKind, desugaredInvocation, arguments,
         expression, inferredType, calleeType, fileOffset);
     if (identical(interfaceMember, 'call')) {
-      listener.methodInvocationExitCall(
-          expression, arguments, isImplicitCall, inferredType);
+      listener.methodInvocationExitCall(expression, arguments, isImplicitCall,
+          calleeType, lastInferredSubstitution, inferredType);
     } else {
       listener.methodInvocationExit(expression, arguments, isImplicitCall,
           interfaceMember, calleeType, lastInferredSubstitution, inferredType);
@@ -1257,8 +1257,7 @@
     var replacedExpression = handlePropertyGetContravariance(receiver,
         interfaceMember, desugaredGet, expression, inferredType, fileOffset);
     if ((interfaceMember is Procedure &&
-            interfaceMember.kind == ProcedureKind.Method) ||
-        interfaceMember == 'call') {
+        interfaceMember.kind == ProcedureKind.Method)) {
       inferredType =
           instantiateTearOff(inferredType, typeContext, replacedExpression);
     }
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 26cba01..dba0d52 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
@@ -371,48 +371,6 @@
     // TODO(paulberry): report any errors from instantiateToBounds.
   }
 
-  /// Given a [DartType] [type], if [type] is an uninstantiated
-  /// parameterized type then instantiate the parameters to their
-  /// bounds. See the issue for the algorithm description.
-  ///
-  /// https://github.com/dart-lang/sdk/issues/27526#issuecomment-260021397
-  ///
-  /// TODO(paulberry) Compute lazily and cache.
-  DartType instantiateToBounds(DartType type,
-      {Map<TypeParameter, DartType> knownTypes}) {
-    List<TypeParameter> typeFormals = _typeFormalsAsParameters(type);
-    int count = typeFormals.length;
-    if (count == 0) {
-      return type;
-    }
-    var substitution = <TypeParameter, DartType>{};
-    for (TypeParameter parameter in typeFormals) {
-      // Note: we treat class<T extends Object> as equivalent to class<T>; in
-      // both cases they instantiate to class<dynamic>.  See dartbug.com/29561
-      if (_isObjectOrDynamic(parameter.bound)) {
-        substitution[parameter] = const DynamicType();
-      } else {
-        substitution[parameter] = parameter.bound;
-      }
-    }
-    if (knownTypes != null) {
-      type = substitute(type, knownTypes);
-    }
-    var result = substituteDeep(type, substitution);
-    if (result != null) return result;
-
-    // Instantiation failed due to a circularity.
-    // TODO(paulberry): report the error.
-    // Substitute `dynamic` for all parameters to try to allow compilation to
-    // continue.  Note that [substituteDeep] is destructive of the
-    // [substitution] so we create a fresh one.
-    substitution = <TypeParameter, DartType>{};
-    for (TypeParameter parameter in typeFormals) {
-      substitution[parameter] = const DynamicType();
-    }
-    return substitute(type, substitution);
-  }
-
   @override
   bool isBottom(DartType t) {
     if (t is UnknownType) {
@@ -735,18 +693,6 @@
       (type is InterfaceType &&
           identical(type.classNode, coreTypes.objectClass));
 
-  /// Given a [type], returns the [TypeParameter]s corresponding to its formal
-  /// type parameters (if any).
-  List<TypeParameter> _typeFormalsAsParameters(DartType type) {
-    if (type is TypedefType) {
-      return type.typedefNode.typeParameters;
-    } else if (type is InterfaceType) {
-      return type.classNode.typeParameters;
-    } else {
-      return const [];
-    }
-  }
-
   DartType _typeParameterLeastUpperBound(DartType type1, DartType type2) {
     // This currently just implements a simple least upper bound to
     // handle some common cases.  It also avoids some termination issues
diff --git a/pkg/front_end/lib/src/kernel_generator_impl.dart b/pkg/front_end/lib/src/kernel_generator_impl.dart
index ed9816d..2ff707a 100644
--- a/pkg/front_end/lib/src/kernel_generator_impl.dart
+++ b/pkg/front_end/lib/src/kernel_generator_impl.dart
@@ -118,6 +118,15 @@
         ..libraries.addAll(truncateSummary
             ? kernelTarget.loader.libraries
             : summaryProgram.libraries);
+      trimmedSummaryProgram.metadata.addAll(summaryProgram.metadata);
+
+      // As documented, we only run outline transformations when we are building
+      // summaries without building a full program (at this time, that's
+      // the only need we have for these transformations).
+      if (!buildProgram) {
+        options.target.performOutlineTransformations(trimmedSummaryProgram);
+        options.ticker.logMs("Transformed outline");
+      }
       summary = serializeProgram(trimmedSummaryProgram);
       options.ticker.logMs("Generated outline");
     }
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index b6047e9..62d7386 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -93,6 +93,7 @@
 EmptyNamedParameterList:
   template: "Named parameter lists cannot be empty."
   tip: "Try adding a named parameter to the list."
+  analyzerCode: "MISSING_IDENTIFIER"
   dart2jsCode: EMPTY_NAMED_PARAMETER_LIST
   script: >
     foo({}) {}
@@ -104,6 +105,7 @@
 EmptyOptionalParameterList:
   template: "Optional parameter lists cannot be empty."
   tip: "Try adding an optional parameter to the list."
+  analyzerCode: "MISSING_IDENTIFIER"
   dart2jsCode: EMPTY_OPTIONAL_PARAMETER_LIST
   script: >
     foo([]) {}
@@ -920,6 +922,8 @@
 
 NotAType:
   template: "'#name' isn't a type."
+  analyzerCode: NOT_A_TYPE
+  dart2jsCode: "*ignored*"
 
 FastaUsageShort:
   template: |
@@ -1163,6 +1167,18 @@
 OverrideMoreRequiredArguments:
   template: "The method '#name' has more required arguments than those of overridden method '#name2'."
 
+OverrideTypeMismatchParameter:
+  template: "The parameter '#name' of the method '#name2' has type #type, which does not match the corresponding type in the overridden method (#type2)."
+  tip: "Change to a supertype of #type2 (or, for a covariant parameter, a subtype)."
+  analyzerCode: INVALID_METHOD_OVERRIDE
+  dart2jsCode: "*ignored*"
+
+OverrideTypeMismatchReturnType:
+  template: "The return type of the method '#name' is #type, which does not match the return type of the overridden method (#type2)."
+  tip: "Change to a subtype of #type2."
+  analyzerCode: INVALID_METHOD_OVERRIDE
+  dart2jsCode: "*ignored*"
+
 IllegalMethodName:
   template: "'#name' isn't a legal method name."
   tip: "Did you mean '#name2'?"
@@ -1488,6 +1504,8 @@
 
 SuperclassHasNoMethod:
   template: "Superclass has no method named '#name'."
+  analyzerCode: UNDEFINED_SUPER_METHOD
+  dart2jsCode: "*ignored*"
 
 SuperclassHasNoDefaultConstructor:
   template: "The superclass, '#name', has no unnamed constructor that takes no arguments."
diff --git a/pkg/front_end/test/fasta/testing/analyzer_diet_listener.dart b/pkg/front_end/test/fasta/testing/analyzer_diet_listener.dart
index 5b94c6a..72a523c 100644
--- a/pkg/front_end/test/fasta/testing/analyzer_diet_listener.dart
+++ b/pkg/front_end/test/fasta/testing/analyzer_diet_listener.dart
@@ -185,6 +185,7 @@
     var translatedDeclarations = _translateDeclarations(_kernelDeclarations);
     var translatedReferences = _translateReferences(_kernelReferences);
     var resolutionApplier = new ValidatingResolutionApplier(
+        null,
         new _TestTypeContext(),
         translatedDeclarations,
         translatedReferences,
@@ -243,6 +244,7 @@
     var translatedDeclarations = _translateDeclarations(_kernelDeclarations);
     var translatedReferences = _translateReferences(_kernelReferences);
     var resolutionApplier = new ValidatingResolutionApplier(
+        null,
         new _TestTypeContext(),
         translatedDeclarations,
         translatedReferences,
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
index de89058..80eaee2 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
@@ -340,94 +340,6 @@
     expect(inferredTypes[0], _list(dynamicType));
   }
 
-  void test_instantiateToBounds_noTypesKnown() {
-    // class A {}
-    var A = _addClass(_class('A')).rawType;
-    // class B<T extends int> {}
-    var B = _addClass(
-            _class('B', typeParameters: [new TypeParameter('T', intType)]))
-        .thisType;
-    // class C<T extends int, S extends B<T>> {}
-    var C = () {
-      var T = new TypeParameter('T', intType);
-      var S = new TypeParameter(
-          'S', new InterfaceType(B.classNode, [new TypeParameterType(T)]));
-      return _addClass(_class('C', typeParameters: [T, S])).thisType;
-    }();
-    // class D<T extends B<T>> {}
-    var D = () {
-      var T = new TypeParameter('T');
-      T.bound = new InterfaceType(B.classNode, [new TypeParameterType(T)]);
-      return _addClass(_class('D', typeParameters: [T])).thisType;
-    }();
-    // typedef T E<T extends int>();
-    var E = () {
-      var T = new TypeParameter('T', intType);
-      var typedefNode = new Typedef(
-          'E', new FunctionType([], new TypeParameterType(T)),
-          typeParameters: [T]);
-      return new TypedefType(typedefNode, [new TypeParameterType(T)]);
-    }();
-    // class F<T> {}
-    var F = _addClass(
-            _class('F', typeParameters: [new TypeParameter('T', objectType)]))
-        .thisType;
-    var env = _makeEnv();
-    // A => A
-    expect(env.instantiateToBounds(A), same(A));
-    // B => B<int>
-    expect(
-        env.instantiateToBounds(B), new InterfaceType(B.classNode, [intType]));
-    // C => C<int, A<int>>
-    expect(
-        env.instantiateToBounds(C),
-        new InterfaceType(C.classNode, [
-          intType,
-          new InterfaceType(B.classNode, [intType])
-        ]));
-    // D => error
-    // However to allow analysis to continue D => D<dynamic>
-    // TODO(paulberry): check that an error is reported.
-    expect(env.instantiateToBounds(D), D.classNode.rawType);
-    // E => E<int> => () -> int
-    expect(
-        env.instantiateToBounds(E), new TypedefType(E.typedefNode, [intType]));
-    // F => F<dynamic>
-    expect(env.instantiateToBounds(F), F.classNode.rawType);
-  }
-
-  void test_instantiateToBounds_typesKnown() {
-    // class A<T extends num> {}
-    var A = _addClass(
-            _class('A', typeParameters: [new TypeParameter('T', numType)]))
-        .thisType;
-    // class B<T extends A<T>> {}
-    var B = () {
-      var T = new TypeParameter('T');
-      T.bound = new InterfaceType(A.classNode, [new TypeParameterType(T)]);
-      return _addClass(_class('B', typeParameters: [T])).thisType;
-    }();
-    var env = _makeEnv();
-    // A => A<int> (if T known to be `int`)
-    expect(
-        env.instantiateToBounds(A,
-            knownTypes: {A.classNode.typeParameters[0]: intType}),
-        new InterfaceType(A.classNode, [intType]));
-    // Check that known types can be used to break circularities
-    // B => B<int> (if T known to be `int`)
-    expect(
-        env.instantiateToBounds(B,
-            knownTypes: {B.classNode.typeParameters[0]: intType}),
-        new InterfaceType(B.classNode, [intType]));
-  }
-
-  void test_lub_bottom() {
-    var A = _addClass(_class('A')).rawType;
-    var env = _makeEnv();
-    expect(env.getLeastUpperBound(bottomType, A), same(A));
-    expect(env.getLeastUpperBound(A, bottomType), same(A));
-  }
-
   void test_lub_classic() {
     // Make the class hierarchy:
     //
diff --git a/pkg/front_end/testcases/ast_builder.status b/pkg/front_end/testcases/ast_builder.status
index da87982..33cc33c 100644
--- a/pkg/front_end/testcases/ast_builder.status
+++ b/pkg/front_end/testcases/ast_builder.status
@@ -25,7 +25,6 @@
 inference/bug30624: Crash
 inference/bug31133: Crash
 inference/bug31436: Crash
-inference/call_corner_cases: Crash
 inference/closure_param_null_to_object: Crash
 inference/constructors_infer_from_arguments_redirecting: Crash
 inference/constructors_too_many_positional_arguments: Crash
@@ -50,14 +49,13 @@
 inference/for_loop_initializer_expression: Crash
 inference/future_then_explicit_future: Fail
 inference/generic_functions_return_typedef: Fail
-inference/generic_methods_basic_downward_inference: Crash
-inference/generic_methods_downwards_inference_fold: Crash
+inference/generic_methods_do_not_infer_invalid_override_of_generic_method: Fail
+inference/generic_methods_handle_override_of_non_generic_with_generic: Fail
 inference/generic_methods_infer_js_builtin: Fail
 inference/infer_correctly_on_multiple_variables_declared_together: Crash
 inference/infer_from_complex_expressions_if_outer_most_value_is_precise: Crash
 inference/infer_local_function_referenced_before_declaration: Crash
 inference/infer_rethrow: Crash
-inference/infer_statics_transitively3: Crash
 inference/instantiate_tearoff: Crash
 inference/instantiate_tearoff_after_contravariance_check: Crash
 inference/instantiate_tearoff_of_call: Crash
@@ -69,20 +67,19 @@
 inference/try_catch: Crash
 inference/try_catch_finally: Crash
 inference/try_catch_promotion: Crash
-inference/unsafe_block_closure_inference_closure_call: Crash
 inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1: Crash
-inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: Crash
+inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: Fail
 inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1: Crash
-inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: Crash
-inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr: Crash
-inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr: Crash
-inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: Crash
-inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: Crash
+inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: Fail
 invalid_cast: Crash
 invocations: Crash
 metadata_enum: Crash
 metadata_named_mixin_application: Crash
 micro: Crash
+native_as_name: Crash
+override_check_after_inference: Fail
+override_check_basic: Fail
+override_check_with_covariant_modifier: Fail
 qualified: Crash
 rasta/abstract_constructor: Crash
 rasta/bad_continue: Crash
@@ -90,7 +87,6 @@
 rasta/bad_interpolation: Crash
 rasta/bad_redirection: Crash
 rasta/breaking_bad: Crash
-rasta/cascades: Crash
 rasta/class_hierarchy: Crash
 rasta/deferred_load: Crash
 rasta/generic_factory: Crash
@@ -111,10 +107,8 @@
 rasta/mandatory_parameter_initializer: Crash
 rasta/parser_error: Crash
 rasta/static: Crash
-rasta/super: Crash
 rasta/super_initializer: Crash
 rasta/supports_reflection: VerificationError
-rasta/this_invoke: Crash
 rasta/try_label: Crash
 rasta/type_literals: Crash
 rasta/typedef: Crash
@@ -132,7 +126,6 @@
 regress/issue_29983: Crash
 regress/issue_29984: Crash
 regress/issue_29985: Crash
-regress/issue_30838: Crash
 regress/issue_31155: Crash # Issue 31155.
 regress/issue_31157: Crash
 regress/issue_31180: Crash
@@ -147,6 +140,5 @@
 runtime_checks_new/for_in_call_kinds: Crash
 statements: Crash
 super_call: Crash
-super_rasta_copy: Crash
 type_variable_as_super: Crash
 uninitialized_fields: Crash
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect
index 75506cd..c2af184 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect
@@ -7,24 +7,24 @@
     : super core::Object::•()
     ;
   set a(dynamic #synthetic) → dynamic
-    let dynamic _ = null in const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.\n  set a();\n       ^"));
+    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.\n  set a();\n       ^";
   set d(dynamic #synthetic) → dynamic
-    let dynamic _ = null in const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.\n  set d(x, y);\n       ^"));
+    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.\n  set d(x, y);\n       ^";
 }
 abstract class B extends core::Object {
   default constructor •() → void
     : super core::Object::•()
     ;
   set a(dynamic #synthetic) → dynamic
-    let dynamic _ = null in const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.\n  set a();\n       ^"));
+    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.\n  set a();\n       ^";
   set d(dynamic #synthetic) → dynamic
-    let dynamic _ = null in const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.\n  set d(x, y);\n       ^"));
+    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.\n  set d(x, y);\n       ^";
 }
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.\nTry adding {}.\nset b();\n       ^", "pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.\nTry adding {}.\nset c(x, y);\n           ^"]/* from null */;
 static set b(dynamic #synthetic) → dynamic
-  let dynamic _ = null in const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.\nset b();\n     ^"));
+  let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.\nset b();\n     ^";
 static set c(dynamic #synthetic) → dynamic
-  let dynamic _ = null in const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.\nset c(x, y);\n     ^"));
+  let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.\nset c(x, y);\n     ^";
 static method main() → dynamic {
   core::bool threw;
   try {
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
index c3b8952..bc2a67d 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
@@ -7,24 +7,24 @@
     : super core::Object::•()
     ;
   set a(dynamic #synthetic) → void
-    let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.\n  set a();\n       ^"));
+    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.\n  set a();\n       ^";
   set d(dynamic #synthetic) → void
-    let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.\n  set d(x, y);\n       ^"));
+    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.\n  set d(x, y);\n       ^";
 }
 abstract class B extends core::Object {
   default constructor •() → void
     : super core::Object::•()
     ;
   set a(dynamic #synthetic) → void
-    let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.\n  set a();\n       ^"));
+    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.\n  set a();\n       ^";
   set d(dynamic #synthetic) → void
-    let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.\n  set d(x, y);\n       ^"));
+    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.\n  set d(x, y);\n       ^";
 }
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.\nTry adding {}.\nset b();\n       ^", "pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.\nTry adding {}.\nset c(x, y);\n           ^"]/* from null */;
 static set b(dynamic #synthetic) → void
-  let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.\nset b();\n     ^"));
+  let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.\nset b();\n     ^";
 static set c(dynamic #synthetic) → void
-  let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.\nset c(x, y);\n     ^"));
+  let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.\nset c(x, y);\n     ^";
 static method main() → dynamic {
   core::bool threw;
   try {
diff --git a/pkg/front_end/testcases/bug21938.dart.strong.expect b/pkg/front_end/testcases/bug21938.dart.strong.expect
index 5a5cd3c..55b0b3d 100644
--- a/pkg/front_end/testcases/bug21938.dart.strong.expect
+++ b/pkg/front_end/testcases/bug21938.dart.strong.expect
@@ -5,10 +5,10 @@
 static method test() → dynamic {
   core::Object x;
   core::Function f;
-  let final dynamic #t1 = x in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/bug21938.dart:10:4: Error: The method 'call' isn't defined for the class 'dart.core::Object'.\nTry correcting the name to the name of an existing method, or defining a method named 'call'.\n  x /*@error=UndefinedMethod*/ ();\n   ^"));
-  let final dynamic #t2 = x in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/bug21938.dart:11:4: Error: The method 'call' isn't defined for the class 'dart.core::Object'.\nTry correcting the name to the name of an existing method, or defining a method named 'call'.\n  x /*@error=UndefinedMethod*/ (3);\n   ^"));
+  let final dynamic #t1 = x in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bug21938.dart:10:4: Error: The method 'call' isn't defined for the class 'dart.core::Object'.\nTry correcting the name to the name of an existing method, or defining a method named 'call'.\n  x /*@error=UndefinedMethod*/ ();\n   ^";
+  let final dynamic #t2 = x in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bug21938.dart:11:4: Error: The method 'call' isn't defined for the class 'dart.core::Object'.\nTry correcting the name to the name of an existing method, or defining a method named 'call'.\n  x /*@error=UndefinedMethod*/ (3);\n   ^";
   f.call(5, 2);
-  let final dynamic #t3 = x in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/bug21938.dart:13:33: Error: The method 'call' isn't defined for the class 'dart.core::Object'.\nTry correcting the name to the name of an existing method, or defining a method named 'call'.\n  x. /*@error=UndefinedMethod*/ call();\n                                ^"));
+  let final dynamic #t3 = x in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bug21938.dart:13:33: Error: The method 'call' isn't defined for the class 'dart.core::Object'.\nTry correcting the name to the name of an existing method, or defining a method named 'call'.\n  x. /*@error=UndefinedMethod*/ call();\n                                ^";
   f.call;
   f.call(5, 2);
 }
diff --git a/pkg/front_end/testcases/compile.status b/pkg/front_end/testcases/compile.status
index 6a6141f..41e6f96 100644
--- a/pkg/front_end/testcases/compile.status
+++ b/pkg/front_end/testcases/compile.status
@@ -92,6 +92,7 @@
 rasta/typedef: Fail
 rasta/unresolved: Fail
 rasta/unresolved_constructor: Fail
+rasta/unresolved_for_in: RuntimeError # Test contains a compile-time error, signaled at run time in the JIT VM
 rasta/unresolved_recovery: Fail
 
 regress/issue_29975: Fail # Issue 29975.
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.expect b/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.expect
index bdde0f0..61ac3b7 100644
--- a/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.expect
+++ b/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.expect
@@ -9,6 +9,6 @@
   static method m({core::int a = 0}) → dynamic {}
 }
 static method test() → void {
-  self::C::m(a: const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/duplicated_named_args_3.dart:13:19: Error: Duplicated named argument 'a'.\n  C.m(a: 1, a: 2, a: 3);\n                  ^")));
+  self::C::m(a: invalid-expression "pkg/front_end/testcases/duplicated_named_args_3.dart:13:19: Error: Duplicated named argument 'a'.\n  C.m(a: 1, a: 2, a: 3);\n                  ^");
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect b/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect
index 205c40b..30567bb 100644
--- a/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect
+++ b/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect
@@ -9,6 +9,6 @@
   static method m({core::int a = 0}) → dynamic {}
 }
 static method test() → void {
-  self::C::m(a: const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/duplicated_named_args_3.dart:13:19: Error: Duplicated named argument 'a'.\n  C.m(a: 1, a: 2, a: 3);\n                  ^")) as{TypeError} core::int);
+  self::C::m(a: invalid-expression "pkg/front_end/testcases/duplicated_named_args_3.dart:13:19: Error: Duplicated named argument 'a'.\n  C.m(a: 1, a: 2, a: 3);\n                  ^" as{TypeError} core::int);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/dynamic_and_void.dart.strong.expect b/pkg/front_end/testcases/dynamic_and_void.dart.strong.expect
index a38f5f7..5a9ee9e 100644
--- a/pkg/front_end/testcases/dynamic_and_void.dart.strong.expect
+++ b/pkg/front_end/testcases/dynamic_and_void.dart.strong.expect
@@ -1,8 +1,7 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method testDynamic() → invalid-type
-  return let final dynamic #t1 = 0 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/dynamic_and_void.dart:12:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'invalid-type'.\nTry changing the type of the left hand side, or casting the right hand side to 'invalid-type'.\n/*@warning=TypeNotFound*/ dynamic testDynamic() => 0;\n                                                   ^"));
+  return let final dynamic #t1 = 0 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/dynamic_and_void.dart:12:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'invalid-type'.\nTry changing the type of the left hand side, or casting the right hand side to 'invalid-type'.\n/*@warning=TypeNotFound*/ dynamic testDynamic() => 0;\n                                                   ^";
 static method testVoid() → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
index bd755de..deb6838 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
@@ -7,6 +7,6 @@
     return null;
   () → core::String g = f;
   g = () → core::String {
-    return let final dynamic #t1 = 1 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n    return /*error:RETURN_OF_INVALID_TYPE*/ 1;\n                                            ^"));
+    return let final dynamic #t1 = 1 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n    return /*error:RETURN_OF_INVALID_TYPE*/ 1;\n                                            ^";
   };
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
index 3d8d593..a16af52 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
@@ -15,6 +15,6 @@
   self::C<core::num> c_num = new self::C::•<core::num>(123);
   self::C<core::num> c_num2 = let final self::C<core::num> #t1 = new self::C::•<core::num>(456) in let final dynamic #t2 = #t1.{self::C::t} = 1.0 in #t1;
   self::C<dynamic> c_dynamic = new self::C::•<dynamic>(42);
-  x.{self::C::t} = let final dynamic #t3 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';\n                                                       ^"));
+  x.{self::C::t} = let final dynamic #t3 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';\n                                                       ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
index e4c1a19..7f05ebe 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
@@ -15,6 +15,6 @@
 }
 static method test() → dynamic {
   self::C<core::int> x = self::C::•<core::int>(42);
-  x.{self::C::t} = let final dynamic #t1 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';\n                                                       ^"));
+  x.{self::C::t} = let final dynamic #t1 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';\n                                                       ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
index 343375c..7abb51e 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
@@ -4,7 +4,7 @@
 
 static method test() → void {
   core::List<core::int> l;
-  l = <core::int>[let final dynamic #t1 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  l = /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"];\n                                                                    ^"))];
+  l = <core::int>[let final dynamic #t1 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  l = /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"];\n                                                                    ^"];
   l = l = <core::int>[1];
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
index 3854430..c6c4809 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
@@ -25,23 +25,23 @@
 static method test() → void {
   new self::F0::•(<core::int>[]);
   new self::F0::•(<core::int>[3]);
-  new self::F0::•(<core::int>[let final dynamic #t1 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);\n                                                                    ^"))]);
-  new self::F0::•(<core::int>[let final dynamic #t2 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^")), 3]);
+  new self::F0::•(<core::int>[let final dynamic #t1 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);\n                                                                    ^"]);
+  new self::F0::•(<core::int>[let final dynamic #t2 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^", 3]);
   new self::F1::•(a: <core::int>[]);
   new self::F1::•(a: <core::int>[3]);
-  new self::F1::•(a: <core::int>[let final dynamic #t3 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"\n                                               ^"))]);
-  new self::F1::•(a: <core::int>[let final dynamic #t4 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^")), 3]);
+  new self::F1::•(a: <core::int>[let final dynamic #t3 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"\n                                               ^"]);
+  new self::F1::•(a: <core::int>[let final dynamic #t4 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^", 3]);
   new self::F2::•(<core::int>[]);
   new self::F2::•(<core::int>[3]);
-  new self::F2::•(<core::int>[let final dynamic #t5 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);\n                                                                    ^"))]);
-  new self::F2::•(<core::int>[let final dynamic #t6 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^")), 3]);
+  new self::F2::•(<core::int>[let final dynamic #t5 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);\n                                                                    ^"]);
+  new self::F2::•(<core::int>[let final dynamic #t6 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^", 3]);
   new self::F3::•(<core::Iterable<core::int>>[]);
   new self::F3::•(<core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let final dynamic #t7 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]\n                                                                  ^"))]]);
-  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let final dynamic #t8 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],\n                                                                  ^"))], <core::int>[3]]);
+  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let final dynamic #t7 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]\n                                                                  ^"]]);
+  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let final dynamic #t8 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],\n                                                                  ^"], <core::int>[3]]);
   new self::F4::•(a: <core::Iterable<core::int>>[]);
   new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t9 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]\n                                                                  ^"))]]);
-  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t10 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],\n                                                                  ^"))], <core::int>[3]]);
+  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t9 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]\n                                                                  ^"]]);
+  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t10 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],\n                                                                  ^"], <core::int>[3]]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
index e9a6131..cedb9f0 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
@@ -10,23 +10,23 @@
 static method test() → void {
   self::f0(<core::int>[]);
   self::f0(<core::int>[3]);
-  self::f0(<core::int>[let final dynamic #t1 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);\n                                                                   ^"))]);
-  self::f0(<core::int>[let final dynamic #t2 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);\n                                                                   ^")), 3]);
+  self::f0(<core::int>[let final dynamic #t1 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);\n                                                                   ^"]);
+  self::f0(<core::int>[let final dynamic #t2 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);\n                                                                   ^", 3]);
   self::f1(a: <core::int>[]);
   self::f1(a: <core::int>[3]);
-  self::f1(a: <core::int>[let final dynamic #t3 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  f1(a: /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);\n                                                                      ^"))]);
-  self::f1(a: <core::int>[let final dynamic #t4 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^")), 3]);
+  self::f1(a: <core::int>[let final dynamic #t3 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  f1(a: /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);\n                                                                      ^"]);
+  self::f1(a: <core::int>[let final dynamic #t4 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^", 3]);
   self::f2(<core::int>[]);
   self::f2(<core::int>[3]);
-  self::f2(<core::int>[let final dynamic #t5 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);\n                                                                   ^"))]);
-  self::f2(<core::int>[let final dynamic #t6 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);\n                                                                   ^")), 3]);
+  self::f2(<core::int>[let final dynamic #t5 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);\n                                                                   ^"]);
+  self::f2(<core::int>[let final dynamic #t6 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);\n                                                                   ^", 3]);
   self::f3(<core::Iterable<core::int>>[]);
   self::f3(<core::Iterable<core::int>>[<core::int>[3]]);
-  self::f3(<core::Iterable<core::int>>[<core::int>[let final dynamic #t7 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]\n                                                                  ^"))]]);
-  self::f3(<core::Iterable<core::int>>[<core::int>[let final dynamic #t8 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],\n                                                                  ^"))], <core::int>[3]]);
+  self::f3(<core::Iterable<core::int>>[<core::int>[let final dynamic #t7 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]\n                                                                  ^"]]);
+  self::f3(<core::Iterable<core::int>>[<core::int>[let final dynamic #t8 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],\n                                                                  ^"], <core::int>[3]]);
   self::f4(a: <core::Iterable<core::int>>[]);
   self::f4(a: <core::Iterable<core::int>>[<core::int>[3]]);
-  self::f4(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t9 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]\n                                                                  ^"))]]);
-  self::f4(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t10 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],\n                                                                  ^"))], <core::int>[3]]);
+  self::f4(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t9 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]\n                                                                  ^"]]);
+  self::f4(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t10 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],\n                                                                  ^"], <core::int>[3]]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
index 6f719a2..a4f41b5 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
@@ -7,37 +7,37 @@
   {
     (core::int) → core::String l0 = (core::int x) → core::Null => null;
     (core::int) → core::String l1 = (core::int x) → core::String => "hello";
-    (core::int) → core::String l2 = let final dynamic #t1 = (core::String x) → core::String => "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type '(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::String'.\n        l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (String x) =>\n                                                                 ^"));
-    (core::int) → core::String l3 = (core::int x) → core::String => let final dynamic #t2 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        l3 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (int x) => 3;\n                                                                            ^"));
+    (core::int) → core::String l2 = let final dynamic #t1 = (core::String x) → core::String => "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type '(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::String'.\n        l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (String x) =>\n                                                                 ^";
+    (core::int) → core::String l3 = (core::int x) → core::String => let final dynamic #t2 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        l3 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (int x) => 3;\n                                                                            ^";
     (core::int) → core::String l4 = (core::int x) → core::String {
-      return let final dynamic #t3 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      return /*error:RETURN_OF_INVALID_TYPE*/ 3;\n                                              ^"));
+      return let final dynamic #t3 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      return /*error:RETURN_OF_INVALID_TYPE*/ 3;\n                                              ^";
     };
   }
   {
     (core::int) → core::String l0 = (core::int x) → core::Null => null;
     (core::int) → core::String l1 = (core::int x) → core::String => "hello";
-    (core::int) → core::String l2 = (core::int x) → core::String => let final dynamic #t4 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n            3;\n            ^"));
+    (core::int) → core::String l2 = (core::int x) → core::String => let final dynamic #t4 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n            3;\n            ^";
     (core::int) → core::String l3 = (core::int x) → core::String {
-      return let final dynamic #t5 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      return /*error:RETURN_OF_INVALID_TYPE*/ 3;\n                                              ^"));
+      return let final dynamic #t5 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      return /*error:RETURN_OF_INVALID_TYPE*/ 3;\n                                              ^";
     };
     (core::int) → core::String l4 = (core::int x) → core::String {
-      return let final dynamic #t6 = x in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      return /*error:RETURN_OF_INVALID_TYPE*/ x;\n                                              ^"));
+      return let final dynamic #t6 = x in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      return /*error:RETURN_OF_INVALID_TYPE*/ x;\n                                              ^";
     };
   }
   {
     (core::int) → core::List<core::String> l0 = (core::int x) → core::Null => null;
     (core::int) → core::List<core::String> l1 = (core::int x) → core::List<core::String> => <core::String>["hello"];
-    (core::int) → core::List<core::String> l2 = let final dynamic #t7 = (core::String x) → core::List<core::String> => <core::String>["hello"] in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type '(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::List<dart.core::String>'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::List<dart.core::String>'.\n        l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=List<String>*/ (String\n                                                                       ^"));
-    (core::int) → core::List<core::String> l3 = (core::int x) → core::List<core::String> => <core::String>[let final dynamic #t8 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n              /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3\n                                                         ^"))];
+    (core::int) → core::List<core::String> l2 = let final dynamic #t7 = (core::String x) → core::List<core::String> => <core::String>["hello"] in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type '(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::List<dart.core::String>'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::List<dart.core::String>'.\n        l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=List<String>*/ (String\n                                                                       ^";
+    (core::int) → core::List<core::String> l3 = (core::int x) → core::List<core::String> => <core::String>[let final dynamic #t8 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n              /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3\n                                                         ^"];
     (core::int) → core::List<core::String> l4 = (core::int x) → core::List<core::String> {
-      return <core::String>[let final dynamic #t9 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3\n                                                   ^"))];
+      return <core::String>[let final dynamic #t9 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3\n                                                   ^"];
     };
   }
   {
     (core::int) → core::int l0 = (core::int x) → core::int => x;
     (core::int) → core::int l1 = (core::int x) → core::int => x.{core::num::+}(1);
-    (core::int) → core::String l2 = (core::int x) → core::String => let final dynamic #t10 = x in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n            x;\n            ^"));
-    (core::int) → core::String l3 = (core::int x) → core::String => (let final dynamic #t11 = x in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:63:14: Error: The method 'substring' isn't defined for the class 'dart.core::int'.\nTry correcting the name to the name of an existing method, or defining a method named 'substring'.\n            .substring(3);\n             ^"))) as{TypeError} core::String;
+    (core::int) → core::String l2 = (core::int x) → core::String => let final dynamic #t10 = x in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n            x;\n            ^";
+    (core::int) → core::String l3 = (core::int x) → core::String => (let final dynamic #t11 = x in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:63:14: Error: The method 'substring' isn't defined for the class 'dart.core::int'.\nTry correcting the name to the name of an existing method, or defining a method named 'substring'.\n            .substring(3);\n             ^") as{TypeError} core::String;
     (core::String) → core::String l4 = (core::String x) → core::String => x.{core::String::substring}(3);
   }
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
index 7a2b86c..1c86887 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
@@ -25,24 +25,24 @@
 static method test() → void {
   new self::F0::•<core::int>(<core::int>[]);
   new self::F0::•<core::int>(<core::int>[3]);
-  new self::F0::•<core::int>(<core::int>[let final dynamic #t1 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);\n                                                                    ^"))]);
-  new self::F0::•<core::int>(<core::int>[let final dynamic #t2 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^")), 3]);
+  new self::F0::•<core::int>(<core::int>[let final dynamic #t1 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);\n                                                                    ^"]);
+  new self::F0::•<core::int>(<core::int>[let final dynamic #t2 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^", 3]);
   new self::F1::•<core::int>(a: <core::int>[]);
   new self::F1::•<core::int>(a: <core::int>[3]);
-  new self::F1::•<core::int>(a: <core::int>[let final dynamic #t3 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"\n                                               ^"))]);
-  new self::F1::•<core::int>(a: <core::int>[let final dynamic #t4 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^")), 3]);
+  new self::F1::•<core::int>(a: <core::int>[let final dynamic #t3 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"\n                                               ^"]);
+  new self::F1::•<core::int>(a: <core::int>[let final dynamic #t4 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^", 3]);
   new self::F2::•<core::int>(<core::int>[]);
   new self::F2::•<core::int>(<core::int>[3]);
-  new self::F2::•<core::int>(<core::int>[let final dynamic #t5 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);\n                                                                    ^"))]);
-  new self::F2::•<core::int>(<core::int>[let final dynamic #t6 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^")), 3]);
+  new self::F2::•<core::int>(<core::int>[let final dynamic #t5 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);\n                                                                    ^"]);
+  new self::F2::•<core::int>(<core::int>[let final dynamic #t6 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^", 3]);
   new self::F3::•<core::int>(<core::Iterable<core::int>>[]);
   new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let final dynamic #t7 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]\n                                                                  ^"))]]);
-  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let final dynamic #t8 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],\n                                                                  ^"))], <core::int>[3]]);
+  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let final dynamic #t7 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]\n                                                                  ^"]]);
+  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let final dynamic #t8 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],\n                                                                  ^"], <core::int>[3]]);
   new self::F4::•<core::int>(a: <core::Iterable<core::int>>[]);
   new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t9 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]\n                                                                  ^"))]]);
-  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t10 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],\n                                                                  ^"))], <core::int>[3]]);
+  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t9 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]\n                                                                  ^"]]);
+  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t10 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],\n                                                                  ^"], <core::int>[3]]);
   new self::F3::•<dynamic>(<core::Iterable<dynamic>>[]);
   self::F3<core::int> f31 = new self::F3::•<core::int>(<core::List<core::int>>[<core::int>[3]]);
   self::F3<core::String> f32 = new self::F3::•<core::String>(<core::List<core::String>>[<core::String>["hello"]]);
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
index 0ebb117..0322edf 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
@@ -9,10 +9,10 @@
     <S extends core::Object>(core::int) → core::String v = f;
     v = <T extends core::Object>(core::int x) → core::Null => null;
     v = <T extends core::Object>(core::int x) → core::String => "hello";
-    v = let final dynamic #t1 = <T extends core::Object>(core::String x) → core::String => "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type '<T extends dart.core::Object>(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '<S extends dart.core::Object>(dart.core::int) \u8594 dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object>(dart.core::int) \u8594 dart.core::String'.\n    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (String x) =>\n                                                                ^"));
-    v = <T extends core::Object>(core::int x) → core::String => let final dynamic #t2 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (int x) => 3;\n                                                                           ^"));
+    v = let final dynamic #t1 = <T extends core::Object>(core::String x) → core::String => "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type '<T extends dart.core::Object>(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '<S extends dart.core::Object>(dart.core::int) \u8594 dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object>(dart.core::int) \u8594 dart.core::String'.\n    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (String x) =>\n                                                                ^";
+    v = <T extends core::Object>(core::int x) → core::String => let final dynamic #t2 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (int x) => 3;\n                                                                           ^";
     v = <T extends core::Object>(core::int x) → core::String {
-      return let final dynamic #t3 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      return /*error:RETURN_OF_INVALID_TYPE*/ 3;\n                                              ^"));
+      return let final dynamic #t3 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      return /*error:RETURN_OF_INVALID_TYPE*/ 3;\n                                              ^";
     };
   }
   {
@@ -21,12 +21,12 @@
     <S extends core::Object>(core::int) → core::String v = f;
     v = <T extends core::Object>(core::int x) → core::Null => null;
     v = <T extends core::Object>(core::int x) → core::String => "hello";
-    v = <T extends core::Object>(core::int x) → core::String => let final dynamic #t4 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        3;\n        ^"));
+    v = <T extends core::Object>(core::int x) → core::String => let final dynamic #t4 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        3;\n        ^";
     v = <T extends core::Object>(core::int x) → core::String {
-      return let final dynamic #t5 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      return /*error:RETURN_OF_INVALID_TYPE*/ 3;\n                                              ^"));
+      return let final dynamic #t5 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      return /*error:RETURN_OF_INVALID_TYPE*/ 3;\n                                              ^";
     };
     v = <T extends core::Object>(core::int x) → core::String {
-      return let final dynamic #t6 = x in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      return /*error:RETURN_OF_INVALID_TYPE*/ x;\n                                              ^"));
+      return let final dynamic #t6 = x in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      return /*error:RETURN_OF_INVALID_TYPE*/ x;\n                                              ^";
     };
   }
   {
@@ -35,10 +35,10 @@
     <S extends core::Object>(core::int) → core::List<core::String> v = f;
     v = <T extends core::Object>(core::int x) → core::Null => null;
     v = <T extends core::Object>(core::int x) → core::List<core::String> => <core::String>["hello"];
-    v = let final dynamic #t7 = <T extends core::Object>(core::String x) → core::List<core::String> => <core::String>["hello"] in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type '<T extends dart.core::Object>(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '<S extends dart.core::Object>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.\nTry changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.\n    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=List<String>*/ (String\n                                                                      ^"));
-    v = <T extends core::Object>(core::int x) → core::List<core::String> => <core::String>[let final dynamic #t8 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n          /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3\n                                                     ^"))];
+    v = let final dynamic #t7 = <T extends core::Object>(core::String x) → core::List<core::String> => <core::String>["hello"] in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type '<T extends dart.core::Object>(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '<S extends dart.core::Object>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.\nTry changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.\n    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=List<String>*/ (String\n                                                                      ^";
+    v = <T extends core::Object>(core::int x) → core::List<core::String> => <core::String>[let final dynamic #t8 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n          /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3\n                                                     ^"];
     v = <T extends core::Object>(core::int x) → core::List<core::String> {
-      return <core::String>[let final dynamic #t9 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3\n                                                   ^"))];
+      return <core::String>[let final dynamic #t9 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3\n                                                   ^"];
     };
   }
   {
@@ -52,8 +52,8 @@
     x = <T extends core::Object>(core::int x) → core::int => x;
     x = <T extends core::Object>(core::int x) → core::int => x.{core::num::+}(1);
     <T extends core::Object>(core::int) → core::String y = int2String;
-    y = <T extends core::Object>(core::int x) → core::String => let final dynamic #t10 = x in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        x;\n        ^"));
-    y = <T extends core::Object>(core::int x) → core::String => (let final dynamic #t11 = x in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:66:10: Error: The method 'substring' isn't defined for the class 'dart.core::int'.\nTry correcting the name to the name of an existing method, or defining a method named 'substring'.\n        .substring(3);\n         ^"))) as{TypeError} core::String;
+    y = <T extends core::Object>(core::int x) → core::String => let final dynamic #t10 = x in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        x;\n        ^";
+    y = <T extends core::Object>(core::int x) → core::String => (let final dynamic #t11 = x in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:66:10: Error: The method 'substring' isn't defined for the class 'dart.core::int'.\nTry correcting the name to the name of an existing method, or defining a method named 'substring'.\n        .substring(3);\n         ^") as{TypeError} core::String;
     <T extends core::Object>(core::String) → core::String z = string2String;
     z = <T extends core::Object>(core::String x) → core::String => x.{core::String::substring}(3);
   }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
index b1d7123..251b409 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
@@ -56,59 +56,59 @@
     self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(3, "hello");
     self::A<core::int, core::String> a2 = new self::A::•<core::int, core::String>(3, "hello");
     self::A<core::int, core::String> a3 = new self::A::named<core::int, core::String>(3, "hello");
-    self::A<core::int, core::String> a4 = let final dynamic #t1 = new self::A::•<core::int, dynamic>(3, "hello") in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:46:50: Error: The constructor returns type 'test::A<dart.core::int, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.\nChange the type of the object being constructed or the context in which it is used.\n        a4 = /*error:INVALID_CAST_NEW_EXPR*/ new A<int, dynamic>(3, \"hello\");\n                                                 ^"));
-    self::A<core::int, core::String> a5 = let final dynamic #t2 = new self::A::named<dynamic, dynamic>(3, "hello") in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:48:50: Error: The constructor returns type 'test::A<dynamic, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.\nChange the type of the object being constructed or the context in which it is used.\n        a5 = /*error:INVALID_CAST_NEW_EXPR*/ new A<dynamic, dynamic>.named(\n                                                 ^"));
+    self::A<core::int, core::String> a4 = let final dynamic #t1 = new self::A::•<core::int, dynamic>(3, "hello") in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:46:50: Error: The constructor returns type 'test::A<dart.core::int, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.\nChange the type of the object being constructed or the context in which it is used.\n        a4 = /*error:INVALID_CAST_NEW_EXPR*/ new A<int, dynamic>(3, \"hello\");\n                                                 ^";
+    self::A<core::int, core::String> a5 = let final dynamic #t2 = new self::A::named<dynamic, dynamic>(3, "hello") in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:48:50: Error: The constructor returns type 'test::A<dynamic, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.\nChange the type of the object being constructed or the context in which it is used.\n        a5 = /*error:INVALID_CAST_NEW_EXPR*/ new A<dynamic, dynamic>.named(\n                                                 ^";
   }
   {
-    self::A<core::int, core::String> a0 = new self::A::•<core::int, core::String>(let final dynamic #t3 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^")), let final dynamic #t4 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);\n                                               ^")));
-    self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(let final dynamic #t5 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^")), let final dynamic #t6 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);\n                                               ^")));
+    self::A<core::int, core::String> a0 = new self::A::•<core::int, core::String>(let final dynamic #t3 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^", let final dynamic #t4 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);\n                                               ^");
+    self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(let final dynamic #t5 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^", let final dynamic #t6 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);\n                                               ^");
   }
   {
     self::A<core::int, core::String> a0 = new self::B::•<core::String, core::int>("hello", 3);
     self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>("hello", 3);
     self::A<core::int, core::String> a2 = new self::B::•<core::String, core::int>("hello", 3);
     self::A<core::int, core::String> a3 = new self::B::named<core::String, core::int>("hello", 3);
-    self::A<core::int, core::String> a4 = let final dynamic #t7 = new self::B::•<core::String, dynamic>("hello", 3) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'test::B<dart.core::String, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.\n        a4 = /*error:INVALID_ASSIGNMENT*/ new B<String, dynamic>(\"hello\", 3);\n                                              ^"));
-    self::A<core::int, core::String> a5 = let final dynamic #t8 = new self::B::named<dynamic, dynamic>("hello", 3) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'test::B<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.\n        a5 = /*error:INVALID_ASSIGNMENT*/ new B<dynamic, dynamic>.named(\n                                              ^"));
+    self::A<core::int, core::String> a4 = let final dynamic #t7 = new self::B::•<core::String, dynamic>("hello", 3) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'test::B<dart.core::String, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.\n        a4 = /*error:INVALID_ASSIGNMENT*/ new B<String, dynamic>(\"hello\", 3);\n                                              ^";
+    self::A<core::int, core::String> a5 = let final dynamic #t8 = new self::B::named<dynamic, dynamic>("hello", 3) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'test::B<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.\n        a5 = /*error:INVALID_ASSIGNMENT*/ new B<dynamic, dynamic>.named(\n                                              ^";
   }
   {
-    self::A<core::int, core::String> a0 = new self::B::•<core::String, core::int>(let final dynamic #t9 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,\n                                               ^")), let final dynamic #t10 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");\n                                               ^")));
-    self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>(let final dynamic #t11 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,\n                                               ^")), let final dynamic #t12 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");\n                                               ^")));
+    self::A<core::int, core::String> a0 = new self::B::•<core::String, core::int>(let final dynamic #t9 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,\n                                               ^", let final dynamic #t10 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");\n                                               ^");
+    self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>(let final dynamic #t11 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,\n                                               ^", let final dynamic #t12 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");\n                                               ^");
   }
   {
     self::A<core::int, core::int> a0 = new self::C::•<core::int>(3);
     self::A<core::int, core::int> a1 = new self::C::named<core::int>(3);
     self::A<core::int, core::int> a2 = new self::C::•<core::int>(3);
     self::A<core::int, core::int> a3 = new self::C::named<core::int>(3);
-    self::A<core::int, core::int> a4 = let final dynamic #t13 = new self::C::•<dynamic>(3) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::int>'.\n    A<int, int> a4 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>(3);\n                                                      ^"));
-    self::A<core::int, core::int> a5 = let final dynamic #t14 = new self::C::named<dynamic>(3) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::int>'.\n    A<int, int> a5 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>.named(3);\n                                                      ^"));
+    self::A<core::int, core::int> a4 = let final dynamic #t13 = new self::C::•<dynamic>(3) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::int>'.\n    A<int, int> a4 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>(3);\n                                                      ^";
+    self::A<core::int, core::int> a5 = let final dynamic #t14 = new self::C::named<dynamic>(3) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::int>'.\n    A<int, int> a5 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>.named(3);\n                                                      ^";
   }
   {
-    self::A<core::int, core::int> a0 = new self::C::•<core::int>(let final dynamic #t15 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");\n                                               ^")));
-    self::A<core::int, core::int> a1 = new self::C::named<core::int>(let final dynamic #t16 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");\n                                               ^")));
+    self::A<core::int, core::int> a0 = new self::C::•<core::int>(let final dynamic #t15 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");\n                                               ^");
+    self::A<core::int, core::int> a1 = new self::C::named<core::int>(let final dynamic #t16 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");\n                                               ^");
   }
   {
     self::A<core::int, core::String> a0 = new self::D::•<dynamic, core::String>("hello");
     self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>("hello");
     self::A<core::int, core::String> a2 = new self::D::•<core::int, core::String>("hello");
     self::A<core::int, core::String> a3 = new self::D::named<core::String, core::String>("hello");
-    self::A<core::int, core::String> a4 = let final dynamic #t17 = new self::D::•<core::num, dynamic>("hello") in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'test::D<dart.core::num, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.\n        a4 = /*error:INVALID_ASSIGNMENT*/ new D<num, dynamic>(\"hello\");\n                                              ^"));
-    self::A<core::int, core::String> a5 = let final dynamic #t18 = new self::D::named<dynamic, dynamic>("hello") in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'test::D<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.\n        a5 = /*error:INVALID_ASSIGNMENT*/ new D<dynamic, dynamic>.named(\n                                              ^"));
+    self::A<core::int, core::String> a4 = let final dynamic #t17 = new self::D::•<core::num, dynamic>("hello") in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'test::D<dart.core::num, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.\n        a4 = /*error:INVALID_ASSIGNMENT*/ new D<num, dynamic>(\"hello\");\n                                              ^";
+    self::A<core::int, core::String> a5 = let final dynamic #t18 = new self::D::named<dynamic, dynamic>("hello") in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'test::D<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.\n        a5 = /*error:INVALID_ASSIGNMENT*/ new D<dynamic, dynamic>.named(\n                                              ^";
   }
   {
-    self::A<core::int, core::String> a0 = new self::D::•<dynamic, core::String>(let final dynamic #t19 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);\n                                               ^")));
-    self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>(let final dynamic #t20 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);\n                                               ^")));
+    self::A<core::int, core::String> a0 = new self::D::•<dynamic, core::String>(let final dynamic #t19 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);\n                                               ^");
+    self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>(let final dynamic #t20 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);\n                                               ^");
   }
   {
     self::A<self::C<core::int>, core::String> a0 = new self::E::•<core::int, core::String>("hello");
   }
   {
     self::A<core::int, core::String> a0 = new self::F::•<core::int, core::String>(3, "hello", a: <core::int>[3], b: <core::String>["hello"]);
-    self::A<core::int, core::String> a1 = new self::F::•<core::int, core::String>(3, "hello", a: <core::int>[let final dynamic #t21 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n          /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"\n                                                     ^"))], b: <core::String>[let final dynamic #t22 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n          /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3\n                                                     ^"))]);
+    self::A<core::int, core::String> a1 = new self::F::•<core::int, core::String>(3, "hello", a: <core::int>[let final dynamic #t21 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n          /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"\n                                                     ^"], b: <core::String>[let final dynamic #t22 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n          /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3\n                                                     ^"]);
     self::A<core::int, core::String> a2 = new self::F::named<core::int, core::String>(3, "hello", 3, "hello");
     self::A<core::int, core::String> a3 = new self::F::named<core::int, core::String>(3, "hello");
-    self::A<core::int, core::String> a4 = new self::F::named<core::int, core::String>(3, "hello", let final dynamic #t23 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^")), let final dynamic #t24 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);\n                                               ^")));
-    self::A<core::int, core::String> a5 = new self::F::named<core::int, core::String>(3, "hello", let final dynamic #t25 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");\n                                               ^")));
+    self::A<core::int, core::String> a4 = new self::F::named<core::int, core::String>(3, "hello", let final dynamic #t23 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                               ^", let final dynamic #t24 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);\n                                               ^");
+    self::A<core::int, core::String> a5 = new self::F::named<core::int, core::String>(3, "hello", let final dynamic #t25 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");\n                                               ^");
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
index c9f07bb..682efdc 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::List<core::String> list1 = const <core::String>[], core::List<core::String> list2 = const <core::String>[let final dynamic #t1 = 42 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42\n                                                                                        ^"))]]) → void {}
+static method foo([core::List<core::String> list1 = const <core::String>[], core::List<core::String> list2 = const <core::String>[let final dynamic #t1 = 42 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42\n                                                                                        ^"]]) → void {}
 static method main() → void {
   {
     core::List<core::int> l0 = <core::int>[];
     core::List<core::int> l1 = <core::int>[3];
-    core::List<core::int> l2 = <core::int>[let final dynamic #t2 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"\n                                                 ^"))];
-    core::List<core::int> l3 = <core::int>[let final dynamic #t3 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                                 ^")), 3];
+    core::List<core::int> l2 = <core::int>[let final dynamic #t2 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"\n                                                 ^"];
+    core::List<core::int> l3 = <core::int>[let final dynamic #t3 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                                 ^", 3];
   }
   {
     core::List<dynamic> l0 = <dynamic>[];
@@ -17,21 +17,21 @@
     core::List<dynamic> l3 = <dynamic>["hello", 3];
   }
   {
-    core::List<core::int> l0 = let final dynamic #t4 = <core::num>[] in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:33:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.\nChange the type of the list literal or the context in which it is used.\n    List<int> l0 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[];\n                                                            ^"));
-    core::List<core::int> l1 = let final dynamic #t5 = <core::num>[3] in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:34:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.\nChange the type of the list literal or the context in which it is used.\n    List<int> l1 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[3];\n                                                            ^"));
-    core::List<core::int> l2 = let final dynamic #t6 = <core::num>[let final dynamic #t7 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"\n                                                 ^"))] in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:35:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.\nChange the type of the list literal or the context in which it is used.\n    List<int> l2 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[\n                                                            ^"));
-    core::List<core::int> l3 = let final dynamic #t8 = <core::num>[let final dynamic #t9 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                                 ^")), 3] in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.\nChange the type of the list literal or the context in which it is used.\n    List<int> l3 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[\n                                                            ^"));
+    core::List<core::int> l0 = let final dynamic #t4 = <core::num>[] in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:33:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.\nChange the type of the list literal or the context in which it is used.\n    List<int> l0 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[];\n                                                            ^";
+    core::List<core::int> l1 = let final dynamic #t5 = <core::num>[3] in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:34:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.\nChange the type of the list literal or the context in which it is used.\n    List<int> l1 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[3];\n                                                            ^";
+    core::List<core::int> l2 = let final dynamic #t6 = <core::num>[let final dynamic #t7 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"\n                                                 ^"] in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:35:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.\nChange the type of the list literal or the context in which it is used.\n    List<int> l2 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[\n                                                            ^";
+    core::List<core::int> l3 = let final dynamic #t8 = <core::num>[let final dynamic #t9 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                                 ^", 3] in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.\nChange the type of the list literal or the context in which it is used.\n    List<int> l3 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[\n                                                            ^";
   }
   {
     core::Iterable<core::int> i0 = <core::int>[];
     core::Iterable<core::int> i1 = <core::int>[3];
-    core::Iterable<core::int> i2 = <core::int>[let final dynamic #t10 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"\n                                                 ^"))];
-    core::Iterable<core::int> i3 = <core::int>[let final dynamic #t11 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                                 ^")), 3];
+    core::Iterable<core::int> i2 = <core::int>[let final dynamic #t10 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"\n                                                 ^"];
+    core::Iterable<core::int> i3 = <core::int>[let final dynamic #t11 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                                 ^", 3];
   }
   {
     const core::List<core::int> c0 = const <core::int>[];
     const core::List<core::int> c1 = const <core::int>[3];
-    const core::List<core::int> c2 = const <core::int>[let final dynamic #t12 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"\n                                                                                        ^"))];
-    const core::List<core::int> c3 = const <core::int>[let final dynamic #t13 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                                                                        ^")), 3];
+    const core::List<core::int> c2 = const <core::int>[let final dynamic #t12 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"\n                                                                                        ^"];
+    const core::List<core::int> c3 = const <core::int>[let final dynamic #t13 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",\n                                                                                        ^", 3];
   }
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
index fd577a7..b13ab72 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::Map<core::int, core::String> m1 = const <core::int, core::String>{1: "hello"}, core::Map<core::int, core::String> m2 = const <core::int, core::String>{let final dynamic #t1 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":\n                                                                              ^")): "world"}]) → void {}
+static method foo([core::Map<core::int, core::String> m1 = const <core::int, core::String>{1: "hello"}, core::Map<core::int, core::String> m2 = const <core::int, core::String>{let final dynamic #t1 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":\n                                                                              ^": "world"}]) → void {}
 static method test() → void {
   {
     core::Map<core::int, core::String> l0 = <core::int, core::String>{};
     core::Map<core::int, core::String> l1 = <core::int, core::String>{3: "hello"};
-    core::Map<core::int, core::String> l2 = <core::int, core::String>{let final dynamic #t2 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"\n                                            ^")): "hello"};
-    core::Map<core::int, core::String> l3 = <core::int, core::String>{3: let final dynamic #t3 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3\n                                                 ^"))};
-    core::Map<core::int, core::String> l4 = <core::int, core::String>{3: "hello", let final dynamic #t4 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":\n                                            ^")): let final dynamic #t5 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n          /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3\n                                                  ^"))};
+    core::Map<core::int, core::String> l2 = <core::int, core::String>{let final dynamic #t2 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"\n                                            ^": "hello"};
+    core::Map<core::int, core::String> l3 = <core::int, core::String>{3: let final dynamic #t3 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3\n                                                 ^"};
+    core::Map<core::int, core::String> l4 = <core::int, core::String>{3: "hello", let final dynamic #t4 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":\n                                            ^": let final dynamic #t5 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n          /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3\n                                                  ^"};
   }
   {
     core::Map<dynamic, dynamic> l0 = <dynamic, dynamic>{};
@@ -22,27 +22,27 @@
     core::Map<dynamic, core::String> l0 = <dynamic, core::String>{};
     core::Map<dynamic, core::String> l1 = <dynamic, core::String>{3: "hello"};
     core::Map<dynamic, core::String> l2 = <dynamic, core::String>{"hello": "hello"};
-    core::Map<dynamic, core::String> l3 = <dynamic, core::String>{3: let final dynamic #t6 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3\n                                                 ^"))};
-    core::Map<dynamic, core::String> l4 = <dynamic, core::String>{3: "hello", "hello": let final dynamic #t7 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      \"hello\": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3\n                                                       ^"))};
+    core::Map<dynamic, core::String> l3 = <dynamic, core::String>{3: let final dynamic #t6 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3\n                                                 ^"};
+    core::Map<dynamic, core::String> l4 = <dynamic, core::String>{3: "hello", "hello": let final dynamic #t7 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      \"hello\": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3\n                                                       ^"};
   }
   {
     core::Map<core::int, dynamic> l0 = <core::int, dynamic>{};
     core::Map<core::int, dynamic> l1 = <core::int, dynamic>{3: "hello"};
-    core::Map<core::int, dynamic> l2 = <core::int, dynamic>{let final dynamic #t8 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"\n                                            ^")): "hello"};
+    core::Map<core::int, dynamic> l2 = <core::int, dynamic>{let final dynamic #t8 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"\n                                            ^": "hello"};
     core::Map<core::int, dynamic> l3 = <core::int, dynamic>{3: 3};
-    core::Map<core::int, dynamic> l4 = <core::int, dynamic>{3: "hello", let final dynamic #t9 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": 3\n                                            ^")): 3};
+    core::Map<core::int, dynamic> l4 = <core::int, dynamic>{3: "hello", let final dynamic #t9 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": 3\n                                            ^": 3};
   }
   {
-    core::Map<core::int, core::String> l0 = let final dynamic #t10 = <core::num, dynamic>{} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:68:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.\nChange the type of the map literal or the context in which it is used.\n    Map<int, String> l0 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{};\n                                                                           ^"));
-    core::Map<core::int, core::String> l1 = let final dynamic #t11 = <core::num, dynamic>{3: "hello"} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:69:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.\nChange the type of the map literal or the context in which it is used.\n    Map<int, String> l1 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{\n                                                                           ^"));
-    core::Map<core::int, core::String> l3 = let final dynamic #t12 = <core::num, dynamic>{3: 3} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:72:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.\nChange the type of the map literal or the context in which it is used.\n    Map<int, String> l3 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{\n                                                                           ^"));
+    core::Map<core::int, core::String> l0 = let final dynamic #t10 = <core::num, dynamic>{} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:68:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.\nChange the type of the map literal or the context in which it is used.\n    Map<int, String> l0 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{};\n                                                                           ^";
+    core::Map<core::int, core::String> l1 = let final dynamic #t11 = <core::num, dynamic>{3: "hello"} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:69:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.\nChange the type of the map literal or the context in which it is used.\n    Map<int, String> l1 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{\n                                                                           ^";
+    core::Map<core::int, core::String> l3 = let final dynamic #t12 = <core::num, dynamic>{3: 3} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:72:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.\nChange the type of the map literal or the context in which it is used.\n    Map<int, String> l3 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{\n                                                                           ^";
   }
   {
     const core::Map<core::int, core::String> l0 = const <core::int, core::String>{};
     const core::Map<core::int, core::String> l1 = const <core::int, core::String>{3: "hello"};
-    const core::Map<core::int, core::String> l2 = const <core::int, core::String>{let final dynamic #t13 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":\n                                                                              ^")): "hello"};
-    const core::Map<core::int, core::String> l3 = const <core::int, core::String>{3: let final dynamic #t14 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3\n                                                                                     ^"))};
-    const core::Map<core::int, core::String> l4 = const <core::int, core::String>{3: "hello", let final dynamic #t15 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":\n                                                                              ^")): let final dynamic #t16 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:89:87: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n          /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3\n                                                                                      ^"))};
+    const core::Map<core::int, core::String> l2 = const <core::int, core::String>{let final dynamic #t13 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":\n                                                                              ^": "hello"};
+    const core::Map<core::int, core::String> l3 = const <core::int, core::String>{3: let final dynamic #t14 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n      3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3\n                                                                                     ^"};
+    const core::Map<core::int, core::String> l4 = const <core::int, core::String>{3: "hello", let final dynamic #t15 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":\n                                                                              ^": let final dynamic #t16 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:89:87: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n          /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3\n                                                                                      ^"};
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
index 544e036..8e73907 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
@@ -9,14 +9,14 @@
 }
 static method foo() → asy::Stream<core::List<core::int>> async* {
   yield<core::int>[];
-  yield let final dynamic #t1 = self::MyStream::•<dynamic>() in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:67: Error: A value of type 'test::MyStream<dynamic>' can't be assigned to a variable of type 'dart.core::List<dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dart.core::int>'.\n  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ MyStream();\n                                                                  ^"));
-  yield* let final dynamic #t2 = <dynamic>[] in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:64: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'dart.async::Stream<dart.core::List<dart.core::int>>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dart.core::List<dart.core::int>>'.\n  yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic*/ [];\n                                                               ^"));
+  yield let final dynamic #t1 = self::MyStream::•<dynamic>() in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:67: Error: A value of type 'test::MyStream<dynamic>' can't be assigned to a variable of type 'dart.core::List<dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dart.core::int>'.\n  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ MyStream();\n                                                                  ^";
+  yield* let final dynamic #t2 = <dynamic>[] in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:64: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'dart.async::Stream<dart.core::List<dart.core::int>>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dart.core::List<dart.core::int>>'.\n  yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic*/ [];\n                                                               ^";
   yield* self::MyStream::•<core::List<core::int>>();
 }
 static method bar() → core::Iterable<core::Map<core::int, core::int>> sync* {
   yield<core::int, core::int>{};
-  yield let final dynamic #t3 = core::List::_internal<dynamic>() in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:67: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'dart.core::Map<dart.core::int, dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::Map<dart.core::int, dart.core::int>'.\n  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();\n                                                                  ^"));
-  yield* let final dynamic #t4 = <dynamic, dynamic>{} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:73: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::Iterable<dart.core::Map<dart.core::int, dart.core::int>>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dart.core::Map<dart.core::int, dart.core::int>>'.\n  yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic, dynamic*/ {};\n                                                                        ^"));
+  yield let final dynamic #t3 = core::List::_internal<dynamic>() in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:67: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'dart.core::Map<dart.core::int, dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::Map<dart.core::int, dart.core::int>'.\n  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();\n                                                                  ^";
+  yield* let final dynamic #t4 = <dynamic, dynamic>{} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:73: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::Iterable<dart.core::Map<dart.core::int, dart.core::int>>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dart.core::Map<dart.core::int, dart.core::int>>'.\n  yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic, dynamic*/ {};\n                                                                        ^";
   yield* core::List::_internal<core::Map<core::int, core::int>>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
index 7ce4694..90b2c64 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
@@ -14,7 +14,7 @@
 }
 static method main() → void {
   self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
-  asy::Future<core::int> f2 = let final dynamic #t1 = f in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::Future<dart.core::int>'.\n  Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;\n                                                ^"));
+  asy::Future<core::int> f2 = let final dynamic #t1 = f in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::Future<dart.core::int>'.\n  Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;\n                                                ^";
   asy::Future<core::num> f3 = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3) as asy::Future<core::double>;
 }
 static method foo() → self::MyFuture<dynamic>
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
index feb474b..c13378b 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
@@ -14,7 +14,7 @@
 }
 static method main() → void {
   self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
-  self::MyFuture<core::int> f2 = let final dynamic #t1 = f in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'test::MyFuture<dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::MyFuture<dart.core::int>'.\n  MyFuture<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;\n                                                  ^"));
+  self::MyFuture<core::int> f2 = let final dynamic #t1 = f in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'test::MyFuture<dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::MyFuture<dart.core::int>'.\n  MyFuture<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;\n                                                  ^";
   self::MyFuture<core::num> f3 = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3) as self::MyFuture<core::double>;
 }
 static method foo() → self::MyFuture<dynamic>
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
index c50c1d6..7885101 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
@@ -14,7 +14,7 @@
 }
 static method test() → void {
   asy::Future<core::double> f = self::foo().{asy::Future::then}<core::double>((dynamic _) → core::double => 2.3);
-  asy::Future<core::int> f2 = let final dynamic #t1 = f in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'dart.async::Future<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::Future<dart.core::int>'.\n  Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;\n                                                ^"));
+  asy::Future<core::int> f2 = let final dynamic #t1 = f in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'dart.async::Future<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::Future<dart.core::int>'.\n  Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;\n                                                ^";
   asy::Future<core::num> f3 = self::foo().{asy::Future::then}<core::double>((dynamic _) → core::double => 2.3) as asy::Future<core::double>;
 }
 static method foo() → asy::Future<dynamic>
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
index 6f0d786..c7158f8f 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
@@ -13,7 +13,7 @@
     return null;
 }
 static field self::MyFuture<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final dynamic #t1 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<dart.core::int>'.\n        new /*@typeArgs=int*/ Future.value('hi'));\n                                           ^"))));
+static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final dynamic #t1 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<dart.core::int>'.\n        new /*@typeArgs=int*/ Future.value('hi'));\n                                           ^"));
 static field asy::Future<core::List<core::int>> t2 = self::f.{self::MyFuture::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
 static method g2() → asy::Future<core::List<core::int>> async {
   return <core::int>[3];
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
index 65a1eb4..c135f5a 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
@@ -13,7 +13,7 @@
     return null;
 }
 static field asy::Future<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final dynamic #t1 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<dart.core::int>'.\n        new /*@typeArgs=int*/ Future.value('hi'));\n                                           ^"))));
+static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final dynamic #t1 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<dart.core::int>'.\n        new /*@typeArgs=int*/ Future.value('hi'));\n                                           ^"));
 static field asy::Future<core::List<core::int>> t2 = self::f.{asy::Future::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
 static method g2() → asy::Future<core::List<core::int>> async {
   return <core::int>[3];
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
index 49bf492..9f39d90 100644
--- a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
@@ -16,10 +16,10 @@
   self::printDouble(math::min<core::double>(1.0, 2.0));
   self::printInt(self::myMax(1, 2) as{TypeError} core::int);
   self::printInt(self::myMax(1, 2) as core::int);
-  self::printInt(math::max<core::int>(1, let final dynamic #t1 = 2.0 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:29:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*@typeArgs=int*/ max(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));\n                                                                      ^"))));
-  self::printInt(math::min<core::int>(1, let final dynamic #t2 = 2.0 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:31:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*@typeArgs=int*/ min(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));\n                                                                      ^"))));
-  self::printDouble(math::max<core::double>(let final dynamic #t3 = 1 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:33:71: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n      /*@typeArgs=double*/ max(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));\n                                                                      ^")), 2.0));
-  self::printDouble(math::min<core::double>(let final dynamic #t4 = 1 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:35:71: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n      /*@typeArgs=double*/ min(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));\n                                                                      ^")), 2.0));
-  self::printInt(math::min<core::int>(let final dynamic #t5 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hi\",\n                                             ^")), let final dynamic #t6 = "there" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:40:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"there\"));\n                                             ^"))));
+  self::printInt(math::max<core::int>(1, let final dynamic #t1 = 2.0 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:29:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*@typeArgs=int*/ max(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));\n                                                                      ^"));
+  self::printInt(math::min<core::int>(1, let final dynamic #t2 = 2.0 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:31:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*@typeArgs=int*/ min(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));\n                                                                      ^"));
+  self::printDouble(math::max<core::double>(let final dynamic #t3 = 1 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:33:71: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n      /*@typeArgs=double*/ max(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));\n                                                                      ^", 2.0));
+  self::printDouble(math::min<core::double>(let final dynamic #t4 = 1 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:35:71: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n      /*@typeArgs=double*/ min(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));\n                                                                      ^", 2.0));
+  self::printInt(math::min<core::int>(let final dynamic #t5 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hi\",\n                                             ^", let final dynamic #t6 = "there" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:40:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"there\"));\n                                             ^"));
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart
index 76caea4..6382d87 100644
--- a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart
+++ b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart
@@ -2,7 +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.
 
-/*@testedFeatures=inference*/
+/*@testedFeatures=inference,error*/
 library test;
 
 class C {
@@ -10,7 +10,7 @@
 }
 
 class D extends C {
-/*error:INVALID_METHOD_OVERRIDE*/ /*@topType=dynamic*/ m(
+/*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(
           /*@topType=dynamic*/ x) =>
       x;
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
index 8f1d4a3..a111385 100644
--- a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
@@ -16,6 +16,7 @@
   method m(dynamic x) → dynamic
     return x;
 }
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:13:64: Error: The return type of the method 'D::m' is dynamic, which does not match the return type of the overridden method (test::C::m::T).\nChange to a subtype of test::C::m::T.\n/*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(\n                                                               ^"]/* from null */;
 static method main() → dynamic {
   core::int y = new self::D::•().{self::D::m}<core::int>(42) as{TypeError} core::int;
   core::print(y);
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
index 7294101..159630d 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
@@ -6,6 +6,6 @@
   return null;
 static method test() → dynamic {
   core::String x = self::f<core::String>(<core::String>["hi"]);
-  core::String y = self::f<core::String>(<core::String>[let final dynamic #t1 = 42 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n          /*@typeArgs=String*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);\n                                                                           ^"))]);
+  core::String y = self::f<core::String>(<core::String>[let final dynamic #t1 = 42 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n          /*@typeArgs=String*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);\n                                                                           ^"]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart
index b7dea26..df04cb8 100644
--- a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart
@@ -2,7 +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.
 
-/*@testedFeatures=inference*/
+/*@testedFeatures=inference,error*/
 library test;
 
 class C {
@@ -11,8 +11,8 @@
 }
 
 class D extends C {
-  /*error:INVALID_METHOD_OVERRIDE*/ T m<T>(T x) => x;
-  /*error:INVALID_METHOD_OVERRIDE*/ T g<T>(T x) => x;
+  T m<T>(T /*@error=OverrideTypeMismatchParameter*/ x) => x;
+  T g<T>(T /*@error=OverrideTypeMismatchParameter*/ x) => x;
 }
 
 main() {
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
index c249951..5cd40dd 100644
--- a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
@@ -20,6 +20,7 @@
   method g<T extends core::Object>(self::D::g::T x) → self::D::g::T
     return x;
 }
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:53: Error: The parameter 'x' of the method 'D::m' has type test::D::m::T, which does not match the corresponding type in the overridden method (dynamic).\nChange to a supertype of dynamic (or, for a covariant parameter, a subtype).\n  T m<T>(T /*@error=OverrideTypeMismatchParameter*/ x) => x;\n                                                    ^", "pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:53: Error: The parameter 'x' of the method 'D::g' has type test::D::g::T, which does not match the corresponding type in the overridden method (dart.core::int).\nChange to a supertype of dart.core::int (or, for a covariant parameter, a subtype).\n  T g<T>(T /*@error=OverrideTypeMismatchParameter*/ x) => x;\n                                                    ^"]/* from null */;
 static method main() → dynamic {
   core::int y = (new self::D::•() as self::C).{self::C::m}(42) as{TypeError} core::int;
   core::print(y);
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
index dd144e6..6bc1c77 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
@@ -21,8 +21,8 @@
   self::takeIIO(math::max<core::int>);
   self::takeDDO(math::max<core::double>);
   self::takeOOI((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let final dynamic #t1 = math::max<core::num> in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\n      /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);\n                                                                        ^")));
-  self::takeDID(let final dynamic #t2 = math::max<core::num> in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\n      /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);\n                                                                        ^")));
+  self::takeIDI(let final dynamic #t1 = math::max<core::num> in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\n      /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);\n                                                                        ^");
+  self::takeDID(let final dynamic #t2 = math::max<core::num> in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\n      /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);\n                                                                        ^");
   self::takeOON((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeOOO((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeIII(math::min<core::int>);
@@ -35,8 +35,8 @@
   self::takeIIO(math::min<core::int>);
   self::takeDDO(math::min<core::double>);
   self::takeOOI((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let final dynamic #t3 = math::min<core::num> in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\n  takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);\n                                                                       ^")));
-  self::takeDID(let final dynamic #t4 = math::min<core::num> in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\n  takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);\n                                                                       ^")));
+  self::takeIDI(let final dynamic #t3 = math::min<core::num> in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\n  takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);\n                                                                       ^");
+  self::takeDID(let final dynamic #t4 = math::min<core::num> in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\n  takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);\n                                                                       ^");
   self::takeOON((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeOOO((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeIII(new self::C::•().{self::C::m}<core::int>);
@@ -51,8 +51,8 @@
   self::takeOON((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeOOO((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeOOI((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let final dynamic #t5 = new self::C::•().{self::C::m}<core::num> in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\n          . /*@target=C::m*/ m);\n                             ^")));
-  self::takeDID(let final dynamic #t6 = new self::C::•().{self::C::m}<core::num> in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\n          . /*@target=C::m*/ m);\n                             ^")));
+  self::takeIDI(let final dynamic #t5 = new self::C::•().{self::C::m}<core::num> in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\n          . /*@target=C::m*/ m);\n                             ^");
+  self::takeDID(let final dynamic #t6 = new self::C::•().{self::C::m}<core::num> in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\n          . /*@target=C::m*/ m);\n                             ^");
 }
 static method takeIII((core::int, core::int) → core::int fn) → void {}
 static method takeDDD((core::double, core::double) → core::double fn) → void {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
index 9fc45f4..07fd5ca 100644
--- a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
@@ -4,6 +4,6 @@
 
 static method f() → void {
   core::List<core::String> y;
-  core::Iterable<core::String> x = y.{core::Iterable::map}<core::String>((core::String z) → core::String => let final dynamic #t1 = 1.0 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n          1.0);\n          ^")));
+  core::Iterable<core::String> x = y.{core::Iterable::map}<core::String>((core::String z) → core::String => let final dynamic #t1 = 1.0 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n          1.0);\n          ^");
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
index 6ca1c45..38c148a 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
@@ -8,8 +8,8 @@
 static method test() → dynamic {
   core::Iterable<asy::Future<core::int>> list = <core::int>[1, 2, 3].{core::Iterable::map}<asy::Future<core::int>>(self::make);
   asy::Future<core::List<core::int>> results = asy::Future::wait<core::int>(list);
-  asy::Future<core::String> results2 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", (asy::FutureOr<core::String> x, core::int y) → asy::FutureOr<core::String> => (let final dynamic #t1 = x in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:120: Error: The method '+' isn't defined for the class 'dart.async::FutureOr<dart.core::String>'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n                          /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +\n                                                                                                                       ^"))) as{TypeError} asy::FutureOr<core::String>));
-  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", let final dynamic #t2 = (core::String x, core::int y) → core::String => x.{core::String::+}(y.{core::int::toString}()) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: A value of type '(dart.core::String, dart.core::int) \u8594 dart.core::String' can't be assigned to a variable of type '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.\n                  /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String\n                                                                                                           ^"))));
+  asy::Future<core::String> results2 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", (asy::FutureOr<core::String> x, core::int y) → asy::FutureOr<core::String> => (let final dynamic #t1 = x in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:120: Error: The method '+' isn't defined for the class 'dart.async::FutureOr<dart.core::String>'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n                          /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +\n                                                                                                                       ^") as{TypeError} asy::FutureOr<core::String>));
+  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", let final dynamic #t2 = (core::String x, core::int y) → core::String => x.{core::String::+}(y.{core::int::toString}()) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: A value of type '(dart.core::String, dart.core::int) \u8594 dart.core::String' can't be assigned to a variable of type '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.\n                  /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String\n                                                                                                           ^"));
   asy::Future<core::String> results4 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → core::String => list.{core::Iterable::fold}<core::String>("", (core::String x, core::int y) → core::String => x.{core::String::+}(y.{core::int::toString}())));
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
index 9ce6a97..df8a365 100644
--- a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
@@ -23,12 +23,12 @@
   core::String s;
   core::int i;
   s = new self::B::•().{self::B::x} as{TypeError} core::String;
-  s = let final dynamic #t1 = new self::B::•().{self::B::y} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;\n                                                             ^"));
+  s = let final dynamic #t1 = new self::B::•().{self::B::y} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;\n                                                             ^";
   s = new self::B::•().{self::B::z};
-  s = let final dynamic #t2 = new self::B::•().{self::B::w} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;\n                                                             ^"));
+  s = let final dynamic #t2 = new self::B::•().{self::B::w} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;\n                                                             ^";
   i = new self::B::•().{self::B::x} as{TypeError} core::int;
   i = new self::B::•().{self::B::y};
-  i = let final dynamic #t3 = new self::B::•().{self::B::z} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;\n                                                             ^"));
+  i = let final dynamic #t3 = new self::B::•().{self::B::z} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;\n                                                             ^";
   i = new self::B::•().{self::B::w};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
index 690683f..90366c9 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
@@ -24,30 +24,30 @@
 static field core::int f = 2.{core::num::+}(3);
 static field core::int g = 3.{core::int::unary-}();
 static field self::B h = new self::A::•().{self::A::+}(3);
-static field dynamic i = let final dynamic #t3 = new self::A::•() in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:34:79: Error: The method 'unary-' isn't defined for the class 'test::A'.\nTry correcting the name to the name of an existing method, or defining a method named 'unary-'.\nvar /*@topType=dynamic*/ i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();\n                                                                              ^"));
+static field dynamic i = let final dynamic #t3 = new self::A::•() in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:34:79: Error: The method 'unary-' isn't defined for the class 'test::A'.\nTry correcting the name to the name of an existing method, or defining a method named 'unary-'.\nvar /*@topType=dynamic*/ i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();\n                                                                              ^";
 static field self::B j = null as self::B;
 static method test1() → dynamic {
-  self::a = let final dynamic #t4 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::A'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A'.\n  a = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^"));
+  self::a = let final dynamic #t4 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::A'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A'.\n  a = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^";
   self::a = new self::B::•(3);
-  self::b = let final dynamic #t5 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:40:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::B'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::B'.\n  b = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^"));
+  self::b = let final dynamic #t5 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:40:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::B'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::B'.\n  b = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^";
   self::b = new self::B::•(3);
   self::c1 = <dynamic>[];
-  self::c1 = let final dynamic #t6 = <dynamic, dynamic>{} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dynamic>'.\n  c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};\n                                                                   ^"));
+  self::c1 = let final dynamic #t6 = <dynamic, dynamic>{} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dynamic>'.\n  c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};\n                                                                   ^";
   self::c2 = <dynamic>[];
-  self::c2 = let final dynamic #t7 = <dynamic, dynamic>{} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dynamic>'.\n  c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};\n                                                                   ^"));
+  self::c2 = let final dynamic #t7 = <dynamic, dynamic>{} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dynamic>'.\n  c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};\n                                                                   ^";
   self::d = <dynamic, dynamic>{};
-  self::d = let final dynamic #t8 = 3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:36: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Map<dynamic, dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::Map<dynamic, dynamic>'.\n  d = /*error:INVALID_ASSIGNMENT*/ 3;\n                                   ^"));
+  self::d = let final dynamic #t8 = 3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:36: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Map<dynamic, dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::Map<dynamic, dynamic>'.\n  d = /*error:INVALID_ASSIGNMENT*/ 3;\n                                   ^";
   self::e = new self::A::•();
-  self::e = let final dynamic #t9 = <dynamic, dynamic>{} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:67: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'test::A'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A'.\n  e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};\n                                                                  ^"));
+  self::e = let final dynamic #t9 = <dynamic, dynamic>{} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:67: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'test::A'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A'.\n  e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};\n                                                                  ^";
   self::f = 3;
-  self::f = let final dynamic #t10 = false in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  f = /*error:INVALID_ASSIGNMENT*/ false;\n                                   ^"));
+  self::f = let final dynamic #t10 = false in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  f = /*error:INVALID_ASSIGNMENT*/ false;\n                                   ^";
   self::g = 1;
-  self::g = let final dynamic #t11 = false in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:53:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  g = /*error:INVALID_ASSIGNMENT*/ false;\n                                   ^"));
-  self::h = let final dynamic #t12 = false in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:54:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::B'.\n  h = /*error:INVALID_ASSIGNMENT*/ false;\n                                   ^"));
+  self::g = let final dynamic #t11 = false in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:53:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  g = /*error:INVALID_ASSIGNMENT*/ false;\n                                   ^";
+  self::h = let final dynamic #t12 = false in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:54:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::B'.\n  h = /*error:INVALID_ASSIGNMENT*/ false;\n                                   ^";
   self::h = new self::B::•("b");
   self::i = false;
   self::j = new self::B::•("b");
-  self::j = let final dynamic #t13 = false in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:58:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::B'.\n  j = /*error:INVALID_ASSIGNMENT*/ false;\n                                   ^"));
-  self::j = let final dynamic #t14 = <dynamic>[] in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:59:58: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'test::B'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::B'.\n  j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];\n                                                         ^"));
+  self::j = let final dynamic #t13 = false in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:58:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::B'.\n  j = /*error:INVALID_ASSIGNMENT*/ false;\n                                   ^";
+  self::j = let final dynamic #t14 = <dynamic>[] in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:59:58: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'test::B'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::B'.\n  j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];\n                                                         ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
index a1049d5..8240108 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
@@ -5,7 +5,7 @@
 
 static field core::int y = inf::x;
 static method test1() → dynamic {
-  inf::x = let final dynamic #t1 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^"));
-  self::y = let final dynamic #t2 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  y = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^"));
+  inf::x = let final dynamic #t1 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^";
+  self::y = let final dynamic #t2 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  y = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
index 9ea7a585..2e4b516 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
@@ -10,7 +10,7 @@
     ;
 }
 static method test1() → dynamic {
-  inf::A::x = let final dynamic #t1 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  A.x = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                     ^"));
-  self::B::y = let final dynamic #t2 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  B.y = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                     ^"));
+  inf::A::x = let final dynamic #t1 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  A.x = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                     ^";
+  self::B::y = let final dynamic #t2 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  B.y = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                     ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect
index 8311e1b..6724aed 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect
@@ -6,7 +6,7 @@
 static method test() → dynamic {
   function f() → dynamic
     return throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#g, 32, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
-  const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:14:3: Error: Can't declare 'g' because it was already used in this scope.\n  g() => 0;\n  ^"));
+  invalid-expression "pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:14:3: Error: Can't declare 'g' because it was already used in this scope.\n  g() => 0;\n  ^";
   dynamic v = f;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.expect
index 0543e35..748504a 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.expect
@@ -6,7 +6,7 @@
 static method test() → dynamic {
   function f() → dynamic
     return throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#g, 32, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
-  const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:14:3: Error: Can't declare 'g' because it was already used in this scope.\n  g() => 0;\n  ^"));
+  invalid-expression "pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:14:3: Error: Can't declare 'g' because it was already used in this scope.\n  g() => 0;\n  ^";
   () → dynamic v = f;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
index 90a895e..4c57475 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
@@ -16,7 +16,7 @@
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = let final dynamic #t1 = new self::B::•().{self::B::x} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;\n                                                                    ^"));
+  core::String y = let final dynamic #t1 = new self::B::•().{self::B::x} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;\n                                                                    ^";
   core::int z = new self::B::•().{self::B::x};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
index 6037f63..4182344 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
@@ -16,7 +16,7 @@
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = let final dynamic #t1 = new self::B::•().{self::B::x} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;\n                                                                    ^"));
+  core::String y = let final dynamic #t1 = new self::B::•().{self::B::x} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;\n                                                                    ^";
   core::int z = new self::B::•().{self::B::x};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
index c5b4f48..5808152 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
@@ -4,6 +4,6 @@
 
 static method test1() → dynamic {
   core::int x = 3;
-  x = let final dynamic #t1 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^"));
+  x = let final dynamic #t1 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
index 8ef2f58..366198e 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
@@ -4,6 +4,6 @@
 
 static method test2() → dynamic {
   core::int x = 3;
-  x = let final dynamic #t1 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^"));
+  x = let final dynamic #t1 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
index ca8a3db..d388007 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
@@ -11,13 +11,13 @@
     ;
   method test1() → dynamic {
     core::int a = this.{self::A::x};
-    a = let final dynamic #t1 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    a = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                     ^"));
+    a = let final dynamic #t1 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    a = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                     ^";
     a = 3;
     core::int b = this.{self::A::y};
-    b = let final dynamic #t2 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    b = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                     ^"));
+    b = let final dynamic #t2 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    b = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                     ^";
     b = 4;
     core::int c = this.{self::A::z};
-    c = let final dynamic #t3 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    c = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                     ^"));
+    c = let final dynamic #t3 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    c = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                     ^";
     c = 4;
   }
 }
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
index b4093b9..76876ca 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
@@ -7,13 +7,13 @@
 static final field core::int z = 42;
 static method test1() → dynamic {
   core::int a = self::x;
-  a = let final dynamic #t1 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  a = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^"));
+  a = let final dynamic #t1 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  a = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^";
   a = 3;
   core::int b = self::y;
-  b = let final dynamic #t2 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  b = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^"));
+  b = let final dynamic #t2 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  b = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^";
   b = 4;
   core::int c = self::z;
-  c = let final dynamic #t3 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  c = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^"));
+  c = let final dynamic #t3 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  c = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                   ^";
   c = 4;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
index 36156bb..a7065a9 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
@@ -19,7 +19,7 @@
 }
 static method foo() → dynamic {
   core::int y = new self::C::•().{self::C::x};
-  core::String z = let final dynamic #t1 = new self::C::•().{self::C::x} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;\n                                                                    ^"));
+  core::String z = let final dynamic #t1 = new self::C::•().{self::C::x} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;\n                                                                    ^";
 }
 static method main() → dynamic {
   self::foo();
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
index 3938452..845d695 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
@@ -16,10 +16,10 @@
   get x() → core::int
     return 3;
   get w() → core::int
-    return let final dynamic #t1 = "hello" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  get /*@topType=int*/ w => /*error:RETURN_OF_INVALID_TYPE*/ \"hello\";\n                                                             ^"));
+    return let final dynamic #t1 = "hello" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  get /*@topType=int*/ w => /*error:RETURN_OF_INVALID_TYPE*/ \"hello\";\n                                                             ^";
 }
 static method foo() → dynamic {
-  core::String y = let final dynamic #t2 = new self::B::•().{self::B::x} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;\n                                                                    ^"));
+  core::String y = let final dynamic #t2 = new self::B::•().{self::B::x} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;\n                                                                    ^";
   core::int z = new self::B::•().{self::B::x};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
index bf205a4..0a109ac 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
@@ -17,7 +17,7 @@
     return this.{self::B::y};
 }
 static method foo() → dynamic {
-  core::int y = let final dynamic #t1 = new self::B::•<core::String>().{self::B::x} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  int y = /*error:INVALID_ASSIGNMENT*/ new B<String>(). /*@target=B::x*/ x;\n                                                                         ^"));
+  core::int y = let final dynamic #t1 = new self::B::•<core::String>().{self::B::x} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  int y = /*error:INVALID_ASSIGNMENT*/ new B<String>(). /*@target=B::x*/ x;\n                                                                         ^";
   core::String z = new self::B::•<core::String>().{self::B::x};
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
index 84d133b..8c7be39 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
@@ -29,7 +29,7 @@
   method m(dynamic a, (dynamic, self::B::E) → dynamic f) → core::String {}
 }
 static method foo() → dynamic {
-  core::int y = let final dynamic #t1 = new self::B::•<dynamic>().{self::B::m}(null, null) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      . /*@target=B::m*/ m(null, null);\n                         ^"));
+  core::int y = let final dynamic #t1 = new self::B::•<dynamic>().{self::B::m}(null, null) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      . /*@target=B::m*/ m(null, null);\n                         ^";
   core::String z = new self::B::•<dynamic>().{self::B::m}(null, null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
index d980427..6da1d62 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
@@ -24,7 +24,7 @@
   method m(dynamic a, (dynamic, core::int) → dynamic f) → self::A<self::B::E> {}
 }
 static method foo() → dynamic {
-  core::int y = let final dynamic #t1 = new self::B::•<core::String>().{self::B::m}(null, null).{self::A::value} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      . /*@target=A::value*/ value;\n                             ^"));
+  core::int y = let final dynamic #t1 = new self::B::•<core::String>().{self::B::m}(null, null).{self::A::value} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      . /*@target=A::value*/ value;\n                             ^";
   core::String z = new self::B::•<core::String>().{self::B::m}(null, null).{self::A::value};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
index c5b8a9c..66a87ce 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
@@ -14,7 +14,7 @@
     ;
   method foo(generic-covariant-impl generic-covariant-interface self::Bar::T t) → void {
     for (core::String i in t) {
-      core::int x = let final dynamic #t1 = i in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      int x = /*error:INVALID_ASSIGNMENT*/ i;\n                                           ^"));
+      core::int x = let final dynamic #t1 = i in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      int x = /*error:INVALID_ASSIGNMENT*/ i;\n                                           ^";
     }
   }
 }
@@ -24,7 +24,7 @@
     ;
   method foo(generic-covariant-impl generic-covariant-interface self::Baz::S t) → void {
     for (self::Baz::T i in t) {
-      core::int x = let final dynamic #t2 = i in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      int x = /*error:INVALID_ASSIGNMENT*/ i;\n                                           ^"));
+      core::int x = let final dynamic #t2 = i in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      int x = /*error:INVALID_ASSIGNMENT*/ i;\n                                           ^";
       self::Baz::T y = i;
     }
   }
@@ -32,13 +32,13 @@
 static method test() → dynamic {
   core::List<self::Foo> list = <self::Foo>[];
   for (self::Foo x in list) {
-    core::String y = let final dynamic #t3 = x in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n    String y = /*error:INVALID_ASSIGNMENT*/ x;\n                                            ^"));
+    core::String y = let final dynamic #t3 = x in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n    String y = /*error:INVALID_ASSIGNMENT*/ x;\n                                            ^";
   }
   for (dynamic x in list) {
     core::String y = x as{TypeError} core::String;
   }
   for (final self::Foo #t4 in list) {
-    core::String x = let final dynamic #t5 = #t4 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ list) {\n              ^"));
+    core::String x = let final dynamic #t5 = #t4 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ list) {\n              ^";
     core::String y = x;
   }
   dynamic z;
@@ -57,7 +57,7 @@
     self::Foo y = x;
   }
   core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
-  for (dynamic x in let final dynamic #t9 = map in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: A value of type 'dart.core::Map<dart.core::String, test::Foo>' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.\n  for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {\n                                                                   ^"))) {
+  for (dynamic x in let final dynamic #t9 = map in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: A value of type 'dart.core::Map<dart.core::String, test::Foo>' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.\n  for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {\n                                                                   ^") {
     core::String y = x as{TypeError} core::String;
   }
   for (core::String x in map.{core::Map::keys}) {
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
index 7671fe8..46005fa 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
@@ -15,7 +15,7 @@
     ;
   method foo(generic-covariant-impl generic-covariant-interface self::Bar::T t) → dynamic async {
     await for (core::String i in t) {
-      core::int x = let final dynamic #t1 = i in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      int x = /*error:INVALID_ASSIGNMENT*/ i;\n                                           ^"));
+      core::int x = let final dynamic #t1 = i in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      int x = /*error:INVALID_ASSIGNMENT*/ i;\n                                           ^";
     }
   }
 }
@@ -25,7 +25,7 @@
     ;
   method foo(generic-covariant-impl generic-covariant-interface self::Baz::S t) → dynamic async {
     await for (self::Baz::T i in t) {
-      core::int x = let final dynamic #t2 = i in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      int x = /*error:INVALID_ASSIGNMENT*/ i;\n                                           ^"));
+      core::int x = let final dynamic #t2 = i in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      int x = /*error:INVALID_ASSIGNMENT*/ i;\n                                           ^";
       self::Baz::T y = i;
     }
   }
@@ -37,13 +37,13 @@
 static method test() → dynamic async {
   self::MyStream<self::Foo> myStream = self::MyStream::•<self::Foo>();
   await for (self::Foo x in myStream) {
-    core::String y = let final dynamic #t3 = x in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n    String y = /*error:INVALID_ASSIGNMENT*/ x;\n                                            ^"));
+    core::String y = let final dynamic #t3 = x in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n    String y = /*error:INVALID_ASSIGNMENT*/ x;\n                                            ^";
   }
   await for (dynamic x in myStream) {
     core::String y = x as{TypeError} core::String;
   }
   await for (final self::Foo #t4 in myStream) {
-    core::String x = let final dynamic #t5 = #t4 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  await for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ myStream) {\n                    ^"));
+    core::String x = let final dynamic #t5 = #t4 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  await for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ myStream) {\n                    ^";
     core::String y = x;
   }
   dynamic z;
@@ -62,7 +62,7 @@
     self::Foo y = x;
   }
   core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
-  await for (dynamic x in let final dynamic #t9 = map in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: A value of type 'dart.core::Map<dart.core::String, test::Foo>' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.\n  await for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {\n                                                                         ^"))) {
+  await for (dynamic x in let final dynamic #t9 = map in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: A value of type 'dart.core::Map<dart.core::String, test::Foo>' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.\n  await for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {\n                                                                         ^") {
     core::String y = x as{TypeError} core::String;
   }
 }
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
index cabfadb..eb2a83e 100644
--- a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   field core::int x = 1;
-  constructor •([core::int x = let final dynamic #t1 = "1" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  Foo([this.x = /*error:INVALID_ASSIGNMENT*/ \"1\"]);\n                                             ^"))]) → void
+  constructor •([core::int x = let final dynamic #t1 = "1" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  Foo([this.x = /*error:INVALID_ASSIGNMENT*/ \"1\"]);\n                                             ^"]) → void
     : self::Foo::x = x, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.strong.expect
index 58bf32f..83f4257 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends self::A<dynamic>> extends core::Object {
+class B<T extends self::A<core::int>> extends core::Object {
   default constructor •() → void
     : super core::Object::•()
     ;
@@ -12,7 +12,7 @@
     : super core::Object::•()
     ;
 }
-static field self::B<dynamic> v = null;
+static field self::B<self::A<core::int>> v = null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.strong.expect
index a124293..d6316f7 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.strong.expect
@@ -7,12 +7,12 @@
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic>> extends core::Object {
+class B<T extends self::A<core::int>> extends core::Object {
   default constructor •() → void
     : super core::Object::•()
     ;
 }
-static field self::B<dynamic> v = null;
+static field self::B<self::A<core::int>> v = null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.strong.expect
index 6be8e0b..a6e138b 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.strong.expect
@@ -12,7 +12,7 @@
     : super core::Object::•()
     ;
 }
-static field self::B<dynamic> v = null;
+static field self::B<self::A<dynamic>> v = null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.strong.expect
index 4770520..fa1e89c 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.strong.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-static field self::A<dynamic> v = null;
+static field self::A<core::int> v = null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.strong.expect
index 4770520..fa1e89c 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.strong.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-static field self::A<dynamic> v = null;
+static field self::A<core::int> v = null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.strong.expect
index a82a67e..5618eb8 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.strong.expect
@@ -12,7 +12,7 @@
     : super core::Object::•()
     ;
 }
-static field self::B<dynamic> v = null;
+static field self::B<self::A> v = null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
index 530a778..58cfa0a 100644
--- a/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
@@ -4,14 +4,14 @@
 
 static method test1() → dynamic {
   core::List<core::int> x = <core::int>[1, 2, 3];
-  x.{core::List::add}(let final dynamic #t1 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');\n                                                                      ^")));
-  x.{core::List::add}(let final dynamic #t2 = 4.0 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);\n                                                                      ^")));
+  x.{core::List::add}(let final dynamic #t1 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');\n                                                                      ^");
+  x.{core::List::add}(let final dynamic #t2 = 4.0 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);\n                                                                      ^");
   x.{core::List::add}(4);
   core::List<core::num> y = x;
 }
 static method test2() → dynamic {
   core::List<core::num> x = <core::num>[1, 2.0, 3];
-  x.{core::List::add}(let final dynamic #t3 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.\n  x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');\n                                                                      ^")));
+  x.{core::List::add}(let final dynamic #t3 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.\n  x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');\n                                                                      ^");
   x.{core::List::add}(4.0);
   core::List<core::int> y = x as{TypeError} core::List<core::int>;
 }
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
index 4ebc1ee..821836d 100644
--- a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
@@ -5,13 +5,13 @@
 static field core::List<core::int> x1 = <core::int>[1, 2, 3];
 static field core::List<core::num> x2 = <core::num>[1, 2.0, 3];
 static method test1() → dynamic {
-  self::x1.{core::List::add}(let final dynamic #t1 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');\n                                                                       ^")));
-  self::x1.{core::List::add}(let final dynamic #t2 = 4.0 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);\n                                                                       ^")));
+  self::x1.{core::List::add}(let final dynamic #t1 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');\n                                                                       ^");
+  self::x1.{core::List::add}(let final dynamic #t2 = 4.0 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);\n                                                                       ^");
   self::x1.{core::List::add}(4);
   core::List<core::num> y = self::x1;
 }
 static method test2() → dynamic {
-  self::x2.{core::List::add}(let final dynamic #t3 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.\n  x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');\n                                                                       ^")));
+  self::x2.{core::List::add}(let final dynamic #t3 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.\n  x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');\n                                                                       ^");
   self::x2.{core::List::add}(4.0);
   core::List<core::int> y = self::x2 as{TypeError} core::List<core::int>;
 }
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
index 4dc01e4..08b1d5d 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
@@ -9,7 +9,7 @@
     return (core::int x) → core::int => x;
   }
   function b() → asy::Future<(core::int) → core::int> async {
-    return let final dynamic #t1 = (dynamic x) → dynamic => x in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type '(dynamic) \u8594 dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.\n    return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;\n                                   ^"));
+    return let final dynamic #t1 = (dynamic x) → dynamic => x in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type '(dynamic) \u8594 dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.\n    return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;\n                                   ^";
   }
   function c() → core::Iterable<(core::int) → core::int> sync* {
     yield(core::int x) → core::int => x;
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
index a918da1..b8f2535 100644
--- a/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
@@ -5,17 +5,17 @@
 static method test1() → dynamic {
   core::Map<core::int, core::String> x = <core::int, core::String>{1: "x", 2: "y"};
   x.{core::Map::[]=}(3, "z");
-  x.{core::Map::[]=}(let final dynamic #t1 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';\n                                             ^")), "w");
-  x.{core::Map::[]=}(let final dynamic #t2 = 4.0 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';\n                                             ^")), "u");
-  x.{core::Map::[]=}(3, let final dynamic #t3 = 42 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;\n                                                            ^")));
+  x.{core::Map::[]=}(let final dynamic #t1 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';\n                                             ^", "w");
+  x.{core::Map::[]=}(let final dynamic #t2 = 4.0 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';\n                                             ^", "u");
+  x.{core::Map::[]=}(3, let final dynamic #t3 = 42 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;\n                                                            ^");
   core::Map<core::num, core::String> y = x;
 }
 static method test2() → dynamic {
   core::Map<core::num, core::Pattern> x = <core::num, core::Pattern>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
   x.{core::Map::[]=}(3, "z");
-  x.{core::Map::[]=}(let final dynamic #t4 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.\n      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';\n                                             ^")), "w");
+  x.{core::Map::[]=}(let final dynamic #t4 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.\n      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';\n                                             ^", "w");
   x.{core::Map::[]=}(4.0, "u");
-  x.{core::Map::[]=}(3, let final dynamic #t5 = 42 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::Pattern'.\n  x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;\n                                                            ^")));
+  x.{core::Map::[]=}(3, let final dynamic #t5 = 42 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::Pattern'.\n  x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;\n                                                            ^");
   core::Pattern p = null;
   x.{core::Map::[]=}(2, p);
   core::Map<core::int, core::String> y = x as{TypeError} core::Map<core::int, core::String>;
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
index 91043cc..8798304 100644
--- a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
@@ -6,16 +6,16 @@
 static field core::Map<core::num, core::Pattern> x2 = <core::num, core::Pattern>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
 static method test1() → dynamic {
   self::x1.{core::Map::[]=}(3, "z");
-  self::x1.{core::Map::[]=}(let final dynamic #t1 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';\n                                                                  ^")), "w");
-  self::x1.{core::Map::[]=}(let final dynamic #t2 = 4.0 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';\n                                                                  ^")), "u");
-  self::x1.{core::Map::[]=}(3, let final dynamic #t3 = 42 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;\n                                                             ^")));
+  self::x1.{core::Map::[]=}(let final dynamic #t1 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';\n                                                                  ^", "w");
+  self::x1.{core::Map::[]=}(let final dynamic #t2 = 4.0 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';\n                                                                  ^", "u");
+  self::x1.{core::Map::[]=}(3, let final dynamic #t3 = 42 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;\n                                                             ^");
   core::Map<core::num, core::String> y = self::x1;
 }
 static method test2() → dynamic {
   self::x2.{core::Map::[]=}(3, "z");
-  self::x2.{core::Map::[]=}(let final dynamic #t4 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.\n  x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';\n                                                                  ^")), "w");
+  self::x2.{core::Map::[]=}(let final dynamic #t4 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.\n  x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';\n                                                                  ^", "w");
   self::x2.{core::Map::[]=}(4.0, "u");
-  self::x2.{core::Map::[]=}(3, let final dynamic #t5 = 42 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::Pattern'.\n  x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;\n                                                             ^")));
+  self::x2.{core::Map::[]=}(3, let final dynamic #t5 = 42 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::Pattern'.\n  x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;\n                                                             ^");
   core::Pattern p = null;
   self::x2.{core::Map::[]=}(2, p);
   core::Map<core::int, core::String> y = self::x2 as{TypeError} core::Map<core::int, core::String>;
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
index 48ae27d..9d2eb39 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
@@ -10,8 +10,8 @@
 }
 static method test5() → dynamic {
   self::A a1 = new self::A::•();
-  a1.{self::A::x} = let final dynamic #t1 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  a1. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                                        ^"));
+  a1.{self::A::x} = let final dynamic #t1 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  a1. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                                        ^";
   self::A a2 = new self::A::•();
-  a2.{self::A::x} = let final dynamic #t2 = "hi" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  a2. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                                        ^"));
+  a2.{self::A::x} = let final dynamic #t2 = "hi" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  a2. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";\n                                                        ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.expect
index 7e2ea00..7a9fa5e 100644
--- a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   set x(dynamic #synthetic) → void
-    let dynamic _ = null in const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:16: Error: A setter should have exactly one formal parameter.\n  void set x() {}\n               ^"));
+    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:16: Error: A setter should have exactly one formal parameter.\n  void set x() {}\n               ^";
 }
 static method f(self::A a) → void {
   dynamic x = a.x = 0;
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.expect
index 734cbb2..e48816b 100644
--- a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   set x(dynamic #synthetic) → void
-    let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:16: Error: A setter should have exactly one formal parameter.\n  void set x() {}\n               ^"));
+    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:16: Error: A setter should have exactly one formal parameter.\n  void set x() {}\n               ^";
 }
 static method f(self::A a) → void {
   core::int x = a.{self::A::x} = 0;
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
index 44c0bca..9deb7db 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
@@ -8,7 +8,7 @@
   return (core::int x) → core::int => x;
 }
 static method b() → asy::Future<(core::int) → core::int> async {
-  return let final dynamic #t1 = (dynamic x) → dynamic => x in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type '(dynamic) \u8594 dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.\n  return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;\n                                 ^"));
+  return let final dynamic #t1 = (dynamic x) → dynamic => x in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type '(dynamic) \u8594 dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.\n  return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;\n                                 ^";
 }
 static method c() → core::Iterable<(core::int) → core::int> sync* {
   yield(core::int x) → core::int => x;
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
index c5e0b7d..6e772f2 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
@@ -4,17 +4,17 @@
 
 static method test() → dynamic async {
   core::String s;
-  for (final dynamic #t1 in let final dynamic #t2 = s in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.\n  for (int x in /*@error=InvalidAssignment*/ s) {}\n                                             ^"))) {
+  for (final dynamic #t1 in let final dynamic #t2 = s in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.\n  for (int x in /*@error=InvalidAssignment*/ s) {}\n                                             ^") {
     core::int x = #t1 as{TypeError} core::int;
   }
-  await for (final dynamic #t3 in let final dynamic #t4 = s in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:52: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.\n  await for (int x in /*@error=InvalidAssignment*/ s) {}\n                                                   ^"))) {
+  await for (final dynamic #t3 in let final dynamic #t4 = s in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:52: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.\n  await for (int x in /*@error=InvalidAssignment*/ s) {}\n                                                   ^") {
     core::int x = #t3 as{TypeError} core::int;
   }
   core::int y;
-  for (final dynamic #t5 in let final dynamic #t6 = s in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:42: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.\n  for (y in /*@error=InvalidAssignment*/ s) {}\n                                         ^"))) {
+  for (final dynamic #t5 in let final dynamic #t6 = s in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:42: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.\n  for (y in /*@error=InvalidAssignment*/ s) {}\n                                         ^") {
     y = #t5 as{TypeError} core::int;
   }
-  await for (final dynamic #t7 in let final dynamic #t8 = s in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.\n  await for (y in /*@error=InvalidAssignment*/ s) {}\n                                               ^"))) {
+  await for (final dynamic #t7 in let final dynamic #t8 = s in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.\n  await for (y in /*@error=InvalidAssignment*/ s) {}\n                                               ^") {
     y = #t7 as{TypeError} core::int;
   }
 }
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
index 35b39d2..8013f99 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
@@ -34,10 +34,10 @@
     b = #t4 as{TypeError} self::B;
   }
   for (final self::A #t5 in iterable) {
-    i = let final dynamic #t6 = #t5 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:39: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  for (i /*@error=InvalidAssignment*/ in iterable) {}\n                                      ^"));
+    i = let final dynamic #t6 = #t5 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:39: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  for (i /*@error=InvalidAssignment*/ in iterable) {}\n                                      ^";
   }
   await for (final self::A #t7 in stream) {
-    i = let final dynamic #t8 = #t7 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:45: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  await for (i /*@error=InvalidAssignment*/ in stream) {}\n                                            ^"));
+    i = let final dynamic #t8 = #t7 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:45: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  await for (i /*@error=InvalidAssignment*/ in stream) {}\n                                            ^";
   }
   for (final self::A #t9 in self::f<core::Iterable<self::A>>()) {
     a = #t9;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
index e975696..b541199 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
@@ -59,11 +59,11 @@
     core::double v3 = let final core::String #t66 = "x" in let final core::double #t67 = self::getDouble() in let final void #t68 = super.{self::Base::[]=}(#t66, #t67) in #t67;
     core::num v5 = let final core::String #t69 = "x" in let final core::int #t70 = super.{self::Base::[]}(#t69) in #t70.{core::num::==}(null) ?{core::num} let final core::num #t71 = self::getNum() as{TypeError} core::double in let final void #t72 = super.{self::Base::[]=}(#t69, #t71) in #t71 : #t70;
     core::num v6 = let final core::String #t73 = "x" in let final core::int #t74 = super.{self::Base::[]}(#t73) in #t74.{core::num::==}(null) ?{core::num} let final core::double #t75 = self::getDouble() in let final void #t76 = super.{self::Base::[]=}(#t73, #t75) in #t75 : #t74;
-    core::int v7 = let final core::String #t77 = "x" in let final core::int #t78 = let final dynamic #t79 = super.{self::Base::[]}(#t77).{core::num::+}(self::getInt()) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:55:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n    var /*@type=int*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();\n                                                             ^")) in let final void #t80 = super.{self::Base::[]=}(#t77, #t78) in #t78;
+    core::int v7 = let final core::String #t77 = "x" in let final core::int #t78 = let final dynamic #t79 = super.{self::Base::[]}(#t77).{core::num::+}(self::getInt()) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:55:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n    var /*@type=int*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();\n                                                             ^" in let final void #t80 = super.{self::Base::[]=}(#t77, #t78) in #t78;
     core::num v8 = let final core::String #t81 = "x" in let final core::num #t82 = super.{self::Base::[]}(#t81).{core::num::+}(self::getNum()) as{TypeError} core::double in let final void #t83 = super.{self::Base::[]=}(#t81, #t82) in #t82;
     core::double v9 = let final core::String #t84 = "x" in let final core::double #t85 = super.{self::Base::[]}(#t84).{core::num::+}(self::getDouble()) in let final void #t86 = super.{self::Base::[]=}(#t84, #t85) in #t85;
-    core::int v10 = let final core::String #t87 = "x" in let final core::int #t88 = let final dynamic #t89 = super.{self::Base::[]}(#t87).{core::num::+}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:58:29: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n    var /*@type=int*/ v10 = ++super /*@target=Base::[]=*/ ['x'];\n                            ^")) in let final void #t90 = super.{self::Base::[]=}(#t87, #t88) in #t88;
-    core::int v11 = let final core::String #t91 = "x" in let final core::int #t92 = super.{self::Base::[]}(#t91) in let final void #t93 = super.{self::Base::[]=}(#t91, let final dynamic #t94 = #t92.{core::num::+}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:59:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n    var /*@type=int*/ v11 = super /*@target=Base::[]=*/ ['x']++;\n                                                             ^"))) in #t92;
+    core::int v10 = let final core::String #t87 = "x" in let final core::int #t88 = let final dynamic #t89 = super.{self::Base::[]}(#t87).{core::num::+}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:58:29: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n    var /*@type=int*/ v10 = ++super /*@target=Base::[]=*/ ['x'];\n                            ^" in let final void #t90 = super.{self::Base::[]=}(#t87, #t88) in #t88;
+    core::int v11 = let final core::String #t91 = "x" in let final core::int #t92 = super.{self::Base::[]}(#t91) in let final void #t93 = super.{self::Base::[]=}(#t91, let final dynamic #t94 = #t92.{core::num::+}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:59:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n    var /*@type=int*/ v11 = super /*@target=Base::[]=*/ ['x']++;\n                                                             ^") in #t92;
   }
   abstract forwarding-stub operator []=(core::String s, generic-covariant-impl core::double v) → void;
   abstract forwarding-stub method setValue(core::String s, generic-covariant-impl core::double v) → void;
@@ -132,10 +132,10 @@
     core::num v2 = let final core::String #t189 = "x" in let final core::num #t190 = self::getNum() as{TypeError} core::int in let final void #t191 = super.{self::Base::[]=}(#t189, #t190) in #t190;
     core::num v4 = let final core::String #t192 = "x" in let final core::double #t193 = super.{self::Base::[]}(#t192) in #t193.{core::num::==}(null) ?{core::num} let final core::int #t194 = self::getInt() in let final void #t195 = super.{self::Base::[]=}(#t192, #t194) in #t194 : #t193;
     core::num v5 = let final core::String #t196 = "x" in let final core::double #t197 = super.{self::Base::[]}(#t196) in #t197.{core::num::==}(null) ?{core::num} let final core::num #t198 = self::getNum() as{TypeError} core::int in let final void #t199 = super.{self::Base::[]=}(#t196, #t198) in #t198 : #t197;
-    core::double v7 = let final core::String #t200 = "x" in let final core::double #t201 = let final dynamic #t202 = super.{self::Base::[]}(#t200).{core::double::+}(self::getInt()) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:112:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    var /*@type=double*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();\n                                                                ^")) in let final void #t203 = super.{self::Base::[]=}(#t200, #t201) in #t201;
-    core::double v8 = let final core::String #t204 = "x" in let final core::double #t205 = let final dynamic #t206 = super.{self::Base::[]}(#t204).{core::double::+}(self::getNum()) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:113:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    var /*@type=double*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();\n                                                                ^")) in let final void #t207 = super.{self::Base::[]=}(#t204, #t205) in #t205;
-    core::double v10 = let final core::String #t208 = "x" in let final core::double #t209 = let final dynamic #t210 = super.{self::Base::[]}(#t208).{core::double::+}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:114:32: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    var /*@type=double*/ v10 = ++super /*@target=Base::[]=*/ ['x'];\n                               ^")) in let final void #t211 = super.{self::Base::[]=}(#t208, #t209) in #t209;
-    core::double v11 = let final core::String #t212 = "x" in let final core::double #t213 = super.{self::Base::[]}(#t212) in let final void #t214 = super.{self::Base::[]=}(#t212, let final dynamic #t215 = #t213.{core::double::+}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:115:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    var /*@type=double*/ v11 = super /*@target=Base::[]=*/ ['x']++;\n                                                                ^"))) in #t213;
+    core::double v7 = let final core::String #t200 = "x" in let final core::double #t201 = let final dynamic #t202 = super.{self::Base::[]}(#t200).{core::double::+}(self::getInt()) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:112:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    var /*@type=double*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();\n                                                                ^" in let final void #t203 = super.{self::Base::[]=}(#t200, #t201) in #t201;
+    core::double v8 = let final core::String #t204 = "x" in let final core::double #t205 = let final dynamic #t206 = super.{self::Base::[]}(#t204).{core::double::+}(self::getNum()) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:113:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    var /*@type=double*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();\n                                                                ^" in let final void #t207 = super.{self::Base::[]=}(#t204, #t205) in #t205;
+    core::double v10 = let final core::String #t208 = "x" in let final core::double #t209 = let final dynamic #t210 = super.{self::Base::[]}(#t208).{core::double::+}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:114:32: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    var /*@type=double*/ v10 = ++super /*@target=Base::[]=*/ ['x'];\n                               ^" in let final void #t211 = super.{self::Base::[]=}(#t208, #t209) in #t209;
+    core::double v11 = let final core::String #t212 = "x" in let final core::double #t213 = super.{self::Base::[]}(#t212) in let final void #t214 = super.{self::Base::[]=}(#t212, let final dynamic #t215 = #t213.{core::double::+}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:115:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    var /*@type=double*/ v11 = super /*@target=Base::[]=*/ ['x']++;\n                                                                ^") in #t213;
   }
   abstract forwarding-stub operator []=(core::String s, generic-covariant-impl core::int v) → void;
   abstract forwarding-stub method setValue(core::String s, generic-covariant-impl core::int v) → void;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
index 8c8778a..852b248 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
@@ -50,11 +50,11 @@
     core::double v3 = let final core::String #t66 = "x" in let final core::double #t67 = self::getDouble() in let final void #t68 = this.{self::Test3::[]=}(#t66, #t67) in #t67;
     core::num v5 = let final core::String #t69 = "x" in let final core::int #t70 = this.{self::Test3::[]}(#t69) in #t70.{core::num::==}(null) ?{core::num} let final core::num #t71 = self::getNum() as{TypeError} core::double in let final void #t72 = this.{self::Test3::[]=}(#t69, #t71) in #t71 : #t70;
     core::num v6 = let final core::String #t73 = "x" in let final core::int #t74 = this.{self::Test3::[]}(#t73) in #t74.{core::num::==}(null) ?{core::num} let final core::double #t75 = self::getDouble() in let final void #t76 = this.{self::Test3::[]=}(#t73, #t75) in #t75 : #t74;
-    core::int v7 = let final core::String #t77 = "x" in let final core::int #t78 = let final dynamic #t79 = this.{self::Test3::[]}(#t77).{core::num::+}(self::getInt()) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:56:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n    var /*@type=int*/ v7 = this /*@target=Test3::[]=*/ ['x'] += getInt();\n                                                             ^")) in let final void #t80 = this.{self::Test3::[]=}(#t77, #t78) in #t78;
+    core::int v7 = let final core::String #t77 = "x" in let final core::int #t78 = let final dynamic #t79 = this.{self::Test3::[]}(#t77).{core::num::+}(self::getInt()) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:56:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n    var /*@type=int*/ v7 = this /*@target=Test3::[]=*/ ['x'] += getInt();\n                                                             ^" in let final void #t80 = this.{self::Test3::[]=}(#t77, #t78) in #t78;
     core::num v8 = let final core::String #t81 = "x" in let final core::num #t82 = this.{self::Test3::[]}(#t81).{core::num::+}(self::getNum()) as{TypeError} core::double in let final void #t83 = this.{self::Test3::[]=}(#t81, #t82) in #t82;
     core::double v9 = let final core::String #t84 = "x" in let final core::double #t85 = this.{self::Test3::[]}(#t84).{core::num::+}(self::getDouble()) in let final void #t86 = this.{self::Test3::[]=}(#t84, #t85) in #t85;
-    core::int v10 = let final core::String #t87 = "x" in let final core::int #t88 = let final dynamic #t89 = this.{self::Test3::[]}(#t87).{core::num::+}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:59:29: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n    var /*@type=int*/ v10 = ++this /*@target=Test3::[]=*/ ['x'];\n                            ^")) in let final void #t90 = this.{self::Test3::[]=}(#t87, #t88) in #t88;
-    core::int v11 = let final core::String #t91 = "x" in let final core::int #t92 = this.{self::Test3::[]}(#t91) in let final void #t93 = this.{self::Test3::[]=}(#t91, let final dynamic #t94 = #t92.{core::num::+}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:60:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n    var /*@type=int*/ v11 = this /*@target=Test3::[]=*/ ['x']++;\n                                                             ^"))) in #t92;
+    core::int v10 = let final core::String #t87 = "x" in let final core::int #t88 = let final dynamic #t89 = this.{self::Test3::[]}(#t87).{core::num::+}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:59:29: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n    var /*@type=int*/ v10 = ++this /*@target=Test3::[]=*/ ['x'];\n                            ^" in let final void #t90 = this.{self::Test3::[]=}(#t87, #t88) in #t88;
+    core::int v11 = let final core::String #t91 = "x" in let final core::int #t92 = this.{self::Test3::[]}(#t91) in let final void #t93 = this.{self::Test3::[]=}(#t91, let final dynamic #t94 = #t92.{core::num::+}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:60:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n    var /*@type=int*/ v11 = this /*@target=Test3::[]=*/ ['x']++;\n                                                             ^") in #t92;
   }
 }
 abstract class Test4 extends core::Object {
@@ -123,10 +123,10 @@
     core::num v2 = let final core::String #t189 = "x" in let final core::num #t190 = self::getNum() as{TypeError} core::int in let final void #t191 = this.{self::Test7::[]=}(#t189, #t190) in #t190;
     core::num v4 = let final core::String #t192 = "x" in let final core::double #t193 = this.{self::Test7::[]}(#t192) in #t193.{core::num::==}(null) ?{core::num} let final core::int #t194 = self::getInt() in let final void #t195 = this.{self::Test7::[]=}(#t192, #t194) in #t194 : #t193;
     core::num v5 = let final core::String #t196 = "x" in let final core::double #t197 = this.{self::Test7::[]}(#t196) in #t197.{core::num::==}(null) ?{core::num} let final core::num #t198 = self::getNum() as{TypeError} core::int in let final void #t199 = this.{self::Test7::[]=}(#t196, #t198) in #t198 : #t197;
-    core::double v7 = let final core::String #t200 = "x" in let final core::double #t201 = let final dynamic #t202 = this.{self::Test7::[]}(#t200).{core::double::+}(self::getInt()) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:125:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    var /*@type=double*/ v7 = this /*@target=Test7::[]=*/ ['x'] += getInt();\n                                                                ^")) in let final void #t203 = this.{self::Test7::[]=}(#t200, #t201) in #t201;
-    core::double v8 = let final core::String #t204 = "x" in let final core::double #t205 = let final dynamic #t206 = this.{self::Test7::[]}(#t204).{core::double::+}(self::getNum()) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    var /*@type=double*/ v8 = this /*@target=Test7::[]=*/ ['x'] += getNum();\n                                                                ^")) in let final void #t207 = this.{self::Test7::[]=}(#t204, #t205) in #t205;
-    core::double v10 = let final core::String #t208 = "x" in let final core::double #t209 = let final dynamic #t210 = this.{self::Test7::[]}(#t208).{core::double::+}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:127:32: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    var /*@type=double*/ v10 = ++this /*@target=Test7::[]=*/ ['x'];\n                               ^")) in let final void #t211 = this.{self::Test7::[]=}(#t208, #t209) in #t209;
-    core::double v11 = let final core::String #t212 = "x" in let final core::double #t213 = this.{self::Test7::[]}(#t212) in let final void #t214 = this.{self::Test7::[]=}(#t212, let final dynamic #t215 = #t213.{core::double::+}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:128:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    var /*@type=double*/ v11 = this /*@target=Test7::[]=*/ ['x']++;\n                                                                ^"))) in #t213;
+    core::double v7 = let final core::String #t200 = "x" in let final core::double #t201 = let final dynamic #t202 = this.{self::Test7::[]}(#t200).{core::double::+}(self::getInt()) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:125:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    var /*@type=double*/ v7 = this /*@target=Test7::[]=*/ ['x'] += getInt();\n                                                                ^" in let final void #t203 = this.{self::Test7::[]=}(#t200, #t201) in #t201;
+    core::double v8 = let final core::String #t204 = "x" in let final core::double #t205 = let final dynamic #t206 = this.{self::Test7::[]}(#t204).{core::double::+}(self::getNum()) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    var /*@type=double*/ v8 = this /*@target=Test7::[]=*/ ['x'] += getNum();\n                                                                ^" in let final void #t207 = this.{self::Test7::[]=}(#t204, #t205) in #t205;
+    core::double v10 = let final core::String #t208 = "x" in let final core::double #t209 = let final dynamic #t210 = this.{self::Test7::[]}(#t208).{core::double::+}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:127:32: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    var /*@type=double*/ v10 = ++this /*@target=Test7::[]=*/ ['x'];\n                               ^" in let final void #t211 = this.{self::Test7::[]=}(#t208, #t209) in #t209;
+    core::double v11 = let final core::String #t212 = "x" in let final core::double #t213 = this.{self::Test7::[]}(#t212) in let final void #t214 = this.{self::Test7::[]=}(#t212, let final dynamic #t215 = #t213.{core::double::+}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:128:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n    var /*@type=double*/ v11 = this /*@target=Test7::[]=*/ ['x']++;\n                                                                ^") in #t213;
   }
 }
 abstract class Test8 extends core::Object {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
index de5b829..b0964a3 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
@@ -43,11 +43,11 @@
   core::double v3 = let final self::Test<core::int, core::double> #t86 = t in let final core::String #t87 = "x" in let final core::double #t88 = self::getDouble() in let final void #t89 = #t86.{self::Test::[]=}(#t87, #t88) in #t88;
   core::num v5 = let final self::Test<core::int, core::double> #t90 = t in let final core::String #t91 = "x" in let final core::int #t92 = #t90.{self::Test::[]}(#t91) in #t92.{core::num::==}(null) ?{core::num} let final core::num #t93 = self::getNum() as{TypeError} core::double in let final void #t94 = #t90.{self::Test::[]=}(#t91, #t93) in #t93 : #t92;
   core::num v6 = let final self::Test<core::int, core::double> #t95 = t in let final core::String #t96 = "x" in let final core::int #t97 = #t95.{self::Test::[]}(#t96) in #t97.{core::num::==}(null) ?{core::num} let final core::double #t98 = self::getDouble() in let final void #t99 = #t95.{self::Test::[]=}(#t96, #t98) in #t98 : #t97;
-  core::int v7 = let final self::Test<core::int, core::double> #t100 = t in let final core::String #t101 = "x" in let final core::int #t102 = let final dynamic #t103 = #t100.{self::Test::[]}(#t101).{core::num::+}(self::getInt()) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:47:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n  var /*@type=int*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();\n                                                       ^")) in let final void #t104 = #t100.{self::Test::[]=}(#t101, #t102) in #t102;
+  core::int v7 = let final self::Test<core::int, core::double> #t100 = t in let final core::String #t101 = "x" in let final core::int #t102 = let final dynamic #t103 = #t100.{self::Test::[]}(#t101).{core::num::+}(self::getInt()) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:47:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n  var /*@type=int*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();\n                                                       ^" in let final void #t104 = #t100.{self::Test::[]=}(#t101, #t102) in #t102;
   core::num v8 = let final self::Test<core::int, core::double> #t105 = t in let final core::String #t106 = "x" in let final core::num #t107 = #t105.{self::Test::[]}(#t106).{core::num::+}(self::getNum()) as{TypeError} core::double in let final void #t108 = #t105.{self::Test::[]=}(#t106, #t107) in #t107;
   core::double v9 = let final self::Test<core::int, core::double> #t109 = t in let final core::String #t110 = "x" in let final core::double #t111 = #t109.{self::Test::[]}(#t110).{core::num::+}(self::getDouble()) in let final void #t112 = #t109.{self::Test::[]=}(#t110, #t111) in #t111;
-  core::int v10 = let final self::Test<core::int, core::double> #t113 = t in let final core::String #t114 = "x" in let final core::int #t115 = let final dynamic #t116 = #t113.{self::Test::[]}(#t114).{core::num::+}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:50:27: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n  var /*@type=int*/ v10 = ++t /*@target=Test::[]=*/ ['x'];\n                          ^")) in let final void #t117 = #t113.{self::Test::[]=}(#t114, #t115) in #t115;
-  core::int v11 = let final self::Test<core::int, core::double> #t118 = t in let final core::String #t119 = "x" in let final core::int #t120 = #t118.{self::Test::[]}(#t119) in let final void #t121 = #t118.{self::Test::[]=}(#t119, let final dynamic #t122 = #t120.{core::num::+}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:51:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n  var /*@type=int*/ v11 = t /*@target=Test::[]=*/ ['x']++;\n                                                       ^"))) in #t120;
+  core::int v10 = let final self::Test<core::int, core::double> #t113 = t in let final core::String #t114 = "x" in let final core::int #t115 = let final dynamic #t116 = #t113.{self::Test::[]}(#t114).{core::num::+}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:50:27: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n  var /*@type=int*/ v10 = ++t /*@target=Test::[]=*/ ['x'];\n                          ^" in let final void #t117 = #t113.{self::Test::[]=}(#t114, #t115) in #t115;
+  core::int v11 = let final self::Test<core::int, core::double> #t118 = t in let final core::String #t119 = "x" in let final core::int #t120 = #t118.{self::Test::[]}(#t119) in let final void #t121 = #t118.{self::Test::[]=}(#t119, let final dynamic #t122 = #t120.{core::num::+}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:51:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.\n  var /*@type=int*/ v11 = t /*@target=Test::[]=*/ ['x']++;\n                                                       ^") in #t120;
 }
 static method test4(self::Test<core::num, core::int> t) → void {
   core::int v1 = let final self::Test<core::num, core::int> #t123 = t in let final core::String #t124 = "x" in let final core::int #t125 = self::getInt() in let final void #t126 = #t123.{self::Test::[]=}(#t124, #t125) in #t125;
@@ -88,10 +88,10 @@
   core::num v2 = let final self::Test<core::double, core::int> #t246 = t in let final core::String #t247 = "x" in let final core::num #t248 = self::getNum() as{TypeError} core::int in let final void #t249 = #t246.{self::Test::[]=}(#t247, #t248) in #t248;
   core::num v4 = let final self::Test<core::double, core::int> #t250 = t in let final core::String #t251 = "x" in let final core::double #t252 = #t250.{self::Test::[]}(#t251) in #t252.{core::num::==}(null) ?{core::num} let final core::int #t253 = self::getInt() in let final void #t254 = #t250.{self::Test::[]=}(#t251, #t253) in #t253 : #t252;
   core::num v5 = let final self::Test<core::double, core::int> #t255 = t in let final core::String #t256 = "x" in let final core::double #t257 = #t255.{self::Test::[]}(#t256) in #t257.{core::num::==}(null) ?{core::num} let final core::num #t258 = self::getNum() as{TypeError} core::int in let final void #t259 = #t255.{self::Test::[]=}(#t256, #t258) in #t258 : #t257;
-  core::double v7 = let final self::Test<core::double, core::int> #t260 = t in let final core::String #t261 = "x" in let final core::double #t262 = let final dynamic #t263 = #t260.{self::Test::[]}(#t261).{core::double::+}(self::getInt()) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:96:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  var /*@type=double*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();\n                                                          ^")) in let final void #t264 = #t260.{self::Test::[]=}(#t261, #t262) in #t262;
-  core::double v8 = let final self::Test<core::double, core::int> #t265 = t in let final core::String #t266 = "x" in let final core::double #t267 = let final dynamic #t268 = #t265.{self::Test::[]}(#t266).{core::double::+}(self::getNum()) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:97:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  var /*@type=double*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();\n                                                          ^")) in let final void #t269 = #t265.{self::Test::[]=}(#t266, #t267) in #t267;
-  core::double v10 = let final self::Test<core::double, core::int> #t270 = t in let final core::String #t271 = "x" in let final core::double #t272 = let final dynamic #t273 = #t270.{self::Test::[]}(#t271).{core::double::+}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:98:30: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  var /*@type=double*/ v10 = ++t /*@target=Test::[]=*/ ['x'];\n                             ^")) in let final void #t274 = #t270.{self::Test::[]=}(#t271, #t272) in #t272;
-  core::double v11 = let final self::Test<core::double, core::int> #t275 = t in let final core::String #t276 = "x" in let final core::double #t277 = #t275.{self::Test::[]}(#t276) in let final void #t278 = #t275.{self::Test::[]=}(#t276, let final dynamic #t279 = #t277.{core::double::+}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:99:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  var /*@type=double*/ v11 = t /*@target=Test::[]=*/ ['x']++;\n                                                          ^"))) in #t277;
+  core::double v7 = let final self::Test<core::double, core::int> #t260 = t in let final core::String #t261 = "x" in let final core::double #t262 = let final dynamic #t263 = #t260.{self::Test::[]}(#t261).{core::double::+}(self::getInt()) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:96:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  var /*@type=double*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();\n                                                          ^" in let final void #t264 = #t260.{self::Test::[]=}(#t261, #t262) in #t262;
+  core::double v8 = let final self::Test<core::double, core::int> #t265 = t in let final core::String #t266 = "x" in let final core::double #t267 = let final dynamic #t268 = #t265.{self::Test::[]}(#t266).{core::double::+}(self::getNum()) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:97:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  var /*@type=double*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();\n                                                          ^" in let final void #t269 = #t265.{self::Test::[]=}(#t266, #t267) in #t267;
+  core::double v10 = let final self::Test<core::double, core::int> #t270 = t in let final core::String #t271 = "x" in let final core::double #t272 = let final dynamic #t273 = #t270.{self::Test::[]}(#t271).{core::double::+}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:98:30: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  var /*@type=double*/ v10 = ++t /*@target=Test::[]=*/ ['x'];\n                             ^" in let final void #t274 = #t270.{self::Test::[]=}(#t271, #t272) in #t272;
+  core::double v11 = let final self::Test<core::double, core::int> #t275 = t in let final core::String #t276 = "x" in let final core::double #t277 = #t275.{self::Test::[]}(#t276) in let final void #t278 = #t275.{self::Test::[]=}(#t276, let final dynamic #t279 = #t277.{core::double::+}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:99:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  var /*@type=double*/ v11 = t /*@target=Test::[]=*/ ['x']++;\n                                                          ^") in #t277;
 }
 static method test8(self::Test<core::double, core::num> t) → void {
   core::int v1 = let final self::Test<core::double, core::num> #t280 = t in let final core::String #t281 = "x" in let final core::int #t282 = self::getInt() in let final void #t283 = #t280.{self::Test::[]=}(#t281, #t282) in #t282;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
index 19f5a4c..abc9777 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
@@ -17,8 +17,8 @@
     : super core::Object::•()
     ;
 }
-static field core::int v_prefix_pp = let final self::B #t1 = new self::B::•() in #t1.{self::B::a} = let final dynamic #t2 = #t1.{self::B::a}.{self::A::+}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:37: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A'.\nvar /*@topType=int*/ v_prefix_pp = (++new B(). /*@target=B::a*/ a);\n                                    ^"));
-static field core::double v_prefix_mm = let final self::B #t3 = new self::B::•() in #t3.{self::B::a} = let final dynamic #t4 = #t3.{self::B::a}.{self::A::-}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:40: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A'.\nvar /*@topType=double*/ v_prefix_mm = (--new B(). /*@target=B::a*/ a);\n                                       ^"));
-static field self::A v_postfix_pp = let final self::B #t5 = new self::B::•() in let final self::A #t6 = #t5.{self::B::a} in let final core::int #t7 = #t5.{self::B::a} = let final dynamic #t8 = #t6.{self::A::+}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:63: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A'.\nvar /*@topType=A*/ v_postfix_pp = (new B(). /*@target=B::a*/ a++);\n                                                              ^")) in #t6;
-static field self::A v_postfix_mm = let final self::B #t9 = new self::B::•() in let final self::A #t10 = #t9.{self::B::a} in let final core::double #t11 = #t9.{self::B::a} = let final dynamic #t12 = #t10.{self::A::-}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:63: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A'.\nvar /*@topType=A*/ v_postfix_mm = (new B(). /*@target=B::a*/ a--);\n                                                              ^")) in #t10;
+static field core::int v_prefix_pp = let final self::B #t1 = new self::B::•() in #t1.{self::B::a} = let final dynamic #t2 = #t1.{self::B::a}.{self::A::+}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:37: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A'.\nvar /*@topType=int*/ v_prefix_pp = (++new B(). /*@target=B::a*/ a);\n                                    ^";
+static field core::double v_prefix_mm = let final self::B #t3 = new self::B::•() in #t3.{self::B::a} = let final dynamic #t4 = #t3.{self::B::a}.{self::A::-}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:40: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A'.\nvar /*@topType=double*/ v_prefix_mm = (--new B(). /*@target=B::a*/ a);\n                                       ^";
+static field self::A v_postfix_pp = let final self::B #t5 = new self::B::•() in let final self::A #t6 = #t5.{self::B::a} in let final core::int #t7 = #t5.{self::B::a} = let final dynamic #t8 = #t6.{self::A::+}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:63: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A'.\nvar /*@topType=A*/ v_postfix_pp = (new B(). /*@target=B::a*/ a++);\n                                                              ^" in #t6;
+static field self::A v_postfix_mm = let final self::B #t9 = new self::B::•() in let final self::A #t10 = #t9.{self::B::a} in let final core::double #t11 = #t9.{self::B::a} = let final dynamic #t12 = #t10.{self::A::-}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:63: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::A'.\nvar /*@topType=A*/ v_postfix_mm = (new B(). /*@target=B::a*/ a--);\n                                                              ^" in #t10;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
index 9da5914..6a1582a 100644
--- a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
@@ -4,5 +4,5 @@
 
 static field core::int i;
 static field core::String s;
-static field core::String x = self::i = let final dynamic #t1 = self::s in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\nvar /*@topType=String*/ x = i = /*@error=InvalidAssignment*/ s;\n                                                             ^"));
+static field core::String x = self::i = let final dynamic #t1 = self::s in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\nvar /*@topType=String*/ x = i = /*@error=InvalidAssignment*/ s;\n                                                             ^";
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.strong.expect b/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
index 5220a4a..77f5f93 100644
--- a/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
+++ b/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
@@ -11,10 +11,10 @@
 }
 static method test(core::int i, core::String s, self::A a) → dynamic {
   i = 1;
-  i = let final dynamic #t1 = s in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  i = /*@error=InvalidAssignment*/ s;\n                                   ^"));
+  i = let final dynamic #t1 = s in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  i = /*@error=InvalidAssignment*/ s;\n                                   ^";
   i.{core::num::==}(null) ?{core::int} i = 1 : null;
-  i.{core::num::==}(null) ?{core::Object} i = let final dynamic #t2 = s in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  i ??= /*@error=InvalidAssignment*/ s;\n                                     ^")) : null;
+  i.{core::num::==}(null) ?{core::Object} i = let final dynamic #t2 = s in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  i ??= /*@error=InvalidAssignment*/ s;\n                                     ^" : null;
   a = new self::A::•();
-  a = let final dynamic #t3 = a.{self::A::+}(1) in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::A'.\nTry changing the type of the left hand side, or casting the right hand side to '#lib1::A'.\n  a /*@error=InvalidAssignment*/ += 1;\n                                 ^"));
+  a = let final dynamic #t3 = a.{self::A::+}(1) in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::A'.\nTry changing the type of the left hand side, or casting the right hand side to '#lib1::A'.\n  a /*@error=InvalidAssignment*/ += 1;\n                                 ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/invalid_cast.dart.strong.expect b/pkg/front_end/testcases/invalid_cast.dart.strong.expect
index 4900c71..9ca2218 100644
--- a/pkg/front_end/testcases/invalid_cast.dart.strong.expect
+++ b/pkg/front_end/testcases/invalid_cast.dart.strong.expect
@@ -27,17 +27,17 @@
 static method topLevelFunction(core::int i) → void {}
 static method bad() → dynamic {
   function localFunction(core::int i) → void {}
-  core::List<core::int> a = let final dynamic #t1 = <core::Object>[] in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'dart.core::List<dart.core::Object>' isn't of expected type 'dart.core::List<dart.core::int>'.\nChange the type of the list literal or the context in which it is used.\n  List<int> a = <Object> /*@error=InvalidCastLiteralList*/ [];\n                                                           ^"));
-  core::Map<core::int, core::String> b = let final dynamic #t2 = <core::Object, core::String>{} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'dart.core::Map<dart.core::Object, dart.core::String>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.\nChange the type of the map literal or the context in which it is used.\n  Map<int, String> b = <Object, String> /*@error=InvalidCastLiteralMap*/ {};\n                                                                         ^"));
-  core::Map<core::int, core::String> c = let final dynamic #t3 = <core::int, core::Object>{} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'dart.core::Map<dart.core::int, dart.core::Object>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.\nChange the type of the map literal or the context in which it is used.\n  Map<int, String> c = <int, Object> /*@error=InvalidCastLiteralMap*/ {};\n                                                                      ^"));
-  (core::Object) → core::int d = let final dynamic #t4 = (core::int i) → core::int => i in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type '(dart.core::int) \u8594 dart.core::int' isn't of expected type '(dart.core::Object) \u8594 dart.core::int'.\nChange the type of the function expression or the context in which it is used.\n  int Function(Object) d = /*@error=InvalidCastFunctionExpr*/ (int i) => i;\n                                                              ^"));
+  core::List<core::int> a = let final dynamic #t1 = <core::Object>[] in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'dart.core::List<dart.core::Object>' isn't of expected type 'dart.core::List<dart.core::int>'.\nChange the type of the list literal or the context in which it is used.\n  List<int> a = <Object> /*@error=InvalidCastLiteralList*/ [];\n                                                           ^";
+  core::Map<core::int, core::String> b = let final dynamic #t2 = <core::Object, core::String>{} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'dart.core::Map<dart.core::Object, dart.core::String>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.\nChange the type of the map literal or the context in which it is used.\n  Map<int, String> b = <Object, String> /*@error=InvalidCastLiteralMap*/ {};\n                                                                         ^";
+  core::Map<core::int, core::String> c = let final dynamic #t3 = <core::int, core::Object>{} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'dart.core::Map<dart.core::int, dart.core::Object>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.\nChange the type of the map literal or the context in which it is used.\n  Map<int, String> c = <int, Object> /*@error=InvalidCastLiteralMap*/ {};\n                                                                      ^";
+  (core::Object) → core::int d = let final dynamic #t4 = (core::int i) → core::int => i in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type '(dart.core::int) \u8594 dart.core::int' isn't of expected type '(dart.core::Object) \u8594 dart.core::int'.\nChange the type of the function expression or the context in which it is used.\n  int Function(Object) d = /*@error=InvalidCastFunctionExpr*/ (int i) => i;\n                                                              ^";
   self::D e = self::C::fact() as{TypeError} self::D;
   self::D f = new self::D::•() as{TypeError} self::D;
-  self::D g = let final dynamic #t5 = new self::C::nonFact() in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.\nChange the type of the object being constructed or the context in which it is used.\n  D g = new /*@error=InvalidCastNewExpr*/ C.nonFact();\n                                          ^"));
-  self::D h = let final dynamic #t6 = new self::C::nonFact2() in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.\nChange the type of the object being constructed or the context in which it is used.\n  D h = new /*@error=InvalidCastNewExpr*/ C.nonFact2();\n                                          ^"));
-  (core::Object) → void i = let final dynamic #t7 = self::C::staticFunction in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.\nChange the type of the method or the context in which it is used.\n      C. /*@error=InvalidCastStaticMethod*/ staticFunction;\n                                            ^"));
-  (core::Object) → void j = let final dynamic #t8 = self::topLevelFunction in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.\nChange the type of the function or the context in which it is used.\n      j = /*@error=InvalidCastTopLevelFunction*/ topLevelFunction;\n                                                 ^"));
-  (core::Object) → void k = let final dynamic #t9 = localFunction in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.\nChange the type of the function or the context in which it is used.\n  void Function(Object) k = /*@error=InvalidCastLocalFunction*/ localFunction;\n                                                                ^"));
+  self::D g = let final dynamic #t5 = new self::C::nonFact() in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.\nChange the type of the object being constructed or the context in which it is used.\n  D g = new /*@error=InvalidCastNewExpr*/ C.nonFact();\n                                          ^";
+  self::D h = let final dynamic #t6 = new self::C::nonFact2() in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.\nChange the type of the object being constructed or the context in which it is used.\n  D h = new /*@error=InvalidCastNewExpr*/ C.nonFact2();\n                                          ^";
+  (core::Object) → void i = let final dynamic #t7 = self::C::staticFunction in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.\nChange the type of the method or the context in which it is used.\n      C. /*@error=InvalidCastStaticMethod*/ staticFunction;\n                                            ^";
+  (core::Object) → void j = let final dynamic #t8 = self::topLevelFunction in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.\nChange the type of the function or the context in which it is used.\n      j = /*@error=InvalidCastTopLevelFunction*/ topLevelFunction;\n                                                 ^";
+  (core::Object) → void k = let final dynamic #t9 = localFunction in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.\nChange the type of the function or the context in which it is used.\n  void Function(Object) k = /*@error=InvalidCastLocalFunction*/ localFunction;\n                                                                ^";
 }
 static method ok() → dynamic {
   function localFunction(core::int i) → void {}
diff --git a/pkg/front_end/testcases/native_as_name.dart b/pkg/front_end/testcases/native_as_name.dart
new file mode 100644
index 0000000..8bd1047
--- /dev/null
+++ b/pkg/front_end/testcases/native_as_name.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  print(new W().native);
+  print(new X().native());
+  print(new Y2().native);
+  print((new Z()..native = "setter").f);
+}
+
+class W {
+  String native;
+  W() : native = "field";
+}
+
+class X {
+  String native() => "method";
+}
+
+class Y1 {
+  String get native;
+}
+
+class Y2 {
+  @override
+  String get native => "getter";
+}
+
+class Z {
+  set native(String s) => f = s;
+  String f;
+}
diff --git a/pkg/front_end/testcases/native_as_name.dart.direct.expect b/pkg/front_end/testcases/native_as_name.dart.direct.expect
new file mode 100644
index 0000000..01d9add
--- /dev/null
+++ b/pkg/front_end/testcases/native_as_name.dart.direct.expect
@@ -0,0 +1,45 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class W extends core::Object {
+  field core::String native;
+  constructor •() → void
+    : self::W::native = "field", super core::Object::•()
+    ;
+}
+class X extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method native() → core::String
+    return "method";
+}
+class Y1 extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  abstract get native() → core::String;
+}
+class Y2 extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  @core::override
+  get native() → core::String
+    return "getter";
+}
+class Z extends core::Object {
+  field core::String f = null;
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  set native(core::String s) → dynamic
+    return this.{self::Z::f} = s;
+}
+static method main() → dynamic {
+  core::print(new self::W::•().native);
+  core::print(new self::X::•().native());
+  core::print(new self::Y2::•().native);
+  core::print((let final dynamic #t1 = new self::Z::•() in let final dynamic #t2 = #t1.native = "setter" in #t1).f);
+}
diff --git a/pkg/front_end/testcases/native_as_name.dart.outline.expect b/pkg/front_end/testcases/native_as_name.dart.outline.expect
new file mode 100644
index 0000000..9955d59
--- /dev/null
+++ b/pkg/front_end/testcases/native_as_name.dart.outline.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class W extends core::Object {
+  field core::String native;
+  constructor •() → void
+    ;
+}
+class X extends core::Object {
+  default constructor •() → void
+    ;
+  method native() → core::String
+    ;
+}
+class Y1 extends core::Object {
+  default constructor •() → void
+    ;
+  abstract get native() → core::String;
+}
+class Y2 extends core::Object {
+  default constructor •() → void
+    ;
+  get native() → core::String
+    ;
+}
+class Z extends core::Object {
+  field core::String f;
+  default constructor •() → void
+    ;
+  set native(core::String s) → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/native_as_name.dart.strong.expect b/pkg/front_end/testcases/native_as_name.dart.strong.expect
new file mode 100644
index 0000000..eb3cfd0
--- /dev/null
+++ b/pkg/front_end/testcases/native_as_name.dart.strong.expect
@@ -0,0 +1,45 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class W extends core::Object {
+  field core::String native;
+  constructor •() → void
+    : self::W::native = "field", super core::Object::•()
+    ;
+}
+class X extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method native() → core::String
+    return "method";
+}
+class Y1 extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  abstract get native() → core::String;
+}
+class Y2 extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  @core::override
+  get native() → core::String
+    return "getter";
+}
+class Z extends core::Object {
+  field core::String f = null;
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  set native(core::String s) → void
+    return this.{self::Z::f} = s;
+}
+static method main() → dynamic {
+  core::print(new self::W::•().{self::W::native});
+  core::print(new self::X::•().{self::X::native}());
+  core::print(new self::Y2::•().{self::Y2::native});
+  core::print((let final self::Z #t1 = new self::Z::•() in let final dynamic #t2 = #t1.{self::Z::native} = "setter" in #t1).{self::Z::f});
+}
diff --git a/pkg/front_end/testcases/override_check_after_inference.dart b/pkg/front_end/testcases/override_check_after_inference.dart
new file mode 100644
index 0000000..9777a7e
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_after_inference.dart
@@ -0,0 +1,27 @@
+// 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.
+
+/*@testedFeatures=error*/
+
+class A {}
+
+class B extends A {}
+
+class C {
+  void f(A x) {}
+}
+
+class D extends C {
+  void f(x) {} // Inferred type: (A) -> void
+}
+
+class E extends D {
+  void f(A x) {} // Ok
+}
+
+class F extends D {
+  void f(B /*@error=OverrideTypeMismatchParameter*/ x) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/override_check_after_inference.dart.direct.expect b/pkg/front_end/testcases/override_check_after_inference.dart.direct.expect
new file mode 100644
index 0000000..ecd2931
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_after_inference.dart.direct.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method f(self::A x) → void {}
+}
+class D extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  method f(dynamic x) → void {}
+}
+class E extends self::D {
+  default constructor •() → void
+    : super self::D::•()
+    ;
+  method f(self::A x) → void {}
+}
+class F extends self::D {
+  default constructor •() → void
+    : super self::D::•()
+    ;
+  method f(self::B x) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_after_inference.dart.outline.expect b/pkg/front_end/testcases/override_check_after_inference.dart.outline.expect
new file mode 100644
index 0000000..9f2649d
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_after_inference.dart.outline.expect
@@ -0,0 +1,38 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    ;
+  method f(self::A x) → void
+    ;
+}
+class D extends self::C {
+  default constructor •() → void
+    ;
+  method f(dynamic x) → void
+    ;
+}
+class E extends self::D {
+  default constructor •() → void
+    ;
+  method f(self::A x) → void
+    ;
+}
+class F extends self::D {
+  default constructor •() → void
+    ;
+  method f(self::B x) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect b/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect
new file mode 100644
index 0000000..02d5935
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method f(self::A x) → void {}
+}
+class D extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  method f(self::A x) → void {}
+}
+class E extends self::D {
+  default constructor •() → void
+    : super self::D::•()
+    ;
+  method f(self::A x) → void {}
+}
+class F extends self::D {
+  default constructor •() → void
+    : super self::D::•()
+    ;
+  method f(self::B x) → void {}
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/override_check_after_inference.dart:24:53: Error: The parameter 'x' of the method 'F::f' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).\nChange to a supertype of #lib1::A (or, for a covariant parameter, a subtype).\n  void f(B /*@error=OverrideTypeMismatchParameter*/ x) {}\n                                                    ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_basic.dart b/pkg/front_end/testcases/override_check_basic.dart
new file mode 100644
index 0000000..70134a6
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_basic.dart
@@ -0,0 +1,32 @@
+// 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.
+
+/*@testedFeatures=error*/
+
+class A {}
+
+class B extends A {}
+
+class C {
+  void f1(A x) {}
+  void f2([A x]) {}
+  void f3({A x}) {}
+  A f4() {}
+}
+
+class D extends C {
+  void f1(Object x) {} // Ok
+  void f2([Object x]) {} // Ok
+  void f3({Object x}) {} // Ok
+  B f4() {} // Ok
+}
+
+class E extends C {
+  void f1(B /*@error=OverrideTypeMismatchParameter*/ x) {}
+  void f2([B /*@error=OverrideTypeMismatchParameter*/ x]) {}
+  void f3({B /*@error=OverrideTypeMismatchParameter*/ x}) {}
+  Object /*@error=OverrideTypeMismatchReturnType*/ f4() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/override_check_basic.dart.direct.expect b/pkg/front_end/testcases/override_check_basic.dart.direct.expect
new file mode 100644
index 0000000..bbf5c19
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_basic.dart.direct.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method f1(self::A x) → void {}
+  method f2([self::A x = null]) → void {}
+  method f3({self::A x = null}) → void {}
+  method f4() → self::A {}
+}
+class D extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  method f1(core::Object x) → void {}
+  method f2([core::Object x = null]) → void {}
+  method f3({core::Object x = null}) → void {}
+  method f4() → self::B {}
+}
+class E extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  method f1(self::B x) → void {}
+  method f2([self::B x = null]) → void {}
+  method f3({self::B x = null}) → void {}
+  method f4() → core::Object {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_basic.dart.outline.expect b/pkg/front_end/testcases/override_check_basic.dart.outline.expect
new file mode 100644
index 0000000..a3e5791
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_basic.dart.outline.expect
@@ -0,0 +1,50 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    ;
+  method f1(self::A x) → void
+    ;
+  method f2([self::A x]) → void
+    ;
+  method f3({self::A x}) → void
+    ;
+  method f4() → self::A
+    ;
+}
+class D extends self::C {
+  default constructor •() → void
+    ;
+  method f1(core::Object x) → void
+    ;
+  method f2([core::Object x]) → void
+    ;
+  method f3({core::Object x}) → void
+    ;
+  method f4() → self::B
+    ;
+}
+class E extends self::C {
+  default constructor •() → void
+    ;
+  method f1(self::B x) → void
+    ;
+  method f2([self::B x]) → void
+    ;
+  method f3({self::B x}) → void
+    ;
+  method f4() → core::Object
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/override_check_basic.dart.strong.expect b/pkg/front_end/testcases/override_check_basic.dart.strong.expect
new file mode 100644
index 0000000..9252e55d
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_basic.dart.strong.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method f1(self::A x) → void {}
+  method f2([self::A x = null]) → void {}
+  method f3({self::A x = null}) → void {}
+  method f4() → self::A {}
+}
+class D extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  method f1(core::Object x) → void {}
+  method f2([core::Object x = null]) → void {}
+  method f3({core::Object x = null}) → void {}
+  method f4() → self::B {}
+}
+class E extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  method f1(self::B x) → void {}
+  method f2([self::B x = null]) → void {}
+  method f3({self::B x = null}) → void {}
+  method f4() → core::Object {}
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/override_check_basic.dart:29:52: Error: The return type of the method 'E::f4' is dart.core::Object, which does not match the return type of the overridden method (#lib1::A).\nChange to a subtype of #lib1::A.\n  Object /*@error=OverrideTypeMismatchReturnType*/ f4() {}\n                                                   ^", "pkg/front_end/testcases/override_check_basic.dart:28:55: Error: The parameter 'x' of the method 'E::f3' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).\nChange to a supertype of #lib1::A (or, for a covariant parameter, a subtype).\n  void f3({B /*@error=OverrideTypeMismatchParameter*/ x}) {}\n                                                      ^", "pkg/front_end/testcases/override_check_basic.dart:26:54: Error: The parameter 'x' of the method 'E::f1' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).\nChange to a supertype of #lib1::A (or, for a covariant parameter, a subtype).\n  void f1(B /*@error=OverrideTypeMismatchParameter*/ x) {}\n                                                     ^", "pkg/front_end/testcases/override_check_basic.dart:27:55: Error: The parameter 'x' of the method 'E::f2' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).\nChange to a supertype of #lib1::A (or, for a covariant parameter, a subtype).\n  void f2([B /*@error=OverrideTypeMismatchParameter*/ x]) {}\n                                                      ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_two_substitutions.dart b/pkg/front_end/testcases/override_check_two_substitutions.dart
new file mode 100644
index 0000000..98ab523
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_two_substitutions.dart
@@ -0,0 +1,17 @@
+// 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.
+
+/*@testedFeatures=error*/
+
+class A<T> {
+  void f<U>(Map<T, U> m) {}
+}
+
+class B extends A<String> {
+  // To see that this is a valid override, both T and U need to be substituted
+  // correctly.
+  void f<V>(Map<String, V> m) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.expect b/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.expect
new file mode 100644
index 0000000..9a29468
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object> extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method f<U extends core::Object>(core::Map<self::A::T, self::A::f::U> m) → void {}
+}
+class B extends self::A<core::String> {
+  default constructor •() → void
+    : super self::A::•()
+    ;
+  method f<V extends core::Object>(core::Map<core::String, self::B::f::V> m) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_two_substitutions.dart.outline.expect b/pkg/front_end/testcases/override_check_two_substitutions.dart.outline.expect
new file mode 100644
index 0000000..4eeabe2
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_two_substitutions.dart.outline.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object> extends core::Object {
+  default constructor •() → void
+    ;
+  method f<U extends core::Object>(core::Map<self::A::T, self::A::f::U> m) → void
+    ;
+}
+class B extends self::A<core::String> {
+  default constructor •() → void
+    ;
+  method f<V extends core::Object>(core::Map<core::String, self::B::f::V> m) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/override_check_two_substitutions.dart.strong.expect b/pkg/front_end/testcases/override_check_two_substitutions.dart.strong.expect
new file mode 100644
index 0000000..21337fd
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_two_substitutions.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object> extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method f<U extends core::Object>(generic-covariant-impl generic-covariant-interface core::Map<self::A::T, self::A::f::U> m) → void {}
+}
+class B extends self::A<core::String> {
+  default constructor •() → void
+    : super self::A::•()
+    ;
+  method f<V extends core::Object>(generic-covariant-impl core::Map<core::String, self::B::f::V> m) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart
new file mode 100644
index 0000000..715a685
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart
@@ -0,0 +1,29 @@
+// 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.
+
+/*@testedFeatures=error*/
+
+class A {}
+
+class B extends A {}
+
+class C {
+  void f1(covariant A x) {}
+  void f2(A x) {}
+  void f3(covariant A x) {}
+  void f4(A x) {}
+  void f5(covariant A x) {}
+  void f6(covariant B x) {}
+}
+
+class D extends C {
+  void f1(B x) {} // Ok because covariant is inherited
+  void f2(covariant B x) {} // Ok because covariant
+  void f3(covariant B x) {} // Ok because covariant
+  void f4(B /*@error=OverrideTypeMismatchParameter*/ x) {} // Not covariant
+  void f5(covariant String /*@error=OverrideTypeMismatchParameter*/ x) {}
+  void f6(covariant A x) {} // Always ok
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.direct.expect b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.direct.expect
new file mode 100644
index 0000000..8ae0958
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.direct.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method f1(covariant self::A x) → void {}
+  method f2(self::A x) → void {}
+  method f3(covariant self::A x) → void {}
+  method f4(self::A x) → void {}
+  method f5(covariant self::A x) → void {}
+  method f6(covariant self::B x) → void {}
+}
+class D extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  method f1(self::B x) → void {}
+  method f2(covariant self::B x) → void {}
+  method f3(covariant self::B x) → void {}
+  method f4(self::B x) → void {}
+  method f5(covariant core::String x) → void {}
+  method f6(covariant self::A x) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.outline.expect b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.outline.expect
new file mode 100644
index 0000000..de5016f
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.outline.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    ;
+  method f1(covariant self::A x) → void
+    ;
+  method f2(self::A x) → void
+    ;
+  method f3(covariant self::A x) → void
+    ;
+  method f4(self::A x) → void
+    ;
+  method f5(covariant self::A x) → void
+    ;
+  method f6(covariant self::B x) → void
+    ;
+}
+class D extends self::C {
+  default constructor •() → void
+    ;
+  method f1(self::B x) → void
+    ;
+  method f2(covariant self::B x) → void
+    ;
+  method f3(covariant self::B x) → void
+    ;
+  method f4(self::B x) → void
+    ;
+  method f5(covariant core::String x) → void
+    ;
+  method f6(covariant self::A x) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect
new file mode 100644
index 0000000..06f4aca
--- /dev/null
+++ b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect
@@ -0,0 +1,38 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method f1(covariant self::A x) → void {}
+  method f2(self::A x) → void {}
+  method f3(covariant self::A x) → void {}
+  method f4(self::A x) → void {}
+  method f5(covariant self::A x) → void {}
+  method f6(covariant self::B x) → void {}
+}
+class D extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  method f1(covariant self::B x) → void {}
+  method f2(covariant self::B x) → void {}
+  method f3(covariant self::B x) → void {}
+  method f4(self::B x) → void {}
+  method f5(covariant core::String x) → void {}
+  method f6(covariant self::A x) → void {}
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/override_check_with_covariant_modifier.dart:25:69: Error: The parameter 'x' of the method 'D::f5' has type dart.core::String, which does not match the corresponding type in the overridden method (#lib1::A).\nChange to a supertype of #lib1::A (or, for a covariant parameter, a subtype).\n  void f5(covariant String /*@error=OverrideTypeMismatchParameter*/ x) {}\n                                                                    ^", "pkg/front_end/testcases/override_check_with_covariant_modifier.dart:24:54: Error: The parameter 'x' of the method 'D::f4' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).\nChange to a supertype of #lib1::A (or, for a covariant parameter, a subtype).\n  void f4(B /*@error=OverrideTypeMismatchParameter*/ x) {} // Not covariant\n                                                     ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.direct.expect b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.direct.expect
index 2ba15c7..7f8beee 100644
--- a/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   const constructor •() → void
-    : final dynamic #t1 = const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/bad_constructor_redirection.dart:6:20: Error: Method not found: 'x'.\n  const C() : this.x(1);\n                   ^"))
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_constructor_redirection.dart:6:20: Error: Method not found: 'x'.\n  const C() : this.x(1);\n                   ^"
     ;
   const constructor x() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/rasta/bad_continue.dart.direct.expect b/pkg/front_end/testcases/rasta/bad_continue.dart.direct.expect
index 977534a..f0ab924 100644
--- a/pkg/front_end/testcases/rasta/bad_continue.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/bad_continue.dart.direct.expect
@@ -1,9 +1,8 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {
-  const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/bad_continue.dart:6:12: Error: Can't find label 'here'.\n  continue here;\n           ^"));
+  invalid-expression "pkg/front_end/testcases/rasta/bad_continue.dart:6:12: Error: Can't find label 'here'.\n  continue here;\n           ^";
   #L1:
   break #L1;
 }
diff --git a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.direct.expect b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.direct.expect
index e11ae08..dcdb2f0 100644
--- a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.direct.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   constructor •(dynamic x) → void
-    : final dynamic #t1 = const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:6:10: Error: 'x' isn't an instance field of this class.\n  A(this.x);\n         ^"))
+    : final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:6:10: Error: 'x' isn't an instance field of this class.\n  A(this.x);\n         ^"
     ;
 }
 class B extends self::A {
   const constructor •() → void
-    : final dynamic #t2 = const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:10:9: Error: The unnamed constructor in 'A' requires arguments.\n  const B();\n        ^"))
+    : final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:10:9: Error: The unnamed constructor in 'A' requires arguments.\n  const B();\n        ^"
     ;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/bad_redirection.dart.direct.expect b/pkg/front_end/testcases/rasta/bad_redirection.dart.direct.expect
index 9446333..d61c880 100644
--- a/pkg/front_end/testcases/rasta/bad_redirection.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/bad_redirection.dart.direct.expect
@@ -5,7 +5,7 @@
 class Foo extends core::Object {
   constructor •() → void
     : super core::Object::•()
-    const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/bad_redirection.dart:6:11: Error: Can't return from a constructor.\n  Foo() = Bar;\n          ^"));
+    invalid-expression "pkg/front_end/testcases/rasta/bad_redirection.dart:6:11: Error: Can't return from a constructor.\n  Foo() = Bar;\n          ^";
 }
 class Bar extends self::Foo {
   static factory •() → self::Bar
diff --git a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.direct.expect b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.direct.expect
index 8a3cd35..957daf2 100644
--- a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   constructor •() → void
-    : final dynamic #t1 = const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/bad_setter_initializer.dart:6:15: Error: 'field' isn't an instance field of this class.\n  C() : field = null;\n              ^"))
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_setter_initializer.dart:6:15: Error: 'field' isn't an instance field of this class.\n  C() : field = null;\n              ^"
     ;
   set field(dynamic value) → dynamic {}
 }
diff --git a/pkg/front_end/testcases/rasta/breaking_bad.dart.direct.expect b/pkg/front_end/testcases/rasta/breaking_bad.dart.direct.expect
index 359a253..eadb4ab 100644
--- a/pkg/front_end/testcases/rasta/breaking_bad.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/breaking_bad.dart.direct.expect
@@ -1,9 +1,8 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {
-  const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/breaking_bad.dart:6:3: Error: No target of break.\n  break;\n  ^"));
+  invalid-expression "pkg/front_end/testcases/rasta/breaking_bad.dart:6:3: Error: No target of break.\n  break;\n  ^";
   #L1:
   break #L1;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000031.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000031.dart.direct.expect
index 9f60197..f284b26 100644
--- a/pkg/front_end/testcases/rasta/issue_000031.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000031.dart.direct.expect
@@ -1,7 +1,6 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {
-  let final dynamic #t1 = const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/issue_000031.dart: Error: A library can't be used as an expression.")) in let final dynamic #t2 = #t1.toString() in #t1;
+  let final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/issue_000031.dart: Error: A library can't be used as an expression." in let final dynamic #t2 = #t1.toString() in #t1;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000033.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000033.dart.direct.expect
index 1d114ad..a3bb321 100644
--- a/pkg/front_end/testcases/rasta/issue_000033.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000033.dart.direct.expect
@@ -1,6 +1,5 @@
 library;
 import self as self;
-import "dart:core" as core;
 
-@const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/issue_000033.dart:5:2: Error: Method not found: 'JS'.\n@JS()\n ^"))
+@invalid-expression "pkg/front_end/testcases/rasta/issue_000033.dart:5:2: Error: Method not found: 'JS'.\n@JS()\n ^"
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/issue_000042.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000042.dart.direct.expect
index d807232..c4f7d99 100644
--- a/pkg/front_end/testcases/rasta/issue_000042.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000042.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  for (final dynamic #t1 = const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: Expected lvalue, but got [x, y]\n  for (var x, y in []) {}\n       ^")) in <dynamic>[]) {
+  for (final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: Expected lvalue, but got [x, y]\n  for (var x, y in []) {}\n       ^" in <dynamic>[]) {
   }
   #L1:
   {
diff --git a/pkg/front_end/testcases/rasta/issue_000044.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000044.dart.direct.expect
index 2894bc1..abff29a 100644
--- a/pkg/front_end/testcases/rasta/issue_000044.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000044.dart.direct.expect
@@ -9,7 +9,7 @@
     ;
   constructor missingFactoryKeyword() → void
     : super core::Object::•()
-    const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/issue_000044.dart:14:31: Error: Can't return from a constructor.\n  C.missingFactoryKeyword() = C.constant;\n                              ^"));
+    invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:14:31: Error: Can't return from a constructor.\n  C.missingFactoryKeyword() = C.constant;\n                              ^";
   static factory good() → self::C
     let dynamic #redirecting_factory = self::C::constant in invalid-expression;
   method notEvenAConstructor(dynamic a) → self::C
@@ -20,7 +20,7 @@
 static method main() → dynamic {
   self::C c = null;
   core::print(const self::C::constant());
-  core::print(const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/issue_000044.dart:27:15: Error: Not a const constructor.\n  print(const C.missingFactoryKeyword());\n              ^")));
+  core::print(invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:27:15: Error: Not a const constructor.\n  print(const C.missingFactoryKeyword());\n              ^");
   core::print(const self::C::constant());
   core::print(new self::C::constant().notEvenAConstructor(null));
 }
diff --git a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.direct.expect b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.direct.expect
index 3e1085f..c8306b8 100644
--- a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   const constructor •() → void
-    : final dynamic #t1 = const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/malformed_const_constructor.dart:7:7: Error: Setter not found: 'x'.\n    : x = 'foo'\n      ^"))
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/malformed_const_constructor.dart:7:7: Error: Setter not found: 'x'.\n    : x = 'foo'\n      ^"
     ;
 }
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:5: Error: Expected a function body, but got ':'.\n    : x = 'foo'\n    ^", "pkg/front_end/testcases/rasta/malformed_const_constructor.dart: Error: A const constructor can't have a body."]/* from null */;
diff --git a/pkg/front_end/testcases/rasta/malformed_function.dart.direct.expect b/pkg/front_end/testcases/rasta/malformed_function.dart.direct.expect
index a0ceaaf..e391c9b 100644
--- a/pkg/front_end/testcases/rasta/malformed_function.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/malformed_function.dart.direct.expect
@@ -1,7 +1,6 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {
-  const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/malformed_function.dart:7:8: Error: Can't assign to a parenthesized expression.\n  (null) = null;\n       ^"));
+  invalid-expression "pkg/front_end/testcases/rasta/malformed_function.dart:7:8: Error: Can't assign to a parenthesized expression.\n  (null) = null;\n       ^";
 }
diff --git a/pkg/front_end/testcases/rasta/super.dart.direct.expect b/pkg/front_end/testcases/rasta/super.dart.direct.expect
index 23bb7ae..864867d 100644
--- a/pkg/front_end/testcases/rasta/super.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.direct.expect
@@ -51,8 +51,8 @@
     self::use(super.{self::A::~}());
     super.{self::A::unary-}();
     self::use(super.{self::A::unary-}());
-    this.•.+(const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use `super` as an expression.\n    +super;\n     ^")));
-    self::use(this.•.+(const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use `super` as an expression.\n    use(+super);\n         ^"))));
+    this.•.+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use `super` as an expression.\n    +super;\n     ^");
+    self::use(this.•.+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use `super` as an expression.\n    use(+super);\n         ^"));
     super.{self::A::==}(87);
     self::use(super.{self::A::==}(87));
     !super.{self::A::==}(87);
diff --git a/pkg/front_end/testcases/rasta/super.dart.strong.expect b/pkg/front_end/testcases/rasta/super.dart.strong.expect
index 4de50f1..5430f1d 100644
--- a/pkg/front_end/testcases/rasta/super.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.strong.expect
@@ -51,8 +51,8 @@
     self::use(super.{self::A::~}());
     super.{self::A::unary-}();
     self::use(super.{self::A::unary-}());
-    (let final dynamic #t1 = this in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:43:5: Error: The getter '' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named ''.\n    +super;\n    ^"))).+(const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n    +super;\n     ^")));
-    self::use((let final dynamic #t2 = this in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:44:9: Error: The getter '' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named ''.\n    use(+super);\n        ^"))).+(const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n    use(+super);\n         ^"))));
+    (let final dynamic #t1 = this in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:5: Error: The getter '' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named ''.\n    +super;\n    ^").+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n    +super;\n     ^");
+    self::use((let final dynamic #t2 = this in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:9: Error: The getter '' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named ''.\n    use(+super);\n        ^").+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n    use(+super);\n         ^"));
     super.{self::A::==}(87);
     self::use(super.{self::A::==}(87));
     !super.{self::A::==}(87);
@@ -101,10 +101,10 @@
     self::use(let final dynamic #t19 = super.{self::A::i} in let final dynamic #t20 = super.{self::B::i} = #t19.+(1) in #t19);
     let final core::int #t21 = 87 in super.{self::A::[]=}(#t21, super.{self::A::[]}(#t21).+(1));
     self::use(let final core::int #t22 = 87 in let final dynamic #t23 = super.{self::A::[]}(#t22) in let final void #t24 = super.{self::A::[]=}(#t22, #t23.+(1)) in #t23);
-    super.m = let final dynamic #t25 = super.{self::A::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:95:12: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    super.m++;\n           ^"));
-    self::use(let final () → void #t26 = super.{self::A::m} in let final dynamic #t27 = super.m = let final dynamic #t28 = #t26 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:96:16: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(super.m++);\n               ^")) in #t26);
-    super.{self::A::n} = let final dynamic #t29 = super.{self::A::n} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:97:12: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    super.n++;\n           ^"));
-    self::use(let final () → void #t30 = super.{self::A::n} in let final dynamic #t31 = super.{self::A::n} = let final dynamic #t32 = #t30 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:98:16: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(super.n++);\n               ^")) in #t30);
+    super.m = let final dynamic #t25 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:95:12: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    super.m++;\n           ^";
+    self::use(let final () → void #t26 = super.{self::A::m} in let final dynamic #t27 = super.m = let final dynamic #t28 = #t26 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:96:16: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(super.m++);\n               ^" in #t26);
+    super.{self::A::n} = let final dynamic #t29 = super.{self::A::n} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:97:12: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    super.n++;\n           ^";
+    self::use(let final () → void #t30 = super.{self::A::n} in let final dynamic #t31 = super.{self::A::n} = let final dynamic #t32 = #t30 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:98:16: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(super.n++);\n               ^" in #t30);
     super.{self::A::a} = super.{self::A::a}.+(1);
     self::use(super.{self::A::a} = super.{self::A::a}.+(1));
     super.{self::A::b} = super.{self::B::b}.+(1);
@@ -125,10 +125,10 @@
     self::use(super.{self::B::i} = super.{self::A::i}.+(1));
     let final core::int #t33 = 87 in let final dynamic #t34 = super.{self::A::[]}(#t33).+(1) in let final void #t35 = super.{self::A::[]=}(#t33, #t34) in #t34;
     self::use(let final core::int #t36 = 87 in let final dynamic #t37 = super.{self::A::[]}(#t36).+(1) in let final void #t38 = super.{self::A::[]=}(#t36, #t37) in #t37);
-    super.m = let final dynamic #t39 = super.{self::A::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:120:5: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    ++super.m;\n    ^"));
-    self::use(super.m = let final dynamic #t40 = super.{self::A::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:121:9: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(++super.m);\n        ^")));
-    super.{self::A::n} = let final dynamic #t41 = super.{self::A::n} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:122:5: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    ++super.n;\n    ^"));
-    self::use(super.{self::A::n} = let final dynamic #t42 = super.{self::A::n} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:123:9: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(++super.n);\n        ^")));
+    super.m = let final dynamic #t39 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:120:5: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    ++super.m;\n    ^";
+    self::use(super.m = let final dynamic #t40 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:121:9: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(++super.m);\n        ^");
+    super.{self::A::n} = let final dynamic #t41 = super.{self::A::n} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:122:5: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    ++super.n;\n    ^";
+    self::use(super.{self::A::n} = let final dynamic #t42 = super.{self::A::n} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:123:9: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(++super.n);\n        ^");
     super.{self::A::a}.call();
     self::use(super.{self::A::a}.call());
     super.{self::B::b}.call();
@@ -223,10 +223,10 @@
     self::use(super.{self::B::i} = super.{self::A::i}.+(42));
     let final core::int #t64 = 87 in super.{self::A::[]=}(#t64, super.{self::A::[]}(#t64).+(42));
     self::use(let final core::int #t65 = 87 in let final dynamic #t66 = super.{self::A::[]}(#t65).+(42) in let final void #t67 = super.{self::A::[]=}(#t65, #t66) in #t66);
-    super.m = let final dynamic #t68 = super.{self::A::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:222:13: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    super.m += 42;\n            ^"));
-    self::use(super.m = let final dynamic #t69 = super.{self::A::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:223:17: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(super.m += 42);\n                ^")));
-    super.{self::A::n} = let final dynamic #t70 = super.{self::A::n} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:224:13: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    super.n += 42;\n            ^"));
-    self::use(super.{self::A::n} = let final dynamic #t71 = super.{self::A::n} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:225:17: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(super.n += 42);\n                ^")));
+    super.m = let final dynamic #t68 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:222:13: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    super.m += 42;\n            ^";
+    self::use(super.m = let final dynamic #t69 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:223:17: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(super.m += 42);\n                ^");
+    super.{self::A::n} = let final dynamic #t70 = super.{self::A::n} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:224:13: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    super.n += 42;\n            ^";
+    self::use(super.{self::A::n} = let final dynamic #t71 = super.{self::A::n} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:225:17: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(super.n += 42);\n                ^");
     super.{self::A::a} = super.{self::A::a}.-(42);
     self::use(super.{self::A::a} = super.{self::A::a}.-(42));
     super.{self::A::b} = super.{self::B::b}.-(42);
@@ -247,10 +247,10 @@
     self::use(super.{self::B::i} = super.{self::A::i}.-(42));
     let final core::int #t72 = 87 in super.{self::A::[]=}(#t72, super.{self::A::[]}(#t72).-(42));
     self::use(let final core::int #t73 = 87 in let final dynamic #t74 = super.{self::A::[]}(#t73).-(42) in let final void #t75 = super.{self::A::[]=}(#t73, #t74) in #t74);
-    super.m = let final dynamic #t76 = super.{self::A::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:247:13: Error: The method '-' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '-'.\n    super.m -= 42;\n            ^"));
-    self::use(super.m = let final dynamic #t77 = super.{self::A::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:248:17: Error: The method '-' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '-'.\n    use(super.m -= 42);\n                ^")));
-    super.{self::A::n} = let final dynamic #t78 = super.{self::A::n} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:249:13: Error: The method '-' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '-'.\n    super.n -= 42;\n            ^"));
-    self::use(super.{self::A::n} = let final dynamic #t79 = super.{self::A::n} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:250:17: Error: The method '-' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '-'.\n    use(super.n -= 42);\n                ^")));
+    super.m = let final dynamic #t76 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:247:13: Error: The method '-' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '-'.\n    super.m -= 42;\n            ^";
+    self::use(super.m = let final dynamic #t77 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:248:17: Error: The method '-' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '-'.\n    use(super.m -= 42);\n                ^");
+    super.{self::A::n} = let final dynamic #t78 = super.{self::A::n} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:249:13: Error: The method '-' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '-'.\n    super.n -= 42;\n            ^";
+    self::use(super.{self::A::n} = let final dynamic #t79 = super.{self::A::n} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:250:17: Error: The method '-' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '-'.\n    use(super.n -= 42);\n                ^");
   }
 }
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.\nTry removing '+'.\n    +super;\n    ^", "pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.\nTry removing '+'.\n    use(+super);\n        ^"]/* from null */;
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect
index ac56b5b..6741aa0 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect
@@ -16,14 +16,14 @@
       let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <dynamic>[], <dynamic>[#t2].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
       core::print(self::Fisk);
     }
-    for (final dynamic #t3 = let dynamic _ = null in const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: Expected lvalue, but got Instance of 'PrefixBuilder'\n    for (collection in x) {\n         ^")) in x) {
-      core::print(const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/unresolved_for_in.dart: Error: A library can't be used as an expression.")));
+    for (final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: Expected lvalue, but got Instance of 'PrefixBuilder'\n    for (collection in x) {\n         ^" in x) {
+      core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart: Error: A library can't be used as an expression.");
     }
     for (final dynamic #t4 in x) {
       let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <dynamic>[], <dynamic>[#t4].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
       core::print(() → void);
     }
-    for (final dynamic #t5 = let dynamic _ = null in const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected lvalue, but got 1\n    for (1 in x) {\n         ^")) in x) {
+    for (final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected lvalue, but got 1\n    for (1 in x) {\n         ^" in x) {
       core::print(this.key);
     }
   }
@@ -38,14 +38,14 @@
     let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <dynamic>[], <dynamic>[#t7].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
     core::print(self::Fisk);
   }
-  for (final dynamic #t8 = let dynamic _ = null in const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: Expected lvalue, but got Instance of 'PrefixBuilder'\n  for (collection in arguments) {\n       ^")) in arguments) {
-    core::print(const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/unresolved_for_in.dart: Error: A library can't be used as an expression.")));
+  for (final dynamic #t8 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: Expected lvalue, but got Instance of 'PrefixBuilder'\n  for (collection in arguments) {\n       ^" in arguments) {
+    core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart: Error: A library can't be used as an expression.");
   }
   for (final dynamic #t9 in arguments) {
     let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <dynamic>[], <dynamic>[#t9].toList(growable: false), core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})));
     core::print(() → void);
   }
-  for (final dynamic #t10 = let dynamic _ = null in const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected lvalue, but got 1\n  for (1 in arguments) {\n       ^")) in arguments) {
+  for (final dynamic #t10 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected lvalue, but got 1\n  for (1 in arguments) {\n       ^" in arguments) {
     core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{}))));
   }
 }
diff --git a/pkg/front_end/testcases/regress/issue_29941.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29941.dart.direct.expect
index dc22e28..5cfc393 100644
--- a/pkg/front_end/testcases/regress/issue_29941.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29941.dart.direct.expect
@@ -1,9 +1,8 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method bad() → dynamic {
   dynamic a = "";
-  const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_29941.dart:7:5: Error: Expected an identifier, but got '\"\"'.\n  a.\"\";\n    ^"));
+  invalid-expression "pkg/front_end/testcases/regress/issue_29941.dart:7:5: Error: Expected an identifier, but got '\"\"'.\n  a.\"\";\n    ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29941.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29941.dart.strong.expect
index 999c91b..0be6765 100644
--- a/pkg/front_end/testcases/regress/issue_29941.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29941.dart.strong.expect
@@ -4,6 +4,6 @@
 
 static method bad() → dynamic {
   core::String a = "";
-  const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_29941.dart:7:5: Error: Expected an identifier, but got '\"\"'.\n  a.\"\";\n    ^"));
+  invalid-expression "pkg/front_end/testcases/regress/issue_29941.dart:7:5: Error: Expected an identifier, but got '\"\"'.\n  a.\"\";\n    ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29943.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29943.dart.direct.expect
index f3457c6..974f689 100644
--- a/pkg/front_end/testcases/regress/issue_29943.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29943.dart.direct.expect
@@ -1,8 +1,7 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method bad() → dynamic {
-  const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_29943.dart:6:5: Error: Expected an identifier, but got '('.\n  x.(null);\n    ^"));
+  invalid-expression "pkg/front_end/testcases/regress/issue_29943.dart:6:5: Error: Expected an identifier, but got '('.\n  x.(null);\n    ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29943.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29943.dart.strong.expect
index 8bafc43..974f689 100644
--- a/pkg/front_end/testcases/regress/issue_29943.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29943.dart.strong.expect
@@ -1,8 +1,7 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method bad() → dynamic {
-  const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_29943.dart:6:5: Error: Expected an identifier, but got '('.\n  x.(null);\n    ^"));
+  invalid-expression "pkg/front_end/testcases/regress/issue_29943.dart:6:5: Error: Expected an identifier, but got '('.\n  x.(null);\n    ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29983.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29983.dart.direct.expect
index 3cf4a03..340ebcf 100644
--- a/pkg/front_end/testcases/regress/issue_29983.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29983.dart.direct.expect
@@ -1,12 +1,11 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method f() → dynamic sync* {
-  const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_29983.dart:7:3: Error: 'sync*' and 'async*' can't return a value.\n  return missing;\n  ^"));
+  invalid-expression "pkg/front_end/testcases/regress/issue_29983.dart:7:3: Error: 'sync*' and 'async*' can't return a value.\n  return missing;\n  ^";
 }
 static method g() → dynamic sync* 
-  const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_29983.dart:11:14: Error: 'sync*' and 'async*' can't return a value.\ng() sync* => dummy;\n             ^"));
+  invalid-expression "pkg/front_end/testcases/regress/issue_29983.dart:11:14: Error: 'sync*' and 'async*' can't return a value.\ng() sync* => dummy;\n             ^";
 static method h() → dynamic sync* {
   (() → dynamic => "return").call();
 }
diff --git a/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
index 9690132..544ffb8 100644
--- a/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static method f() → dynamic sync* {
-  const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_29983.dart:7:3: Error: 'sync*' and 'async*' can't return a value.\n  return missing;\n  ^"));
+  invalid-expression "pkg/front_end/testcases/regress/issue_29983.dart:7:3: Error: 'sync*' and 'async*' can't return a value.\n  return missing;\n  ^";
 }
 static method g() → dynamic sync* 
-  const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_29983.dart:11:14: Error: 'sync*' and 'async*' can't return a value.\ng() sync* => dummy;\n             ^"));
+  invalid-expression "pkg/front_end/testcases/regress/issue_29983.dart:11:14: Error: 'sync*' and 'async*' can't return a value.\ng() sync* => dummy;\n             ^";
 static method h() → dynamic sync* {
   (() → core::String => "return").call();
 }
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect
index 3c1d7c5..6dd3ecf 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect
@@ -1,10 +1,9 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Previous use of 'i'.\n  for (int i = i;; false) {}\n               ^"]/* from null */;
 static method bad() → dynamic {
-  for (final dynamic #t1 = const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.\n  for (int i = i;; false) {}\n           ^")); ; false) {
+  for (final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.\n  for (int i = i;; false) {}\n           ^"; ; false) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
index e52d320..6dd3ecf 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
@@ -1,10 +1,9 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Previous use of 'i'.\n  for (int i = i;; false) {}\n               ^"]/* from null */;
 static method bad() → dynamic {
-  for (final dynamic #t1 = const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.\n  for (int i = i;; false) {}\n           ^")); ; false) {
+  for (final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.\n  for (int i = i;; false) {}\n           ^"; ; false) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31157.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31157.dart.direct.expect
index e6d2919..6e85a5c 100644
--- a/pkg/front_end/testcases/regress/issue_31157.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31157.dart.direct.expect
@@ -1,8 +1,7 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method bad() → dynamic {
-  return const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31157.dart:6:16: Error: Expected an identifier, but got '('.\n  return null?.(1);\n               ^"));
+  return invalid-expression "pkg/front_end/testcases/regress/issue_31157.dart:6:16: Error: Expected an identifier, but got '('.\n  return null?.(1);\n               ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31157.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31157.dart.strong.expect
index f4e5fc3..6e85a5c 100644
--- a/pkg/front_end/testcases/regress/issue_31157.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31157.dart.strong.expect
@@ -1,8 +1,7 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method bad() → dynamic {
-  return const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31157.dart:6:16: Error: Expected an identifier, but got '('.\n  return null?.(1);\n               ^"));
+  return invalid-expression "pkg/front_end/testcases/regress/issue_31157.dart:6:16: Error: Expected an identifier, but got '('.\n  return null?.(1);\n               ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31180.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31180.dart.direct.expect
index 0bf317f..2d0fca7 100644
--- a/pkg/front_end/testcases/regress/issue_31180.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31180.dart.direct.expect
@@ -1,8 +1,7 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method bad() → dynamic {
-  return const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31180.dart:6:16: Error: Expected an identifier, but got '['.\n  return null?.[1];\n               ^"));
+  return invalid-expression "pkg/front_end/testcases/regress/issue_31180.dart:6:16: Error: Expected an identifier, but got '['.\n  return null?.[1];\n               ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31180.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31180.dart.strong.expect
index 98db547..2d0fca7 100644
--- a/pkg/front_end/testcases/regress/issue_31180.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31180.dart.strong.expect
@@ -1,8 +1,7 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method bad() → dynamic {
-  return const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31180.dart:6:16: Error: Expected an identifier, but got '['.\n  return null?.[1];\n               ^"));
+  return invalid-expression "pkg/front_end/testcases/regress/issue_31180.dart:6:16: Error: Expected an identifier, but got '['.\n  return null?.[1];\n               ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
index 46417cd..7175ccd 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
@@ -4,7 +4,7 @@
 
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected ';' before this.\n  for (int i = 0, i > 10; i++) {}\n                    ^", "pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected an identifier, but got '>'.\n  for (int i = 0, i > 10; i++) {}\n                    ^"]/* from null */;
 static method bad() → dynamic {
-  for (core::int i = 0, final dynamic #t1 = const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' already declared in this scope.\n  for (int i = 0, i > 10; i++) {}\n                  ^")); (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})))).>(10); i = i.+(1)) {
+  for (core::int i = 0, final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' already declared in this scope.\n  for (int i = 0, i > 10; i++) {}\n                  ^"; (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})))).>(10); i = i.+(1)) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
index 2636284..0177011 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
@@ -4,7 +4,7 @@
 
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected ';' before this.\n  for (int i = 0, i > 10; i++) {}\n                    ^", "pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected an identifier, but got '>'.\n  for (int i = 0, i > 10; i++) {}\n                    ^"]/* from null */;
 static method bad() → dynamic {
-  for (core::int i = 0, final dynamic #t1 = const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' already declared in this scope.\n  for (int i = 0, i > 10; i++) {}\n                  ^")); (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})))).>(10) as{TypeError} core::bool; i = i.{core::num::+}(1)) {
+  for (core::int i = 0, final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' already declared in this scope.\n  for (int i = 0, i > 10; i++) {}\n                  ^"; (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 33, const <dynamic>[], const <dynamic>[], core::Map::unmodifiable<dynamic, dynamic>(const <dynamic, dynamic>{})))).>(10) as{TypeError} core::bool; i = i.{core::num::+}(1)) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31186.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31186.dart.direct.expect
index c888cdc..dc53dd7 100644
--- a/pkg/front_end/testcases/regress/issue_31186.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31186.dart.direct.expect
@@ -1,8 +1,7 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method bad() → dynamic {
-  return const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31186.dart:6:16: Error: Expected an identifier, but got 'true'.\n  return null?.true;\n               ^"));
+  return invalid-expression "pkg/front_end/testcases/regress/issue_31186.dart:6:16: Error: Expected an identifier, but got 'true'.\n  return null?.true;\n               ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31186.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31186.dart.strong.expect
index b576812..dc53dd7 100644
--- a/pkg/front_end/testcases/regress/issue_31186.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31186.dart.strong.expect
@@ -1,8 +1,7 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method bad() → dynamic {
-  return const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31186.dart:6:16: Error: Expected an identifier, but got 'true'.\n  return null?.true;\n               ^"));
+  return invalid-expression "pkg/front_end/testcases/regress/issue_31186.dart:6:16: Error: Expected an identifier, but got 'true'.\n  return null?.true;\n               ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31187.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31187.dart.direct.expect
index b572c76..288ffbf 100644
--- a/pkg/front_end/testcases/regress/issue_31187.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31187.dart.direct.expect
@@ -1,8 +1,7 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method bad() → dynamic {
-  return const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31187.dart:6:16: Error: Expected an identifier, but got '1'.\n  return null?.1;\n               ^"));
+  return invalid-expression "pkg/front_end/testcases/regress/issue_31187.dart:6:16: Error: Expected an identifier, but got '1'.\n  return null?.1;\n               ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31187.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31187.dart.strong.expect
index 3ec70a0..288ffbf 100644
--- a/pkg/front_end/testcases/regress/issue_31187.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31187.dart.strong.expect
@@ -1,8 +1,7 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method bad() → dynamic {
-  return const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31187.dart:6:16: Error: Expected an identifier, but got '1'.\n  return null?.1;\n               ^"));
+  return invalid-expression "pkg/front_end/testcases/regress/issue_31187.dart:6:16: Error: Expected an identifier, but got '1'.\n  return null?.1;\n               ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31192.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31192.dart.direct.expect
index 0177799..a3c7dee 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.direct.expect
@@ -5,6 +5,6 @@
 class Increment extends core::Object {
   field core::int x = null;
   constructor •() → void
-    : final dynamic #t1 = const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31192.dart:7:18: Error: Not a valid initializer.\nTo initialize a field, use the syntax 'name = value'.\n  Increment() : x++ {}\n                 ^")) {}
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31192.dart:7:18: Error: Not a valid initializer.\nTo initialize a field, use the syntax 'name = value'.\n  Increment() : x++ {}\n                 ^" {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31192.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31192.dart.strong.expect
index e570872..a3c7dee 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.strong.expect
@@ -5,6 +5,6 @@
 class Increment extends core::Object {
   field core::int x = null;
   constructor •() → void
-    : final dynamic #t1 = const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31192.dart:7:18: Error: Not a valid initializer.\nTo initialize a field, use the syntax 'name = value'.\n  Increment() : x++ {}\n                 ^")) {}
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31192.dart:7:18: Error: Not a valid initializer.\nTo initialize a field, use the syntax 'name = value'.\n  Increment() : x++ {}\n                 ^" {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31198.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31198.dart.direct.expect
index 072b91b..7a0c1f5 100644
--- a/pkg/front_end/testcases/regress/issue_31198.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.direct.expect
@@ -9,7 +9,7 @@
 }
 class B extends self::A {
   constructor •() → void
-    : final dynamic #t1 = const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31198.dart:8:8: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n  B(): super().foo() {}\n       ^")).foo() {}
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31198.dart:8:8: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n  B(): super().foo() {}\n       ^".foo() {}
 }
 static method bad() → dynamic {
   new self::B::•();
diff --git a/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect
index ad0da2f..7a0c1f5 100644
--- a/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect
@@ -9,7 +9,7 @@
 }
 class B extends self::A {
   constructor •() → void
-    : final dynamic #t1 = const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31198.dart:8:8: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n  B(): super().foo() {}\n       ^")).foo() {}
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31198.dart:8:8: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n  B(): super().foo() {}\n       ^".foo() {}
 }
 static method bad() → dynamic {
   new self::B::•();
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
index 8f3f8c1..b817868 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
@@ -8,7 +8,7 @@
     ;
   method f<generic-covariant-impl generic-covariant-interface U extends self::C::T>(self::C::f::U x) → void {}
   method g1<generic-covariant-impl generic-covariant-interface U extends self::C::T>() → void {
-    this.{self::C::f}<self::C::g1::U>(let final dynamic #t1 = 1.5 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:35: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::C::g1::U'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::C::g1::U'.\n    this.f<U> /*@callKind=this*/ (1.5);\n                                  ^")));
+    this.{self::C::f}<self::C::g1::U>(let final dynamic #t1 = 1.5 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:35: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::C::g1::U'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::C::g1::U'.\n    this.f<U> /*@callKind=this*/ (1.5);\n                                  ^");
   }
 }
 static method g2(self::C<core::Object> c) → void {
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
index 6653026..ef697c2 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
@@ -41,11 +41,11 @@
   return 2;
 static method main() → void {
   self::D d = new self::D::•(new self::C::•<core::num>(self::numToInt));
-  let final self::D #t1 = d in #t1.{self::D::value} = let final dynamic #t2 = #t1.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:50:41: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::int'.\n  d.value /*@checkReturn=(num) -> num*/ += 1;\n                                        ^"));
+  let final self::D #t1 = d in #t1.{self::D::value} = let final dynamic #t2 = #t1.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:50:41: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::int'.\n  d.value /*@checkReturn=(num) -> num*/ += 1;\n                                        ^";
   self::expect(d.{self::D::setValue}(0), 1);
   d = new self::D::•(new self::C::•<core::num>(self::numToNum));
   self::expectTypeError(() → core::Null {
-    let final self::D #t3 = d in #t3.{self::D::value} = let final dynamic #t4 = #t3.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:54:43: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::int'.\n    d.value /*@checkReturn=(num) -> num*/ += 1;\n                                          ^"));
+    let final self::D #t3 = d in #t3.{self::D::value} = let final dynamic #t4 = #t3.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:54:43: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::int'.\n    d.value /*@checkReturn=(num) -> num*/ += 1;\n                                          ^";
   });
   self::expect(d.{self::D::setValue}, null);
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
index b614d43..212456e 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
@@ -19,9 +19,9 @@
   set x(self::B<(self::C::T) → void> value) → void {}
 }
 static method test(self::C<core::num> c) → void {
-  let final self::C<core::num> #t1 = c in #t1.{self::C::x} = (#t1.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final dynamic #t2 = new self::B::•<core::num>() in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:49: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.\n  c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();\n                                                ^")));
-  self::B<(core::num) → void> y = let final self::C<core::num> #t3 = c in #t3.{self::C::x} = (#t3.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final dynamic #t4 = new self::B::•<core::num>() in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:57: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.\n  var y = c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();\n                                                        ^")));
-  let final self::C<core::num> #t5 = c in (#t5.{self::C::x} as{TypeError} self::B<(core::num) → void>).{core::Object::==}(null) ?{self::B<core::Object>} #t5.{self::C::x} = let final dynamic #t6 = new self::B::•<core::num>() in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:50: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.\n  c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();\n                                                 ^")) : null;
-  self::B<core::Object> z = let final self::C<core::num> #t7 = c in let final dynamic #t8 = #t7.{self::C::x} as{TypeError} self::B<(core::num) → void> in #t8.{core::Object::==}(null) ?{self::B<core::Object>} #t7.{self::C::x} = let final dynamic #t9 = new self::B::•<core::num>() in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:24:58: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.\n  var z = c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();\n                                                         ^")) : #t8;
+  let final self::C<core::num> #t1 = c in #t1.{self::C::x} = (#t1.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final dynamic #t2 = new self::B::•<core::num>() in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:49: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.\n  c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();\n                                                ^");
+  self::B<(core::num) → void> y = let final self::C<core::num> #t3 = c in #t3.{self::C::x} = (#t3.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final dynamic #t4 = new self::B::•<core::num>() in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:57: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.\n  var y = c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();\n                                                        ^");
+  let final self::C<core::num> #t5 = c in (#t5.{self::C::x} as{TypeError} self::B<(core::num) → void>).{core::Object::==}(null) ?{self::B<core::Object>} #t5.{self::C::x} = let final dynamic #t6 = new self::B::•<core::num>() in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:50: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.\n  c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();\n                                                 ^" : null;
+  self::B<core::Object> z = let final self::C<core::num> #t7 = c in let final dynamic #t8 = #t7.{self::C::x} as{TypeError} self::B<(core::num) → void> in #t8.{core::Object::==}(null) ?{self::B<core::Object>} #t7.{self::C::x} = let final dynamic #t9 = new self::B::•<core::num>() in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:24:58: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.\nTry changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.\n  var z = c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();\n                                                         ^" : #t8;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index b92e4f8..abc2724 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -41,6 +41,9 @@
 null_aware: Fail
 operators: Fail
 optional: Fail
+override_check_after_inference: TypeCheckError # Issue #31620
+override_check_basic: TypeCheckError # Issue #31620
+override_check_with_covariant_modifier: TypeCheckError # Issue #31620
 platform: Fail
 prefer_baseclass: Fail
 redirecting_constructor: Fail
@@ -102,7 +105,7 @@
 inference/infer_type_regardless_of_declaration_order_or_cycles: RuntimeError
 inference/infer_types_on_generic_instantiations_4: RuntimeError
 inference/infer_types_on_generic_instantiations_infer: TypeCheckError
-inference/instantiate_tearoff_of_call: TypeCheckError
+inference/instantiate_tearoff_of_call: Fail # Issue #31746
 inference/instantiate_to_bounds_generic_has_bound_defined_after transform: RuntimeError
 inference/unresolved_super: TypeCheckError
 inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1: Fail # Issue #25824
diff --git a/pkg/front_end/testcases/super_call.dart.direct.expect b/pkg/front_end/testcases/super_call.dart.direct.expect
index b526f3a0..39a17a6 100644
--- a/pkg/front_end/testcases/super_call.dart.direct.expect
+++ b/pkg/front_end/testcases/super_call.dart.direct.expect
@@ -16,7 +16,7 @@
   method call(core::int x) → core::int
     return x.*(3);
   method call_super() → core::int {
-    return const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/super_call.dart:14:12: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n    return super(5);\n           ^"));
+    return invalid-expression "pkg/front_end/testcases/super_call.dart:14:12: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n    return super(5);\n           ^";
   }
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/super_call.dart.strong.expect b/pkg/front_end/testcases/super_call.dart.strong.expect
index 3c4e3e0..31219d0 100644
--- a/pkg/front_end/testcases/super_call.dart.strong.expect
+++ b/pkg/front_end/testcases/super_call.dart.strong.expect
@@ -16,7 +16,7 @@
   method call(core::int x) → core::int
     return x.{core::num::*}(3);
   method call_super() → core::int {
-    return const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/super_call.dart:14:12: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n    return super(5);\n           ^")) as{TypeError} core::int;
+    return invalid-expression "pkg/front_end/testcases/super_call.dart:14:12: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n    return super(5);\n           ^" as{TypeError} core::int;
   }
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
index d809ae2..3460d49 100644
--- a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
+++ b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
@@ -95,8 +95,8 @@
     self::use(let final dynamic #t17 = super.{self::A::i} in let final dynamic #t18 = super.{self::B::i} = #t17.+(1) in #t17);
     let final core::int #t19 = 87 in super.{self::A::[]=}(#t19, super.{self::A::[]}(#t19).+(1));
     self::use(let final core::int #t20 = 87 in let final dynamic #t21 = super.{self::A::[]}(#t20) in let final void #t22 = super.{self::A::[]=}(#t20, #t21.+(1)) in #t21);
-    super.m = let final dynamic #t23 = super.{self::A::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/super_rasta_copy.dart:91:12: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    super.m++;\n           ^"));
-    self::use(let final () → void #t24 = super.{self::A::m} in let final dynamic #t25 = super.m = let final dynamic #t26 = #t24 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/super_rasta_copy.dart:92:16: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(super.m++);\n               ^")) in #t24);
+    super.m = let final dynamic #t23 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:91:12: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    super.m++;\n           ^";
+    self::use(let final () → void #t24 = super.{self::A::m} in let final dynamic #t25 = super.m = let final dynamic #t26 = #t24 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:92:16: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(super.m++);\n               ^" in #t24);
     super.{self::A::a} = super.{self::A::a}.+(1);
     self::use(super.{self::A::a} = super.{self::A::a}.+(1));
     super.{self::A::b} = super.{self::B::b}.+(1);
@@ -117,8 +117,8 @@
     self::use(super.{self::B::i} = super.{self::A::i}.+(1));
     let final core::int #t27 = 87 in let final dynamic #t28 = super.{self::A::[]}(#t27).+(1) in let final void #t29 = super.{self::A::[]=}(#t27, #t28) in #t28;
     self::use(let final core::int #t30 = 87 in let final dynamic #t31 = super.{self::A::[]}(#t30).+(1) in let final void #t32 = super.{self::A::[]=}(#t30, #t31) in #t31);
-    super.m = let final dynamic #t33 = super.{self::A::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/super_rasta_copy.dart:114:5: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    ++super.m;\n    ^"));
-    self::use(super.m = let final dynamic #t34 = super.{self::A::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/super_rasta_copy.dart:115:9: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(++super.m);\n        ^")));
+    super.m = let final dynamic #t33 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:114:5: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    ++super.m;\n    ^";
+    self::use(super.m = let final dynamic #t34 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:115:9: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(++super.m);\n        ^");
     super.{self::A::a}.call();
     self::use(super.{self::A::a}.call());
     super.{self::B::b}.call();
@@ -207,8 +207,8 @@
     self::use(super.{self::B::i} = super.{self::A::i}.+(42));
     let final core::int #t55 = 87 in super.{self::A::[]=}(#t55, super.{self::A::[]}(#t55).+(42));
     self::use(let final core::int #t56 = 87 in let final dynamic #t57 = super.{self::A::[]}(#t56).+(42) in let final void #t58 = super.{self::A::[]=}(#t56, #t57) in #t57);
-    super.m = let final dynamic #t59 = super.{self::A::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/super_rasta_copy.dart:208:13: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    super.m += 42;\n            ^"));
-    self::use(super.m = let final dynamic #t60 = super.{self::A::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/super_rasta_copy.dart:209:17: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(super.m += 42);\n                ^")));
+    super.m = let final dynamic #t59 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:208:13: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    super.m += 42;\n            ^";
+    self::use(super.m = let final dynamic #t60 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:209:17: Error: The method '+' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '+'.\n    use(super.m += 42);\n                ^");
     super.{self::A::a} = super.{self::A::a}.-(42);
     self::use(super.{self::A::a} = super.{self::A::a}.-(42));
     super.{self::A::b} = super.{self::B::b}.-(42);
@@ -229,8 +229,8 @@
     self::use(super.{self::B::i} = super.{self::A::i}.-(42));
     let final core::int #t61 = 87 in super.{self::A::[]=}(#t61, super.{self::A::[]}(#t61).-(42));
     self::use(let final core::int #t62 = 87 in let final dynamic #t63 = super.{self::A::[]}(#t62).-(42) in let final void #t64 = super.{self::A::[]=}(#t62, #t63) in #t63);
-    super.m = let final dynamic #t65 = super.{self::A::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/super_rasta_copy.dart:231:13: Error: The method '-' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '-'.\n    super.m -= 42;\n            ^"));
-    self::use(super.m = let final dynamic #t66 = super.{self::A::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/super_rasta_copy.dart:232:17: Error: The method '-' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '-'.\n    use(super.m -= 42);\n                ^")));
+    super.m = let final dynamic #t65 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:231:13: Error: The method '-' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '-'.\n    super.m -= 42;\n            ^";
+    self::use(super.m = let final dynamic #t66 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:232:17: Error: The method '-' isn't defined for the class '() \u8594 void'.\nTry correcting the name to the name of an existing method, or defining a method named '-'.\n    use(super.m -= 42);\n                ^");
   }
 }
 static method use(dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect b/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
index d1fddfc..2d5d17c 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
@@ -7,9 +7,9 @@
     : super core::Object::•()
     ;
   method method() → invalid-type
-    return let final dynamic #t1 = "Hello, World!" in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'invalid-type'.\nTry changing the type of the left hand side, or casting the right hand side to 'invalid-type'.\n  T.String method() => \"Hello, World!\";\n                       ^"));
+    return let final dynamic #t1 = "Hello, World!" in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'invalid-type'.\nTry changing the type of the left hand side, or casting the right hand side to 'invalid-type'.\n  T.String method() => \"Hello, World!\";\n                       ^";
 }
 static method main() → dynamic {
-  core::String s = let final dynamic #t2 = new self::C::•<dynamic>().{self::C::method}() in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  T.String s = new C().method();\n                       ^"));
+  core::String s = let final dynamic #t2 = new self::C::•<dynamic>().{self::C::method}() in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'dart.core::String'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.\n  T.String s = new C().method();\n                       ^";
   core::print(s);
 }
diff --git a/pkg/front_end/testcases/undefined.dart.strong.expect b/pkg/front_end/testcases/undefined.dart.strong.expect
index 4562a4e..e05b21c 100644
--- a/pkg/front_end/testcases/undefined.dart.strong.expect
+++ b/pkg/front_end/testcases/undefined.dart.strong.expect
@@ -11,10 +11,10 @@
 }
 static method test(self::C c) → void {
   c.{self::C::x};
-  let final dynamic #t1 = c in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/undefined.dart:14:33: Error: The getter 'y' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named 'y'.\n  c. /*@error=UndefinedGetter*/ y;\n                                ^"));
+  let final dynamic #t1 = c in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/undefined.dart:14:33: Error: The getter 'y' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named 'y'.\n  c. /*@error=UndefinedGetter*/ y;\n                                ^";
   c.{self::C::f}();
-  let final dynamic #t2 = c in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/undefined.dart:16:33: Error: The method 'g' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing method, or defining a method named 'g'.\n  c. /*@error=UndefinedMethod*/ g();\n                                ^"));
+  let final dynamic #t2 = c in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/undefined.dart:16:33: Error: The method 'g' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing method, or defining a method named 'g'.\n  c. /*@error=UndefinedMethod*/ g();\n                                ^";
   c.{self::C::x} = null;
-  let final dynamic #t3 = c in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/undefined.dart:18:33: Error: The setter 'y' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing setter, or defining a setter or field named 'y'.\n  c. /*@error=UndefinedSetter*/ y = null;\n                                ^"));
+  let final dynamic #t3 = c in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/undefined.dart:18:33: Error: The setter 'y' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing setter, or defining a setter or field named 'y'.\n  c. /*@error=UndefinedSetter*/ y = null;\n                                ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
index 3d93d26..7a86cc9 100644
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
+++ b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
@@ -10,7 +10,7 @@
 }
 static method test(self::C c) → void {
   c.{self::C::x} = 1;
-  let final self::C #t1 = c in #t1.{self::C::x} = (let final dynamic #t2 = #t1 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:13:33: Error: The getter 'x' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named 'x'.\n  c. /*@error=UndefinedGetter*/ x += 1;\n                                ^"))).+(1);
-  let final self::C #t3 = c in (let final dynamic #t4 = #t3 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:14:33: Error: The getter 'x' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named 'x'.\n  c. /*@error=UndefinedGetter*/ x ??= 1;\n                                ^"))).{core::Object::==}(null) ?{dynamic} #t3.{self::C::x} = 1 : null;
+  let final self::C #t1 = c in #t1.{self::C::x} = (let final dynamic #t2 = #t1 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:13:33: Error: The getter 'x' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named 'x'.\n  c. /*@error=UndefinedGetter*/ x += 1;\n                                ^").+(1);
+  let final self::C #t3 = c in (let final dynamic #t4 = #t3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:14:33: Error: The getter 'x' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named 'x'.\n  c. /*@error=UndefinedGetter*/ x ??= 1;\n                                ^").{core::Object::==}(null) ?{dynamic} #t3.{self::C::x} = 1 : null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/warn_unresolved_sends.dart.strong.expect b/pkg/front_end/testcases/warn_unresolved_sends.dart.strong.expect
index aac9d0a..1668b95 100644
--- a/pkg/front_end/testcases/warn_unresolved_sends.dart.strong.expect
+++ b/pkg/front_end/testcases/warn_unresolved_sends.dart.strong.expect
@@ -45,12 +45,12 @@
     this.{self::D::setterOnly} = 0;
     this.{self::D::getterOnly};
     this.{self::C::getterOnly} = 0;
-    let final dynamic #t1 = this in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/warn_unresolved_sends.dart:49:39: Error: The getter 'missingField' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named 'missingField'.\n    this. /*@warning=GetterNotFound*/ missingField;\n                                      ^"));
-    let final dynamic #t2 = this in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/warn_unresolved_sends.dart:50:39: Error: The setter 'missingField' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing setter, or defining a setter or field named 'missingField'.\n    this. /*@warning=SetterNotFound*/ missingField = 0;\n                                      ^"));
-    let final dynamic #t3 = this in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/warn_unresolved_sends.dart:51:39: Error: The method 'missingMethod' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing method, or defining a method named 'missingMethod'.\n    this. /*@warning=MethodNotFound*/ missingMethod();\n                                      ^"));
-    let final dynamic #t4 = this in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/warn_unresolved_sends.dart:53:33: Error: The getter 'missingField' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named 'missingField'.\n    /*@warning=GetterNotFound*/ missingField;\n                                ^"));
-    let final dynamic #t5 = this in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/warn_unresolved_sends.dart:54:33: Error: The setter 'missingField' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing setter, or defining a setter or field named 'missingField'.\n    /*@warning=SetterNotFound*/ missingField = 0;\n                                ^"));
-    let final dynamic #t6 = this in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/warn_unresolved_sends.dart:55:33: Error: The method 'missingMethod' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing method, or defining a method named 'missingMethod'.\n    /*@warning=MethodNotFound*/ missingMethod();\n                                ^"));
+    let final dynamic #t1 = this in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/warn_unresolved_sends.dart:49:39: Error: The getter 'missingField' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named 'missingField'.\n    this. /*@warning=GetterNotFound*/ missingField;\n                                      ^";
+    let final dynamic #t2 = this in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/warn_unresolved_sends.dart:50:39: Error: The setter 'missingField' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing setter, or defining a setter or field named 'missingField'.\n    this. /*@warning=SetterNotFound*/ missingField = 0;\n                                      ^";
+    let final dynamic #t3 = this in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/warn_unresolved_sends.dart:51:39: Error: The method 'missingMethod' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing method, or defining a method named 'missingMethod'.\n    this. /*@warning=MethodNotFound*/ missingMethod();\n                                      ^";
+    let final dynamic #t4 = this in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/warn_unresolved_sends.dart:53:33: Error: The getter 'missingField' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named 'missingField'.\n    /*@warning=GetterNotFound*/ missingField;\n                                ^";
+    let final dynamic #t5 = this in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/warn_unresolved_sends.dart:54:33: Error: The setter 'missingField' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing setter, or defining a setter or field named 'missingField'.\n    /*@warning=SetterNotFound*/ missingField = 0;\n                                ^";
+    let final dynamic #t6 = this in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/warn_unresolved_sends.dart:55:33: Error: The method 'missingMethod' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing method, or defining a method named 'missingMethod'.\n    /*@warning=MethodNotFound*/ missingMethod();\n                                ^";
   }
 }
 class E extends self::D {
diff --git a/pkg/front_end/tool/perf_common.dart b/pkg/front_end/tool/perf_common.dart
index e55fcf7..5599fc0 100644
--- a/pkg/front_end/tool/perf_common.dart
+++ b/pkg/front_end/tool/perf_common.dart
@@ -27,6 +27,8 @@
 final whitelistMessageCode = new Set<String>.from(<String>[
   // Code names in this list should match the key used in messages.yaml
   codeInvalidAssignment.name,
+  codeOverrideTypeMismatchParameter.name,
+  codeOverriddenMethodCause.name,
 
   // The following errors are not covered by unit tests in the SDK repo because
   // they are only seen today in the flutter-gallery benchmark (external to
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index b014ea7..848fa2f 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -468,6 +468,8 @@
 
 type InvalidExpression extends Expression {
   Byte tag = 19;
+  FileOffset fileOffset;
+  StringReference message;
 }
 
 type VariableGet extends Expression {
@@ -908,10 +910,6 @@
 
 abstract type Statement extends Node {}
 
-type InvalidStatement extends Statement {
-  Byte tag = 60;
-}
-
 type ExpressionStatement extends Statement {
   Byte tag = 61;
   Expression expression;
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 9300ef0..e655f93 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -2041,6 +2041,10 @@
 ///
 /// Should throw a runtime error when evaluated.
 class InvalidExpression extends Expression {
+  String message;
+
+  InvalidExpression(this.message);
+
   DartType getStaticType(TypeEnvironment types) => const BottomType();
 
   accept(ExpressionVisitor v) => v.visitInvalidExpression(this);
@@ -3722,17 +3726,6 @@
   accept1(StatementVisitor1 v, arg);
 }
 
-/// A statement with a compile-time error.
-///
-/// Should throw an exception at runtime.
-class InvalidStatement extends Statement {
-  accept(StatementVisitor v) => v.visitInvalidStatement(this);
-  accept1(StatementVisitor1 v, arg) => v.visitInvalidStatement(this, arg);
-
-  visitChildren(Visitor v) {}
-  transformChildren(Transformer v) {}
-}
-
 @coq
 class ExpressionStatement extends Statement {
   Expression expression;
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 4dcd262..be7788c 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -1155,7 +1155,9 @@
       case Tag.CheckLibraryIsLoaded:
         return new CheckLibraryIsLoaded(readLibraryDependencyReference());
       case Tag.InvalidExpression:
-        return new InvalidExpression();
+        int offset = readOffset();
+        return new InvalidExpression(readStringOrNullIfEmpty())
+          ..fileOffset = offset;
       case Tag.VariableGet:
         int offset = readOffset();
         readUInt(); // offset of the variable declaration in the binary.
@@ -1434,8 +1436,6 @@
   Statement readStatement() {
     int tag = readByte();
     switch (tag) {
-      case Tag.InvalidStatement:
-        return new InvalidStatement();
       case Tag.ExpressionStatement:
         return new ExpressionStatement(readExpression());
       case Tag.Block:
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index b9b8c99..38fbba4 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -870,6 +870,8 @@
 
   visitInvalidExpression(InvalidExpression node) {
     writeByte(Tag.InvalidExpression);
+    writeOffset(node.fileOffset);
+    writeStringReference(node.message ?? '');
   }
 
   visitVariableGet(VariableGet node) {
@@ -1243,10 +1245,6 @@
     }
   }
 
-  visitInvalidStatement(InvalidStatement node) {
-    writeByte(Tag.InvalidStatement);
-  }
-
   visitExpressionStatement(ExpressionStatement node) {
     writeByte(Tag.ExpressionStatement);
     writeNode(node.expression);
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index 3910e5f..2380ad9 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -71,7 +71,6 @@
   static const int ConstListLiteral = 58;
   static const int ConstMapLiteral = 59;
 
-  static const int InvalidStatement = 60;
   static const int ExpressionStatement = 61;
   static const int Block = 62;
   static const int EmptyStatement = 63;
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index d54f44a..420a756 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -60,7 +60,9 @@
     return type == null ? null : substitute(type, typeSubstitution);
   }
 
-  visitInvalidExpression(InvalidExpression node) => new InvalidExpression();
+  visitInvalidExpression(InvalidExpression node) {
+    return new InvalidExpression(node.message);
+  }
 
   visitVariableGet(VariableGet node) {
     return new VariableGet(
@@ -267,11 +269,6 @@
     return new VectorCopy(clone(node.vectorExpression));
   }
 
-  // Statements
-  visitInvalidStatement(InvalidStatement node) {
-    return new InvalidStatement();
-  }
-
   visitExpressionStatement(ExpressionStatement node) {
     return new ExpressionStatement(clone(node.expression));
   }
diff --git a/pkg/kernel/lib/frontend/accessors.dart b/pkg/kernel/lib/frontend/accessors.dart
index 0c15bc3..e132d55 100644
--- a/pkg/kernel/lib/frontend/accessors.dart
+++ b/pkg/kernel/lib/frontend/accessors.dart
@@ -128,14 +128,13 @@
   Expression _finish(Expression body) => body;
 
   /// Returns an [Expression] representing a compile-time error.
-  ///
-  /// At runtime, an exception will be thrown.
-  makeInvalidRead() => new InvalidExpression();
+  makeInvalidRead() => new InvalidExpression(null);
 
   /// Returns an [Expression] representing a compile-time error wrapping
   /// [value].
   ///
-  /// At runtime, [value] will be evaluated before throwing an exception.
+  /// The expression will be a compile-time error but will contain [value] as a
+  /// subexpression before the compile-time error.
   makeInvalidWrite(Expression value) => wrapInvalid(value);
 }
 
@@ -506,5 +505,6 @@
 }
 
 Expression wrapInvalid(Expression e) {
-  return new Let(new VariableDeclaration.forValue(e), new InvalidExpression());
+  return new Let(
+      new VariableDeclaration.forValue(e), new InvalidExpression(null));
 }
diff --git a/pkg/kernel/lib/interpreter/interpreter.dart b/pkg/kernel/lib/interpreter/interpreter.dart
index 25fa8c11..ef47e93 100644
--- a/pkg/kernel/lib/interpreter/interpreter.dart
+++ b/pkg/kernel/lib/interpreter/interpreter.dart
@@ -1711,11 +1711,6 @@
         m: "Execution is not implemented for statement:\n$node ");
   }
 
-  Configuration visitInvalidStatement(
-      InvalidStatement node, ExecConfiguration conf) {
-    throw "Invalid statement at ${node.location}";
-  }
-
   Configuration visitExpressionStatement(
       ExpressionStatement node, ExecConfiguration conf) {
     var cont = new ExpressionEK(conf.state.continuation, conf.environment);
diff --git a/pkg/kernel/lib/kernel.dart b/pkg/kernel/lib/kernel.dart
index 48af8f4..e3c04e1 100644
--- a/pkg/kernel/lib/kernel.dart
+++ b/pkg/kernel/lib/kernel.dart
@@ -66,9 +66,15 @@
 }
 
 void writeProgramToText(Program program,
-    {String path, bool showExternal: false, bool showOffsets: false}) {
+    {String path,
+    bool showExternal: false,
+    bool showOffsets: false,
+    bool showMetadata: false}) {
   StringBuffer buffer = new StringBuffer();
-  new Printer(buffer, showExternal: showExternal, showOffsets: showOffsets)
+  new Printer(buffer,
+          showExternal: showExternal,
+          showOffsets: showOffsets,
+          showMetadata: showMetadata)
       .writeProgramFile(program);
   if (path == null) {
     print(buffer);
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index d22a14e..342757e 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -72,6 +72,16 @@
   /// promotion do not slow down compilation too much.
   bool get disableTypeInference => false;
 
+  /// Perform target-specific transformations on the outlines stored in
+  /// [Program] when generating summaries.
+  ///
+  /// This transformation is used to add metadata on outlines and to filter
+  /// unnecessary information before generating program summaries. This
+  /// transformation is not applied when compiling full kernel programs to
+  /// prevent affecting the internal invariants of the compiler and accidentally
+  /// slowing down compilation.
+  void performOutlineTransformations(Program program) {}
+
   /// Perform target-specific modular transformations on the given program.
   ///
   /// These transformations should not be whole-program transformations.  They
@@ -169,33 +179,14 @@
   /// Builds an expression that throws [error] as compile-time error. The
   /// target must be able to handle this expression in a constant expression.
   Expression throwCompileConstantError(CoreTypes coreTypes, Expression error) {
-    // This method returns `const _ConstantExpressionError()._throw(error)`.
-    int offset = error.fileOffset;
-    var receiver = new ConstructorInvocation(
-        coreTypes.constantExpressionErrorDefaultConstructor,
-        new Arguments.empty()..fileOffset = offset,
-        isConst: true)
-      ..fileOffset = offset;
-    var methodInvocation = new MethodInvocation(
-        receiver,
-        new Name("_throw", coreTypes.coreLibrary),
-        new Arguments(<Expression>[error])..fileOffset = error.fileOffset)
-      ..fileOffset = offset;
-    if (strongMode) {
-      methodInvocation.interfaceTarget = coreTypes.constantExpressionErrorThrow;
-    }
-    return methodInvocation;
+    return error;
   }
 
   /// Builds an expression that represents a compile-time error which is
   /// suitable for being passed to [throwCompileConstantError].
   Expression buildCompileTimeError(
       CoreTypes coreTypes, String message, int offset) {
-    return new ConstructorInvocation(
-        coreTypes.compileTimeErrorDefaultConstructor,
-        new Arguments(<Expression>[new StringLiteral(message)])
-          ..fileOffset = offset)
-      ..fileOffset = offset;
+    return new InvalidExpression(message)..fileOffset = offset;
   }
 
   String toString() => 'Target($name)';
@@ -218,7 +209,7 @@
   @override
   Expression instantiateInvocation(CoreTypes coreTypes, Expression receiver,
       String name, Arguments arguments, int offset, bool isSuper) {
-    return new InvalidExpression();
+    return new InvalidExpression(null);
   }
 
   @override
@@ -234,6 +225,6 @@
       bool isStatic: false,
       bool isConstructor: false,
       bool isTopLevel: false}) {
-    return new InvalidExpression();
+    return new InvalidExpression(null);
   }
 }
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 449301e..0218fe3 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -222,11 +222,13 @@
   final NameSystem syntheticNames;
   final StringSink sink;
   final Annotator annotator;
+  final Map<String, MetadataRepository<dynamic>> metadata;
   ImportTable importTable;
   int indentation = 0;
   int column = 0;
   bool showExternal;
   bool showOffsets;
+  bool showMetadata;
 
   static int SPACE = 0;
   static int WORD = 1;
@@ -237,16 +239,19 @@
       {NameSystem syntheticNames,
       this.showExternal,
       this.showOffsets: false,
+      this.showMetadata: false,
       this.importTable,
-      this.annotator})
+      this.annotator,
+      this.metadata})
       : this.syntheticNames = syntheticNames ?? new NameSystem();
 
-  Printer._inner(Printer parent, this.importTable)
+  Printer._inner(Printer parent, this.importTable, this.metadata)
       : sink = parent.sink,
         syntheticNames = parent.syntheticNames,
         annotator = parent.annotator,
         showExternal = parent.showExternal,
-        showOffsets = parent.showOffsets;
+        showOffsets = parent.showOffsets,
+        showMetadata = parent.showMetadata;
 
   bool shouldHighlight(Node node) {
     return false;
@@ -387,7 +392,8 @@
     }
 
     endLine();
-    var inner = new Printer._inner(this, imports);
+    var inner =
+        new Printer._inner(this, imports, library.enclosingProgram?.metadata);
     library.typedefs.forEach(inner.writeNode);
     library.classes.forEach(inner.writeNode);
     library.fields.forEach(inner.writeNode);
@@ -396,7 +402,7 @@
 
   void writeProgramFile(Program program) {
     ImportTable imports = new ProgramImportTable(program);
-    var inner = new Printer._inner(this, imports);
+    var inner = new Printer._inner(this, imports, program.metadata);
     writeWord('main');
     writeSpaced('=');
     inner.writeMemberReferenceFromReference(program.mainMethodName);
@@ -504,6 +510,9 @@
       if (showOffsets && node is TreeNode) {
         writeWord("[${node.fileOffset}]");
       }
+      if (showMetadata && node is TreeNode) {
+        writeMetadata(node);
+      }
 
       node.accept(this);
 
@@ -519,6 +528,17 @@
     }
   }
 
+  void writeMetadata(TreeNode node) {
+    if (metadata != null) {
+      for (var md in metadata.values) {
+        final nodeMetadata = md.mapping[node];
+        if (nodeMetadata != null) {
+          writeWord("[@${md.tag}=${nodeMetadata}]");
+        }
+      }
+    }
+  }
+
   void writeAnnotatedType(DartType type, String annotation) {
     writeType(type);
     if (annotation != null) {
@@ -998,6 +1018,9 @@
 
   visitInvalidExpression(InvalidExpression node) {
     writeWord('invalid-expression');
+    if (node.message != null) {
+      writeWord('"${escapeString(node.message)}"');
+    }
   }
 
   visitMethodInvocation(MethodInvocation node) {
@@ -1402,11 +1425,6 @@
     writeExpression(node.value);
   }
 
-  visitInvalidStatement(InvalidStatement node) {
-    writeIndentation();
-    endLine('invalid-statement;');
-  }
-
   visitExpressionStatement(ExpressionStatement node) {
     writeIndentation();
     writeExpression(node.expression);
diff --git a/pkg/kernel/lib/transformations/closure/converter.dart b/pkg/kernel/lib/transformations/closure/converter.dart
index 3424c0d0..dcc7af9 100644
--- a/pkg/kernel/lib/transformations/closure/converter.dart
+++ b/pkg/kernel/lib/transformations/closure/converter.dart
@@ -392,7 +392,7 @@
     /// Is this closure itself captured by a closure?
     bool isCaptured = capturedVariables.contains(node.variable);
     if (isCaptured) {
-      context.extend(node.variable, new InvalidExpression());
+      context.extend(node.variable, new InvalidExpression(null));
     }
     Context parent = context;
     return saveContext(() {
@@ -635,7 +635,7 @@
   }
 
   Expression cloneContext() {
-    InvalidExpression placeHolder = new InvalidExpression();
+    InvalidExpression placeHolder = new InvalidExpression(null);
     contextClonePlaceHolders.add(placeHolder);
     return placeHolder;
   }
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index 32b6f74..d9ebd0e 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -355,11 +355,6 @@
 
   List<Statement> statements = <Statement>[];
 
-  TreeNode visitInvalidStatement(InvalidStatement stmt) {
-    statements.add(stmt);
-    return null;
-  }
-
   TreeNode visitExpressionStatement(ExpressionStatement stmt) {
     stmt.expression = expressionRewriter.rewrite(stmt.expression, statements)
       ..parent = stmt;
diff --git a/pkg/kernel/lib/transformations/reify/transformation/builder.dart b/pkg/kernel/lib/transformations/reify/transformation/builder.dart
index 1b9d097..7f0ea0e 100644
--- a/pkg/kernel/lib/transformations/reify/transformation/builder.dart
+++ b/pkg/kernel/lib/transformations/reify/transformation/builder.dart
@@ -302,7 +302,7 @@
       return new ConstructorInvocation(
           rtiLibrary.voidTypeConstructor, new Arguments(<Expression>[]));
     }
-    return new InvalidExpression();
+    return new InvalidExpression(null);
   }
 
   Expression createCallAsInstanceOf(Expression receiver, Class cls) {
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index 60b6e3c..9471dd3 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -66,6 +66,58 @@
   return substitutor.isInfinite ? null : result;
 }
 
+List<DartType> calculateBounds(
+    List<TypeParameter> typeParameters, Class object) {
+  var refinedBounds = new List<DartType>(typeParameters.length);
+  var substitution = <TypeParameter, DartType>{};
+  var substitutionToDynamic = <TypeParameter, DartType>{};
+
+  for (int i = 0; i < typeParameters.length; i++) {
+    DartType type = typeParameters[i].bound;
+    if (type == null || type is InterfaceType && type.classNode == object) {
+      type = const DynamicType();
+    }
+
+    refinedBounds[i] = type;
+    substitution[typeParameters[i]] = type;
+    substitutionToDynamic[typeParameters[i]] = const DynamicType();
+  }
+
+  var result = new List<DartType>(typeParameters.length);
+  for (int i = 0; i < result.length; i++) {
+    result[i] = substituteDeep(refinedBounds[i], substitution);
+    if (result[i] == null) {
+      result[i] = substitute(refinedBounds[i], substitutionToDynamic);
+    }
+  }
+  return result;
+}
+
+DartType instantiateToBounds(DartType type, Class object) {
+  if (type is InterfaceType) {
+    for (var typeArgument in type.typeArguments) {
+      // If at least one of the arguments is not dynamic, we assume that the
+      // type is not raw and does not need instantiation of its type parameters
+      // to their bounds.
+      if (typeArgument is! DynamicType) {
+        return type;
+      }
+    }
+    return new InterfaceType.byReference(
+        type.className, calculateBounds(type.classNode.typeParameters, object));
+  }
+  if (type is TypedefType) {
+    for (var typeArgument in type.typeArguments) {
+      if (typeArgument is! DynamicType) {
+        return type;
+      }
+    }
+    return new TypedefType.byReference(type.typedefReference,
+        calculateBounds(type.typedefNode.typeParameters, object));
+  }
+  return type;
+}
+
 /// Returns true if [type] contains a reference to any of the given [variables].
 ///
 /// It is an error to call this with a [type] that contains a [FunctionType]
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index f0d1247..7b73df2 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -471,7 +471,7 @@
 
   @override
   DartType visitInvalidExpression(InvalidExpression node) {
-    return const BottomType();
+    return const DynamicType();
   }
 
   @override
@@ -921,9 +921,6 @@
   }
 
   @override
-  visitInvalidStatement(InvalidStatement node) {}
-
-  @override
   visitLabeledStatement(LabeledStatement node) {
     visitStatement(node.body);
   }
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index 01d56b8..bfbf8f9 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -70,7 +70,6 @@
 
   R defaultStatement(Statement node) => null;
 
-  R visitInvalidStatement(InvalidStatement node) => defaultStatement(node);
   R visitExpressionStatement(ExpressionStatement node) =>
       defaultStatement(node);
   R visitBlock(Block node) => defaultStatement(node);
@@ -192,7 +191,6 @@
 
   // Statements
   R defaultStatement(Statement node) => defaultTreeNode(node);
-  R visitInvalidStatement(InvalidStatement node) => defaultStatement(node);
   R visitExpressionStatement(ExpressionStatement node) =>
       defaultStatement(node);
   R visitBlock(Block node) => defaultStatement(node);
@@ -511,8 +509,6 @@
 
   R defaultStatement(Statement node, T arg) => null;
 
-  R visitInvalidStatement(InvalidStatement node, T arg) =>
-      defaultStatement(node, arg);
   R visitExpressionStatement(ExpressionStatement node, T arg) =>
       defaultStatement(node, arg);
   R visitBlock(Block node, T arg) => defaultStatement(node, arg);
diff --git a/pkg/kernel/test/baseline_tester.dart b/pkg/kernel/test/baseline_tester.dart
deleted file mode 100644
index fb7fb2b..0000000
--- a/pkg/kernel/test/baseline_tester.dart
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright (c) 2016, 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:analyzer/src/kernel/loader.dart';
-import 'package:kernel/application_root.dart';
-import 'package:kernel/class_hierarchy.dart';
-import 'package:kernel/core_types.dart';
-import 'package:kernel/kernel.dart';
-import 'package:kernel/target/targets.dart';
-import 'package:kernel/text/ast_to_text.dart';
-import 'package:kernel/verifier.dart';
-import 'package:path/path.dart' as pathlib;
-import 'package:test/test.dart';
-
-final String testcaseDirectory = 'pkg/kernel/testcases';
-final String inputDirectory = 'pkg/kernel/testcases/input';
-final String sdkDirectory = 'sdk';
-
-/// A target to be used for testing.
-///
-/// To simplify testing dependencies, we avoid transformations that rely on
-/// a patched SDK or any SDK changes that have not landed in the main SDK.
-abstract class TestTarget extends Target {
-  /// Annotations to apply on the textual output.
-  Annotator get annotator => null;
-
-  // Return a list of strings so that we can accumulate errors.
-  List<String> performModularTransformationsOnProgram(
-      CoreTypes coreTypes, ClassHierarchy hierarchy, Program program,
-      {void logger(String msg)});
-  List<String> performGlobalTransformations(
-      CoreTypes coreTypes, Program program,
-      {void logger(String msg)});
-}
-
-void runBaselineTests(String folderName, TestTarget target) {
-  String outputDirectory = '$testcaseDirectory/$folderName';
-  var batch = new DartLoaderBatch();
-  Directory directory = new Directory(inputDirectory);
-  var applicationRoot = new ApplicationRoot(directory.absolute.path);
-  for (FileSystemEntity file in directory.listSync()) {
-    if (file is File && file.path.endsWith('.dart')) {
-      String name = pathlib.basename(file.path);
-      test(name, () async {
-        Uri dartPath =
-            new Uri(scheme: 'file', path: pathlib.absolute(file.path));
-        String shortName = pathlib.withoutExtension(name);
-        String filenameOfBaseline = '$outputDirectory/$shortName.baseline.txt';
-        String filenameOfCurrent = '$outputDirectory/$shortName.current.txt';
-
-        var program = new Program();
-        var coreTypes = new CoreTypes(program);
-        var hierarchy = new ClosedWorldClassHierarchy(program);
-        var loader = await batch.getLoader(
-            program,
-            new DartOptions(
-                strongMode: target.strongMode,
-                sdk: sdkDirectory,
-                declaredVariables: target.extraDeclaredVariables,
-                applicationRoot: applicationRoot));
-        loader.loadProgram(dartPath, target: target);
-        verifyProgram(program);
-        var errors = <String>[];
-        errors.addAll(target.performModularTransformationsOnProgram(
-            coreTypes, hierarchy, program));
-        verifyProgram(program);
-        errors.addAll(target.performGlobalTransformations(coreTypes, program));
-        verifyProgram(program);
-
-        var buffer = new StringBuffer();
-        for (var error in errors) {
-          buffer.writeln('// $error');
-        }
-        new Printer(buffer, annotator: target.annotator)
-            .writeLibraryFile(program.mainMethod.enclosingLibrary);
-        String current = '$buffer';
-        new File(filenameOfCurrent).writeAsStringSync(current);
-
-        var baselineFile = new File(filenameOfBaseline);
-        if (!baselineFile.existsSync()) {
-          new File(filenameOfBaseline).writeAsStringSync(current);
-        } else {
-          var baseline = baselineFile.readAsStringSync();
-          if (baseline != current) {
-            fail('Output of `$name` changed for $folderName.\n'
-                'Command to reset the baseline:\n'
-                '  rm $filenameOfBaseline\n'
-                'Command to see the diff:\n'
-                '  diff -cd $outputDirectory/$shortName.{baseline,current}.txt'
-                '\n');
-          }
-        }
-      });
-    }
-  }
-}
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 461add4..b210ee2 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -85,7 +85,6 @@
 
 [ $compiler == dart2analyzer ]
 dev_compiler/test/options/*: SkipByDesign
-dev_compiler/test/codegen_test: MissingCompileTimeError # Issue 30245
 
 [ $compiler == none && $runtime == drt ]
 mutation_observer: Skip # Issue 21149
@@ -132,8 +131,6 @@
 analysis_server/test/analysis/get_errors_test: Skip # runtime error, Issue 22180
 analysis_server/test/integration/analysis/analysis_options_test: RuntimeError # Issue 24796
 analyzer/test/generated/non_error_resolver_kernel_test: RuntimeError # Issue 30785
-kernel/test/baseline_spec_mode_test: RuntimeError # Issue 28243
-kernel/test/baseline_strong_mode_test: RuntimeError # Issue 28243
 analyzer/tool/task_dependency_graph/check_test: Slow, Pass
 
 [ $compiler == dart2js ]
diff --git a/pkg/vm/bin/dump_kernel.dart b/pkg/vm/bin/dump_kernel.dart
new file mode 100644
index 0000000..e2bbb61
--- /dev/null
+++ b/pkg/vm/bin/dump_kernel.dart
@@ -0,0 +1,36 @@
+// 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 'dart:io';
+
+import 'package:kernel/kernel.dart' show Program, writeProgramToText;
+import 'package:kernel/binary/ast_from_binary.dart'
+    show BinaryBuilderWithMetadata;
+
+import 'package:vm/metadata/direct_call.dart' show DirectCallMetadataRepository;
+
+final String _usage = '''
+Usage: dump_kernel input.dill output.txt
+Dumps kernel binary file with VM-specific metadata.
+''';
+
+main(List<String> arguments) async {
+  if (arguments.length != 2) {
+    print(_usage);
+    exit(1);
+  }
+
+  final input = arguments[0];
+  final output = arguments[1];
+
+  final program = new Program();
+
+  // Register VM-specific metadata.
+  program.addMetadataRepository(new DirectCallMetadataRepository());
+
+  final List<int> bytes = new File(input).readAsBytesSync();
+  new BinaryBuilderWithMetadata(bytes).readProgram(program);
+
+  writeProgramToText(program, path: output, showMetadata: true);
+}
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 8df5e10..13be81e 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -47,7 +47,8 @@
 
   CompilerOptions options;
 
-  Compiler(this.fileSystem, Uri platformKernel, {this.strongMode: false}) {
+  Compiler(this.fileSystem, Uri platformKernel,
+      {this.strongMode: false, bool suppressWarnings: false}) {
     Uri packagesUri = (Platform.packageConfig != null)
         ? Uri.parse(Platform.packageConfig)
         : null;
@@ -80,7 +81,7 @@
           case Severity.nit:
             break;
           case Severity.warning:
-            stderr.writeln(formatted);
+            if (!suppressWarnings) stderr.writeln(formatted);
             break;
         }
       };
@@ -97,8 +98,9 @@
   IncrementalKernelGenerator generator;
 
   IncrementalCompiler(FileSystem fileSystem, Uri platformKernel,
-      {strongMode: false})
-      : super(fileSystem, platformKernel, strongMode: strongMode);
+      {bool strongMode: false, bool suppressWarnings: false})
+      : super(fileSystem, platformKernel,
+            strongMode: strongMode, suppressWarnings: suppressWarnings);
 
   @override
   Future<Program> compileInternal(Uri script) async {
@@ -120,8 +122,11 @@
   final bool requireMain;
 
   SingleShotCompiler(FileSystem fileSystem, Uri platformKernel,
-      {this.requireMain: false, strongMode: false})
-      : super(fileSystem, platformKernel, strongMode: strongMode);
+      {this.requireMain: false,
+      bool strongMode: false,
+      bool suppressWarnings: false})
+      : super(fileSystem, platformKernel,
+            strongMode: strongMode, suppressWarnings: suppressWarnings);
 
   @override
   Future<Program> compileInternal(Uri script) async {
@@ -135,7 +140,7 @@
 
 Future<Compiler> lookupOrBuildNewIncrementalCompiler(
     int isolateId, List sourceFiles, Uri platformKernel,
-    {strongMode: false}) async {
+    {bool strongMode: false, bool suppressWarnings: false}) async {
   IncrementalCompiler compiler;
   if (isolateCompilers.containsKey(isolateId)) {
     compiler = isolateCompilers[isolateId];
@@ -159,7 +164,7 @@
     // isolate needs to receive a message indicating that particular
     // isolate was shut down. Message should be handled here in this script.
     compiler = new IncrementalCompiler(fileSystem, platformKernel,
-        strongMode: strongMode);
+        strongMode: strongMode, suppressWarnings: suppressWarnings);
     isolateCompilers[isolateId] = compiler;
   }
   return compiler;
@@ -185,8 +190,7 @@
   final bool strong = request[5];
   final int isolateId = request[6];
   final List sourceFiles = request[7];
-  // TODO(bkonyi): this still needs to be hooked in.
-  // final bool suppressWarnings = request[8];
+  final bool suppressWarnings = request[8];
 
   Compiler compiler;
   // TODO(aam): There should be no need to have an option to choose
@@ -195,13 +199,16 @@
   // watch the performance though.
   if (incremental) {
     compiler = await lookupOrBuildNewIncrementalCompiler(
-        isolateId, sourceFiles, platformKernel);
+        isolateId, sourceFiles, platformKernel,
+        suppressWarnings: suppressWarnings);
   } else {
     final FileSystem fileSystem = sourceFiles == null
         ? PhysicalFileSystem.instance
         : _buildFileSystem(sourceFiles);
     compiler = new SingleShotCompiler(fileSystem, platformKernel,
-        requireMain: sourceFiles == null, strongMode: strong);
+        requireMain: sourceFiles == null,
+        strongMode: strong,
+        suppressWarnings: suppressWarnings);
   }
 
   CompilationResult result;
diff --git a/pkg/vm/lib/metadata/direct_call.dart b/pkg/vm/lib/metadata/direct_call.dart
index 46f1fea..570e303 100644
--- a/pkg/vm/lib/metadata/direct_call.dart
+++ b/pkg/vm/lib/metadata/direct_call.dart
@@ -8,10 +8,19 @@
 
 /// Metadata for annotating method invocations converted to direct calls.
 class DirectCallMetadata {
-  final Member target;
+  final Reference _targetReference;
   final bool checkReceiverForNull;
 
-  DirectCallMetadata(this.target, this.checkReceiverForNull);
+  DirectCallMetadata(Member target, bool checkReceiverForNull)
+      : this.byReference(getMemberReference(target), checkReceiverForNull);
+
+  DirectCallMetadata.byReference(
+      this._targetReference, this.checkReceiverForNull);
+
+  Member get target => _targetReference.asMember;
+
+  @override
+  String toString() => "${target}${checkReceiverForNull ? '??' : ''}";
 }
 
 /// Repository for [DirectCallMetadata].
@@ -32,11 +41,12 @@
 
   @override
   DirectCallMetadata readFromBinary(BinarySource source) {
-    var target = source.readCanonicalNameReference()?.getReference()?.asMember;
-    if (target == null) {
+    final targetReference = source.readCanonicalNameReference()?.getReference();
+    if (targetReference == null) {
       throw 'DirectCallMetadata should have a non-null target';
     }
-    var checkReceiverForNull = (source.readByte() != 0);
-    return new DirectCallMetadata(target, checkReceiverForNull);
+    final checkReceiverForNull = (source.readByte() != 0);
+    return new DirectCallMetadata.byReference(
+        targetReference, checkReceiverForNull);
   }
 }
diff --git a/pkg/vm/tool/dump_kernel b/pkg/vm/tool/dump_kernel
new file mode 100755
index 0000000..bd3dc31
--- /dev/null
+++ b/pkg/vm/tool/dump_kernel
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+# 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.
+
+# Script for dumping kernel files with VM-specific metadata.
+
+set -e
+
+function follow_links() {
+  file="$1"
+  while [ -h "$file" ]; do
+    # On Mac OS, readlink -f doesn't work.
+    file="$(readlink "$file")"
+  done
+  echo "$file"
+}
+
+# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
+PROG_NAME="$(follow_links "$BASH_SOURCE")"
+
+# Handle the case where dart-sdk/bin has been symlinked to.
+CUR_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
+
+SDK_DIR="$CUR_DIR/../../.."
+
+if [[ `uname` == 'Darwin' ]]; then
+  OUT_DIR="$SDK_DIR/xcodebuild"
+else
+  OUT_DIR="$SDK_DIR/out"
+fi
+
+export DART_CONFIGURATION=${DART_CONFIGURATION:-ReleaseX64}
+BIN_DIR="$OUT_DIR/$DART_CONFIGURATION"
+
+"$BIN_DIR"/dart "${SDK_DIR}/pkg/vm/bin/dump_kernel.dart" "$@"
diff --git a/pkg/vm/tool/gen_kernel b/pkg/vm/tool/gen_kernel
index e5687b8..551d2d5 100755
--- a/pkg/vm/tool/gen_kernel
+++ b/pkg/vm/tool/gen_kernel
@@ -8,12 +8,8 @@
 
 set -e
 
-# Enable Dart 2.0 fixed-size integers for gen_kernel if running in strong mode.
-for arg in "$@"; do
-  if [ "$arg" == "--strong-mode" ]; then
-    DART_VM_FLAGS="--limit-ints-to-64-bits $DART_VM_FLAGS"
-  fi
-done
+# Enable Dart 2.0 fixed-size integers for gen_kernel
+DART_VM_FLAGS="--limit-ints-to-64-bits $DART_VM_FLAGS"
 
 function follow_links() {
   file="$1"
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 65b7aa8..e9f85168 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -50,10 +50,10 @@
 
 // Make a request to the loader. Future will complete with result which is
 // either a Uri or a List<int>.
-Future _makeLoaderRequest(int tag, String uri) {
+Future<T> _makeLoaderRequest<T>(int tag, String uri) {
   assert(_isolateId != null);
   assert(_loadPort != null);
-  Completer completer = new Completer();
+  Completer completer = new Completer<T>();
   RawReceivePort port = new RawReceivePort();
   port.handler = (msg) {
     // Close the port.
@@ -318,7 +318,8 @@
 
 // Handling of Resource class by dispatching to the load port.
 Future<List<int>> _resourceReadAsBytes(Uri uri) async {
-  List response = await _makeLoaderRequest(_Dart_kResourceLoad, uri.toString());
+  List response =
+      await _makeLoaderRequest<List<int>>(_Dart_kResourceLoad, uri.toString());
   if (response[4] is String) {
     // Throw the error.
     throw response[4];
@@ -331,7 +332,7 @@
   if (_traceLoading) {
     _log("Request for package root from user code.");
   }
-  return _makeLoaderRequest(_Dart_kGetPackageRootUri, null);
+  return _makeLoaderRequest<Uri>(_Dart_kGetPackageRootUri, null);
 }
 
 Future<Uri> _getPackageConfigFuture() {
@@ -339,7 +340,7 @@
     _log("Request for package config from user code.");
   }
   assert(_loadPort != null);
-  return _makeLoaderRequest(_Dart_kGetPackageConfigUri, null);
+  return _makeLoaderRequest<Uri>(_Dart_kGetPackageConfigUri, null);
 }
 
 Future<Uri> _resolvePackageUriFuture(Uri packageUri) async {
@@ -353,8 +354,8 @@
     // Return the incoming parameter if not passed a package: URI.
     return packageUri;
   }
-  var result =
-      await _makeLoaderRequest(_Dart_kResolvePackageUri, packageUri.toString());
+  var result = await _makeLoaderRequest<Uri>(
+      _Dart_kResolvePackageUri, packageUri.toString());
   if (result is! Uri) {
     if (_traceLoading) {
       _log("Exception when resolving package URI: $packageUri");
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index 64236ee..6bcca69 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -31,6 +31,10 @@
 [ $compiler == dartkp ]
 *: Skip # Non-kernel also skips precompiled mode.
 
+[ $arch == simdbc64 && $compiler == dartk ]
+pause_on_unhandled_async_exceptions2_test: RuntimeError, Timeout # Issue 31765
+pause_on_unhandled_async_exceptions_test: RuntimeError, Timeout # Issue 31765
+
 [ $compiler == dartk && $mode == debug ]
 isolate_lifecycle_test: Skip # Flaky.
 pause_idle_isolate_test: Skip # Flaky
diff --git a/runtime/tests/vm/dart/byte_array_optimized_test.dart b/runtime/tests/vm/dart/byte_array_optimized_test.dart
index 2c6a5d2..763fa52 100644
--- a/runtime/tests/vm/dart/byte_array_optimized_test.dart
+++ b/runtime/tests/vm/dart/byte_array_optimized_test.dart
@@ -747,10 +747,6 @@
     }
     Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], array);
     for (int i = 0; i < array.length; ++i) {
-      array[i] = 0x10000000000000000 + i;
-    }
-    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], array);
-    for (int i = 0; i < array.length; ++i) {
       array[i] = -10 + i;
     }
     Expect.listEquals([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1], array);
@@ -875,10 +871,6 @@
     }
     Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], array);
     for (int i = 0; i < array.length; ++i) {
-      array[i] = 0x10000000000000000 + i;
-    }
-    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], array);
-    for (int i = 0; i < array.length; ++i) {
       array[i] = 0xFFFFFFFFFFFFFFFF - i;
     }
     Expect.listEquals([
@@ -907,8 +899,10 @@
     Expect.isTrue(copy is Uint64List);
     Expect.equals(4, region.length);
     Expect.listEquals([3, 4, 5, 6], region);
-    array.setRange(3, 7, [0x10000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF]);
-    Expect.listEquals([0, 1, 2, 1, 0, 1, 0xFFFFFFFFFFFFFFFF, 7, 8, 9], array);
+    array.setRange(3, 7, [-0x8000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF]);
+    Expect.listEquals(
+        [0, 1, 2, -0x8000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF, 7, 8, 9],
+        array);
   }
 
   static testUint64List() {
@@ -3015,108 +3009,6 @@
       0xFF
     ], array);
     for (int i = 0; i < view.length; ++i) {
-      view[i] = 0x10000000000000000 + i;
-    }
-    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], view);
-    Expect.listEquals([
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x01,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x02,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x03,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x04,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x05,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x06,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x07,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x08,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x09,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF
-    ], array);
-    for (int i = 0; i < view.length; ++i) {
       view[i] = -10 + i;
     }
     Expect.listEquals([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1], view);
@@ -3777,108 +3669,6 @@
       -1
     ], array);
     for (int i = 0; i < view.length; ++i) {
-      view[i] = 0x10000000000000000 + i;
-    }
-    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], view);
-    Expect.listEquals([
-      -1,
-      -1,
-      -1,
-      -1,
-      -1,
-      -1,
-      -1,
-      -1,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      1,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      2,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      3,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      4,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      5,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      6,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      7,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      8,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      9,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      -1,
-      -1,
-      -1,
-      -1,
-      -1,
-      -1,
-      -1,
-      -1
-    ], array);
-    for (int i = 0; i < view.length; ++i) {
       view[i] = 0xFFFFFFFFFFFFFFFF - i;
     }
     Expect.listEquals([
@@ -4003,8 +3793,9 @@
     Expect.isTrue(copy is Uint64List);
     Expect.equals(4, region.length);
     Expect.listEquals([3, 4, 5, 6], region);
-    view.setRange(3, 7, [0x10000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF]);
-    Expect.listEquals([0, 1, 2, 1, 0, 1, 0xFFFFFFFFFFFFFFFF, 7, 8, 9], view);
+    view.setRange(3, 7, [0x8000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF]);
+    Expect.listEquals(
+        [0, 1, 2, 0x8000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF, 7, 8, 9], view);
     Expect.listEquals([
       -1,
       -1,
@@ -4045,7 +3836,7 @@
       0,
       0,
       0,
-      0,
+      -128,
       0,
       0,
       0,
diff --git a/runtime/tests/vm/dart/byte_array_test.dart b/runtime/tests/vm/dart/byte_array_test.dart
index cefc49c..903bf2b 100644
--- a/runtime/tests/vm/dart/byte_array_test.dart
+++ b/runtime/tests/vm/dart/byte_array_test.dart
@@ -864,10 +864,6 @@
     }
     Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], array);
     for (int i = 0; i < array.length; ++i) {
-      array[i] = 0x10000000000000000 + i;
-    }
-    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], array);
-    for (int i = 0; i < array.length; ++i) {
       array[i] = -10 + i;
     }
     Expect.listEquals([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1], array);
@@ -995,10 +991,6 @@
     }
     Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], array);
     for (int i = 0; i < array.length; ++i) {
-      array[i] = 0x10000000000000000 + i;
-    }
-    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], array);
-    for (int i = 0; i < array.length; ++i) {
       array[i] = 0xFFFFFFFFFFFFFFFF - i;
     }
     Expect.listEquals([
@@ -1030,8 +1022,10 @@
     Expect.isTrue(copy is Uint64List);
     Expect.equals(4, region.length);
     Expect.listEquals([3, 4, 5, 6], region);
-    array.setRange(3, 7, [0x10000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF]);
-    Expect.listEquals([0, 1, 2, 1, 0, 1, 0xFFFFFFFFFFFFFFFF, 7, 8, 9], array);
+    array.setRange(3, 7, [-0x8000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF]);
+    Expect.listEquals(
+        [0, 1, 2, -0x8000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF, 7, 8, 9],
+        array);
   }
 
   static testUint64List() {
@@ -3409,108 +3403,6 @@
       0xFF
     ], array);
     for (int i = 0; i < view.length; ++i) {
-      view[i] = 0x10000000000000000 + i;
-    }
-    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], view);
-    Expect.listEquals([
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x01,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x02,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x03,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x04,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x05,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x06,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x07,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x08,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x09,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0x00,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF,
-      0xFF
-    ], array);
-    for (int i = 0; i < view.length; ++i) {
       view[i] = -10 + i;
     }
     Expect.listEquals([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1], view);
@@ -4171,108 +4063,6 @@
       -1
     ], array);
     for (int i = 0; i < view.length; ++i) {
-      view[i] = 0x10000000000000000 + i;
-    }
-    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], view);
-    Expect.listEquals([
-      -1,
-      -1,
-      -1,
-      -1,
-      -1,
-      -1,
-      -1,
-      -1,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      1,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      2,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      3,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      4,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      5,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      6,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      7,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      8,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      9,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      0,
-      -1,
-      -1,
-      -1,
-      -1,
-      -1,
-      -1,
-      -1,
-      -1
-    ], array);
-    for (int i = 0; i < view.length; ++i) {
       view[i] = 0xFFFFFFFFFFFFFFFF - i;
     }
     Expect.listEquals([
@@ -4397,8 +4187,9 @@
     Expect.isTrue(copy is Uint64List);
     Expect.equals(4, region.length);
     Expect.listEquals([3, 4, 5, 6], region);
-    view.setRange(3, 7, [0x10000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF]);
-    Expect.listEquals([0, 1, 2, 1, 0, 1, 0xFFFFFFFFFFFFFFFF, 7, 8, 9], view);
+    view.setRange(3, 7, [0x8000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF]);
+    Expect.listEquals(
+        [0, 1, 2, 0x8000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF, 7, 8, 9], view);
     Expect.listEquals([
       -1,
       -1,
@@ -4439,7 +4230,7 @@
       0,
       0,
       0,
-      0,
+      -128,
       0,
       0,
       0,
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 63981da..9b7d730 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -132,12 +132,6 @@
 cc/IsolateReload_NoLibsModified: Fail # Please triage.
 cc/IsolateReload_PrefixImportedLibModified: Fail # Please triage.
 
-# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
-# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
-# batch mode.
-[ $arch == simdbc64 && $compiler == dartk ]
-dart/truncating_ints_test: RuntimeError # Please triage.
-
 [ $arch == x64 && $system == windows ]
 cc/Profiler_BinaryOperatorSourcePositionOptimized: Pass, Fail # Issue 31137
 cc/Profiler_ClosureAllocation: Pass, Fail # Issue 31137
@@ -348,7 +342,6 @@
 dart/data_uri_spawn_test: Skip # Please triage.
 dart/snapshot_version_test: RuntimeError # Please triage.
 dart/spawn_infinite_loop_test: Crash # Please triage.
-dart/truncating_ints_test: CompileTimeError # Please triage.
 
 [ $compiler == dartkp && !$strong ]
 dart/truncating_ints_test: Skip # This test cannot be run in dartkp/legacy mode (gen_kernel does not pass --limit-ints-to-64-bits in legacy mode).
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index e31ae3c..12c48e7 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -393,7 +393,8 @@
     return;
   }
 
-  if (Isolate::Current()->error_on_bad_override()) {
+  Isolate* isolate = Isolate::Current();
+  if (isolate->error_on_bad_override() && !isolate->strong()) {
     // Verify that the target is compatible with the redirecting factory.
     Error& error = Error::Handle();
     if (!target.HasCompatibleParametersWith(factory, &error)) {
@@ -1518,8 +1519,9 @@
   // functions of a class, so we do not need to consider fields as implicitly
   // generating getters and setters.
   // Most overriding conflicts are only static warnings, i.e. they are not
-  // reported as compile-time errors by the vm. However, signature conflicts in
-  // overrides can be reported if the flag --error_on_bad_override is specified.
+  // reported as compile-time errors by the vm. However, in non-strong mode,
+  // signature conflicts in overrides can be reported if the flag
+  // --error_on_bad_override is specified.
   // Static warning examples are:
   // - a static getter 'v' conflicting with an inherited instance setter 'v='.
   // - a static setter 'v=' conflicting with an inherited instance member 'v'.
@@ -1648,7 +1650,8 @@
   // If we check for bad overrides, collect interfaces, super interfaces, and
   // super classes of this class.
   GrowableArray<const Class*> interfaces(zone, 4);
-  if (Isolate::Current()->error_on_bad_override()) {
+  Isolate* isolate = Isolate::Current();
+  if (isolate->error_on_bad_override() && !isolate->strong()) {
     CollectInterfaces(cls, &interfaces);
     // Include superclasses in list of interfaces and super interfaces.
     super_class = cls.SuperClass();
@@ -1670,8 +1673,8 @@
     FinalizeSignature(cls, function);
     name = function.name();
     // Report signature conflicts only.
-    if (Isolate::Current()->error_on_bad_override() && !function.is_static() &&
-        !function.IsGenerativeConstructor()) {
+    if (isolate->error_on_bad_override() && !isolate->strong() &&
+        !function.is_static() && !function.IsGenerativeConstructor()) {
       // A constructor cannot override anything.
       for (intptr_t i = 0; i < interfaces.length(); i++) {
         const Class* interface = interfaces.At(i);
@@ -2648,7 +2651,8 @@
     FinalizeClass(super);
   }
   // Ensure interfaces are finalized in case we check for bad overrides.
-  if (Isolate::Current()->error_on_bad_override()) {
+  Isolate* isolate = Isolate::Current();
+  if (isolate->error_on_bad_override() && !isolate->strong()) {
     GrowableArray<const Class*> interfaces(4);
     CollectInterfaces(cls, &interfaces);
     for (intptr_t i = 0; i < interfaces.length(); i++) {
diff --git a/runtime/vm/compiler/assembler/assembler_dbc_test.cc b/runtime/vm/compiler/assembler/assembler_dbc_test.cc
index 23e89aa..3f6c5e7 100644
--- a/runtime/vm/compiler/assembler/assembler_dbc_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_dbc_test.cc
@@ -90,7 +90,7 @@
   ic_data.AddCheck(cids, dummy_instance_function);
 
   // For the non-Smi tests.
-  cids[0] = kBigintCid;
+  cids[0] = kMintCid;
   ic_data.AddCheck(cids, dummy_instance_function);
   ICData* call_ic_data = &ICData::ZoneHandle(ic_data.Original());
 
@@ -211,7 +211,7 @@
 
 ASSEMBLER_TEST_GENERATE(AddTOSNonSmi, assembler) {
   const String& numstr =
-      String::Handle(String::New("98765432198765432100", Heap::kOld));
+      String::Handle(String::New("9176543219876543210", Heap::kOld));
   __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
   __ PushConstant(Smi::Handle(Smi::New(1)));
   __ AddTOS();
@@ -252,7 +252,7 @@
 
 ASSEMBLER_TEST_GENERATE(SubTOSNonSmi, assembler) {
   const String& numstr =
-      String::Handle(String::New("98765432198765432100", Heap::kOld));
+      String::Handle(String::New("9176543219876543210", Heap::kOld));
   __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
   __ PushConstant(Smi::Handle(Smi::New(1)));
   __ SubTOS();
@@ -293,7 +293,7 @@
 
 ASSEMBLER_TEST_GENERATE(MulTOSNonSmi, assembler) {
   const String& numstr =
-      String::Handle(String::New("98765432198765432100", Heap::kOld));
+      String::Handle(String::New("9176543219876543210", Heap::kOld));
   __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
   __ PushConstant(Smi::Handle(Smi::New(1)));
   __ MulTOS();
@@ -321,7 +321,7 @@
 
 ASSEMBLER_TEST_GENERATE(BitOrTOSNonSmi, assembler) {
   const String& numstr =
-      String::Handle(String::New("98765432198765432100", Heap::kOld));
+      String::Handle(String::New("9176543219876543210", Heap::kOld));
   __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
   __ PushConstant(Smi::Handle(Smi::New(0x08)));
   __ BitOrTOS();
@@ -349,7 +349,7 @@
 
 ASSEMBLER_TEST_GENERATE(BitAndTOSNonSmi, assembler) {
   const String& numstr =
-      String::Handle(String::New("98765432198765432100", Heap::kOld));
+      String::Handle(String::New("9176543219876543210", Heap::kOld));
   __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
   __ PushConstant(Smi::Handle(Smi::New(0x08)));
   __ BitAndTOS();
@@ -390,7 +390,7 @@
 
 ASSEMBLER_TEST_GENERATE(EqualTOSNonSmi, assembler) {
   const String& numstr =
-      String::Handle(String::New("98765432198765432100", Heap::kOld));
+      String::Handle(String::New("9176543219876543210", Heap::kOld));
   __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
   __ PushConstant(Smi::Handle(Smi::New(-42)));
   __ EqualTOS();
@@ -431,7 +431,7 @@
 
 ASSEMBLER_TEST_GENERATE(LessThanTOSNonSmi, assembler) {
   const String& numstr =
-      String::Handle(String::New("98765432198765432100", Heap::kOld));
+      String::Handle(String::New("9176543219876543210", Heap::kOld));
   __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
   __ PushConstant(Smi::Handle(Smi::New(-42)));
   __ LessThanTOS();
@@ -472,7 +472,7 @@
 
 ASSEMBLER_TEST_GENERATE(GreaterThanTOSNonSmi, assembler) {
   const String& numstr =
-      String::Handle(String::New("98765432198765432100", Heap::kOld));
+      String::Handle(String::New("9176543219876543210", Heap::kOld));
   __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
   __ PushConstant(Smi::Handle(Smi::New(-42)));
   __ GreaterThanTOS();
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 7f5c613..353764f 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -408,6 +408,41 @@
   return dst_type().raw() == other_assert->dst_type().raw();
 }
 
+Instruction* AssertSubtypeInstr::Canonicalize(FlowGraph* flow_graph) {
+  // If all values for type parameters are known (i.e. from instantiator and
+  // function) we can instantiate the sub and super type and remove this
+  // instruction if the subtype test succeeds.
+  ConstantInstr* constant_instantiator_type_args =
+      instantiator_type_arguments()->definition()->AsConstant();
+  ConstantInstr* constant_function_type_args =
+      function_type_arguments()->definition()->AsConstant();
+  if ((constant_instantiator_type_args != NULL) &&
+      (constant_function_type_args != NULL)) {
+    ASSERT(constant_instantiator_type_args->value().IsNull() ||
+           constant_instantiator_type_args->value().IsTypeArguments());
+    ASSERT(constant_function_type_args->value().IsNull() ||
+           constant_function_type_args->value().IsTypeArguments());
+
+    Zone* Z = Thread::Current()->zone();
+    TypeArguments& instantiator_type_args = TypeArguments::Handle(Z);
+    instantiator_type_args ^= constant_instantiator_type_args->value().raw();
+
+    TypeArguments& function_type_args = TypeArguments::Handle(Z);
+    function_type_args ^= constant_function_type_args->value().raw();
+
+    Error& error_bound = Error::Handle(Z);
+
+    AbstractType& sub_type = AbstractType::Handle(Z, sub_type_.raw());
+    AbstractType& super_type = AbstractType::Handle(Z, super_type_.raw());
+    if (AbstractType::InstantiateAndTestSubtype(
+            &sub_type, &super_type, &error_bound, instantiator_type_args,
+            function_type_args)) {
+      return NULL;
+    }
+  }
+  return this;
+}
+
 bool AssertSubtypeInstr::AttributesEqual(Instruction* other) const {
   AssertSubtypeInstr* other_assert = other->AsAssertSubtype();
   ASSERT(other_assert != NULL);
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 4a72d27..7e391d9 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -2789,16 +2789,16 @@
 
   virtual bool CanBecomeDeoptimizationTarget() const { return true; }
 
+  virtual Instruction* Canonicalize(FlowGraph* flow_graph);
+
   virtual bool AttributesEqual(Instruction* other) const;
 
   PRINT_OPERANDS_TO_SUPPORT
 
-  // TODO(sjindel): Implement Canonicalize to finalize dst_type when the
-  // instantiator and function type args are constant.
  private:
   const TokenPosition token_pos_;
-  const AbstractType& sub_type_;
-  const AbstractType& super_type_;
+  AbstractType& sub_type_;
+  AbstractType& super_type_;
   const String& dst_name_;
 
   DISALLOW_COPY_AND_ASSIGN(AssertSubtypeInstr);
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index ffff777..3aa37d8 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -136,7 +136,11 @@
 
   const intptr_t rollback_point = rollback_.length();
 
-  if (Isolate::Current()->type_checks()) {
+  // When having assertions enabled or when running in strong-mode the IR graphs
+  // can contain [AssertAssignableInstr]s and we therefore enable this
+  // optimization.
+  Isolate* isolate = Isolate::Current();
+  if (isolate->type_checks() || isolate->strong()) {
     StrengthenAsserts(block);
   }
 
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 35bc55b..d83c8365 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -1150,6 +1150,8 @@
   Tag tag = builder_->ReadTag(&payload);
   switch (tag) {
     case kInvalidExpression:
+      builder_->ReadPosition();
+      builder_->SkipStringReference();
       return;
     case kVariableGet: {
       builder_->ReadPosition();  // read position.
@@ -1424,8 +1426,6 @@
 void StreamingScopeBuilder::VisitStatement() {
   Tag tag = builder_->ReadTag();  // read tag.
   switch (tag) {
-    case kInvalidStatement:
-      return;
     case kExpressionStatement:
       VisitExpression();  // read expression.
       return;
@@ -4498,8 +4498,6 @@
 Fragment StreamingFlowGraphBuilder::BuildStatement() {
   Tag tag = ReadTag();  // read tag.
   switch (tag) {
-    case kInvalidStatement:
-      return BuildInvalidStatement();
     case kExpressionStatement:
       return BuildExpressionStatement();
     case kBlock:
@@ -4815,6 +4813,8 @@
   Tag tag = ReadTag(&payload);
   switch (tag) {
     case kInvalidExpression:
+      ReadPosition();
+      SkipStringReference();
       return;
     case kVariableGet:
       ReadPosition();          // read position.
@@ -5044,8 +5044,6 @@
 void StreamingFlowGraphBuilder::SkipStatement() {
   Tag tag = ReadTag();  // read tag.
   switch (tag) {
-    case kInvalidStatement:
-      return;
     case kExpressionStatement:
       SkipExpression();  // read expression.
       return;
@@ -5866,28 +5864,27 @@
 
 Fragment StreamingFlowGraphBuilder::BuildInvalidExpression(
     TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
-
   // The frontend will take care of emitting normal errors (like
   // [NoSuchMethodError]s) and only emit [InvalidExpression]s in very special
   // situations (e.g. an invalid annotation).
-  return ThrowNoSuchMethodError();
+  TokenPosition pos = ReadPosition();
+  if (position != NULL) *position = pos;
+  const String& message = H.DartString(ReadStringReference());
+  H.ReportError(script(), pos, "%s", message.ToCString());
+  return Fragment();
 }
 
 Fragment StreamingFlowGraphBuilder::BuildVariableGet(TokenPosition* position) {
-  (position != NULL) ? * position = ReadPosition()
-                     : ReadPosition();             // read position.
+  (position != NULL) ? * position = ReadPosition() : ReadPosition();
   intptr_t variable_kernel_position = ReadUInt();  // read kernel position.
   ReadUInt();              // read relative variable index.
   SkipOptionalDartType();  // read promoted type.
-
   return LoadLocal(LookupVariable(variable_kernel_position));
 }
 
 Fragment StreamingFlowGraphBuilder::BuildVariableGet(uint8_t payload,
                                                      TokenPosition* position) {
-  (position != NULL) ? * position = ReadPosition()
-                     : ReadPosition();             // read position.
+  (position != NULL) ? * position = ReadPosition() : ReadPosition();
   intptr_t variable_kernel_position = ReadUInt();  // read kernel position.
   return LoadLocal(LookupVariable(variable_kernel_position));
 }
@@ -7830,11 +7827,6 @@
   return Constant(Object::ZoneHandle(Z, H.constants().At(constant_index)));
 }
 
-Fragment StreamingFlowGraphBuilder::BuildInvalidStatement() {
-  H.ReportError("Invalid statements not implemented yet!");
-  return Fragment();
-}
-
 Fragment StreamingFlowGraphBuilder::BuildExpressionStatement() {
   Fragment instructions = BuildExpression();  // read expression.
   instructions += Drop();
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 9196276..c3da1c1 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -1218,7 +1218,6 @@
   Fragment BuildClosureCreation(TokenPosition* position);
   Fragment BuildConstantExpression(TokenPosition* position);
 
-  Fragment BuildInvalidStatement();
   Fragment BuildExpressionStatement();
   Fragment BuildBlock();
   Fragment BuildEmptyStatement();
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 5e71c4f..4e0189c 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -80,7 +80,7 @@
     "Disable to make importing dart:mirrors an error.")                        \
   R(enable_type_checks, false, bool, false, "Enable type checks.")             \
   R(error_on_bad_override, false, bool, false,                                 \
-    "Report error for bad overrides.")                                         \
+    "Report error for bad overrides. Ignored in strong mode.")                 \
   R(error_on_bad_type, false, bool, false,                                     \
     "Report error for malformed types.")                                       \
   P(external_max_size, int, (kWordSize <= 4) ? 512 : 1024,                     \
@@ -100,7 +100,7 @@
   P(interpret_irregexp, bool, USING_DBC, "Use irregexp bytecode interpreter")  \
   P(lazy_dispatchers, bool, true, "Generate dispatchers lazily")               \
   P(link_natives_lazily, bool, false, "Link native calls lazily")              \
-  P(limit_ints_to_64_bits, bool, false, "Truncate integers to 64 bits")        \
+  P(limit_ints_to_64_bits, bool, true, "Truncate integers to 64 bits")         \
   C(load_deferred_eagerly, true, true, bool, false,                            \
     "Load deferred libraries eagerly.")                                        \
   R(log_marker_tasks, false, bool, false,                                      \
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 6a1d898..4819fd2 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -87,7 +87,6 @@
   kConstListLiteral = 58,
   kConstMapLiteral = 59,
 
-  kInvalidStatement = 60,
   kExpressionStatement = 61,
   kBlock = 62,
   kEmptyStatement = 63,
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 090091d..99454e3 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -6475,6 +6475,7 @@
 bool Function::HasCompatibleParametersWith(const Function& other,
                                            Error* bound_error) const {
   ASSERT(Isolate::Current()->error_on_bad_override());
+  ASSERT(!Isolate::Current()->strong());
   ASSERT((bound_error != NULL) && bound_error->IsNull());
   // Check that this function's signature type is a subtype of the other
   // function's signature type.
@@ -6483,15 +6484,6 @@
   // Note that type parameters declared by a generic signature are preserved.
   Function& this_fun = Function::Handle(raw());
   if (!this_fun.HasInstantiatedSignature(kCurrentClass)) {
-    // HasCompatibleParametersWith is called at compile time to check for bad
-    // overrides and can only detect some obviously wrong overrides, but it
-    // should never give false negatives.
-    if (Isolate::Current()->strong()) {
-      // Instantiating all type parameters to dynamic is not the right thing
-      // to do in strong mode, because of contravariance of parameter types.
-      // It is better to skip the test than to give a false negative.
-      return true;
-    }
     this_fun = this_fun.InstantiateSignatureFrom(
         Object::null_type_arguments(), Object::null_type_arguments(),
         kNoneFree,  // Keep function type parameters, do not map to dynamic.
@@ -6499,10 +6491,6 @@
   }
   Function& other_fun = Function::Handle(other.raw());
   if (!other_fun.HasInstantiatedSignature(kCurrentClass)) {
-    if (Isolate::Current()->strong()) {
-      // See comment above.
-      return true;
-    }
     other_fun = other_fun.InstantiateSignatureFrom(
         Object::null_type_arguments(), Object::null_type_arguments(),
         kNoneFree,  // Keep function type parameters, do not map to dynamic.
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index c244c40..f0264a6 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -825,7 +825,7 @@
 
 // Sets the register in the architecture state. It will also deal with updating
 // Simulator internal state for special registers such as PC.
-void Simulator::set_register(Register reg, int32_t value) {
+DART_FORCE_INLINE void Simulator::set_register(Register reg, int32_t value) {
   ASSERT((reg >= 0) && (reg < kNumberOfCpuRegisters));
   if (reg == PC) {
     pc_modified_ = true;
@@ -833,44 +833,32 @@
   registers_[reg] = value;
 }
 
-// Get the register from the architecture state. This function does handle
-// the special case of accessing the PC register.
-int32_t Simulator::get_register(Register reg) const {
-  ASSERT((reg >= 0) && (reg < kNumberOfCpuRegisters));
-  return registers_[reg] + ((reg == PC) ? Instr::kPCReadOffset : 0);
-}
-
 // Raw access to the PC register.
-void Simulator::set_pc(int32_t value) {
+DART_FORCE_INLINE void Simulator::set_pc(int32_t value) {
   pc_modified_ = true;
   registers_[PC] = value;
 }
 
-// Raw access to the PC register without the special adjustment when reading.
-int32_t Simulator::get_pc() const {
-  return registers_[PC];
-}
-
 // Accessors for VFP register state.
-void Simulator::set_sregister(SRegister reg, float value) {
+DART_FORCE_INLINE void Simulator::set_sregister(SRegister reg, float value) {
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfSRegisters));
   sregisters_[reg] = bit_cast<int32_t, float>(value);
 }
 
-float Simulator::get_sregister(SRegister reg) const {
+DART_FORCE_INLINE float Simulator::get_sregister(SRegister reg) const {
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfSRegisters));
   return bit_cast<float, int32_t>(sregisters_[reg]);
 }
 
-void Simulator::set_dregister(DRegister reg, double value) {
+DART_FORCE_INLINE void Simulator::set_dregister(DRegister reg, double value) {
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfDRegisters));
   dregisters_[reg] = bit_cast<int64_t, double>(value);
 }
 
-double Simulator::get_dregister(DRegister reg) const {
+DART_FORCE_INLINE double Simulator::get_dregister(DRegister reg) const {
   ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfDRegisters));
   return bit_cast<double, int64_t>(dregisters_[reg]);
@@ -960,7 +948,7 @@
   FATAL("Cannot continue execution after unimplemented instruction.");
 }
 
-intptr_t Simulator::ReadW(uword addr, Instr* instr) {
+DART_FORCE_INLINE intptr_t Simulator::ReadW(uword addr, Instr* instr) {
   if ((addr & 3) == 0) {
     intptr_t* ptr = reinterpret_cast<intptr_t*>(addr);
     return *ptr;
@@ -969,7 +957,9 @@
   return 0;
 }
 
-void Simulator::WriteW(uword addr, intptr_t value, Instr* instr) {
+DART_FORCE_INLINE void Simulator::WriteW(uword addr,
+                                         intptr_t value,
+                                         Instr* instr) {
   if ((addr & 3) == 0) {
     intptr_t* ptr = reinterpret_cast<intptr_t*>(addr);
     *ptr = value;
@@ -978,7 +968,7 @@
   UnalignedAccess("write", addr, instr);
 }
 
-uint16_t Simulator::ReadHU(uword addr, Instr* instr) {
+DART_FORCE_INLINE uint16_t Simulator::ReadHU(uword addr, Instr* instr) {
   if ((addr & 1) == 0) {
     uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
     return *ptr;
@@ -987,7 +977,7 @@
   return 0;
 }
 
-int16_t Simulator::ReadH(uword addr, Instr* instr) {
+DART_FORCE_INLINE int16_t Simulator::ReadH(uword addr, Instr* instr) {
   if ((addr & 1) == 0) {
     int16_t* ptr = reinterpret_cast<int16_t*>(addr);
     return *ptr;
@@ -996,7 +986,9 @@
   return 0;
 }
 
-void Simulator::WriteH(uword addr, uint16_t value, Instr* instr) {
+DART_FORCE_INLINE void Simulator::WriteH(uword addr,
+                                         uint16_t value,
+                                         Instr* instr) {
   if ((addr & 1) == 0) {
     uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
     *ptr = value;
@@ -1005,17 +997,17 @@
   UnalignedAccess("halfword write", addr, instr);
 }
 
-uint8_t Simulator::ReadBU(uword addr) {
+DART_FORCE_INLINE uint8_t Simulator::ReadBU(uword addr) {
   uint8_t* ptr = reinterpret_cast<uint8_t*>(addr);
   return *ptr;
 }
 
-int8_t Simulator::ReadB(uword addr) {
+DART_FORCE_INLINE int8_t Simulator::ReadB(uword addr) {
   int8_t* ptr = reinterpret_cast<int8_t*>(addr);
   return *ptr;
 }
 
-void Simulator::WriteB(uword addr, uint8_t value) {
+DART_FORCE_INLINE void Simulator::WriteB(uword addr, uint8_t value) {
   uint8_t* ptr = reinterpret_cast<uint8_t*>(addr);
   *ptr = value;
 }
@@ -1062,7 +1054,7 @@
 
 // Checks if the current instruction should be executed based on its
 // condition bits.
-bool Simulator::ConditionallyExecute(Instr* instr) {
+DART_FORCE_INLINE bool Simulator::ConditionallyExecute(Instr* instr) {
   switch (instr->ConditionField()) {
     case EQ:
       return z_flag_;
@@ -1101,23 +1093,25 @@
 }
 
 // Calculate and set the Negative and Zero flags.
-void Simulator::SetNZFlags(int32_t val) {
+DART_FORCE_INLINE void Simulator::SetNZFlags(int32_t val) {
   n_flag_ = (val < 0);
   z_flag_ = (val == 0);
 }
 
 // Set the Carry flag.
-void Simulator::SetCFlag(bool val) {
+DART_FORCE_INLINE void Simulator::SetCFlag(bool val) {
   c_flag_ = val;
 }
 
 // Set the oVerflow flag.
-void Simulator::SetVFlag(bool val) {
+DART_FORCE_INLINE void Simulator::SetVFlag(bool val) {
   v_flag_ = val;
 }
 
 // Calculate C flag value for additions (and subtractions with adjusted args).
-bool Simulator::CarryFrom(int32_t left, int32_t right, int32_t carry) {
+DART_FORCE_INLINE bool Simulator::CarryFrom(int32_t left,
+                                            int32_t right,
+                                            int32_t carry) {
   uint64_t uleft = static_cast<uint32_t>(left);
   uint64_t uright = static_cast<uint32_t>(right);
   uint64_t ucarry = static_cast<uint32_t>(carry);
@@ -1125,7 +1119,9 @@
 }
 
 // Calculate V flag value for additions (and subtractions with adjusted args).
-bool Simulator::OverflowFrom(int32_t left, int32_t right, int32_t carry) {
+DART_FORCE_INLINE bool Simulator::OverflowFrom(int32_t left,
+                                               int32_t right,
+                                               int32_t carry) {
   int64_t result = static_cast<int64_t>(left) + right + carry;
   return (result >> 31) != (result >> 32);
 }
@@ -1274,7 +1270,7 @@
 
 // Addressing Mode 1 - Data-processing operands:
 // Get the value based on the shifter_operand with immediate.
-int32_t Simulator::GetImm(Instr* instr, bool* carry_out) {
+DART_FORCE_INLINE int32_t Simulator::GetImm(Instr* instr, bool* carry_out) {
   int rotate = instr->RotateField() * 2;
   int immed8 = instr->Immed8Field();
   int imm = (immed8 >> rotate) | (immed8 << (32 - rotate));
@@ -1282,23 +1278,12 @@
   return imm;
 }
 
-static int count_bits(int bit_vector) {
-  int count = 0;
-  while (bit_vector != 0) {
-    if ((bit_vector & 1) != 0) {
-      count++;
-    }
-    bit_vector >>= 1;
-  }
-  return count;
-}
-
 // Addressing Mode 4 - Load and Store Multiple
 void Simulator::HandleRList(Instr* instr, bool load) {
   Register rn = instr->RnField();
   int32_t rn_val = get_register(rn);
   int rlist = instr->RlistField();
-  int num_regs = count_bits(rlist);
+  int num_regs = Utils::CountOneBits32(static_cast<uint32_t>(rlist));
 
   uword address = 0;
   uword end_address = 0;
@@ -1516,7 +1501,7 @@
 
 // Instruction types 0 and 1 are both rolled into one function because they
 // only differ in the handling of the shifter_operand.
-void Simulator::DecodeType01(Instr* instr) {
+DART_FORCE_INLINE void Simulator::DecodeType01(Instr* instr) {
   if (!instr->IsDataProcessing()) {
     // miscellaneous, multiply, sync primitives, extra loads and stores.
     if (instr->IsMiscellaneous()) {
@@ -2136,7 +2121,7 @@
   }
 }
 
-void Simulator::DecodeType2(Instr* instr) {
+DART_FORCE_INLINE void Simulator::DecodeType2(Instr* instr) {
   Register rd = instr->RdField();
   Register rn = instr->RnField();
   int32_t rn_val = get_register(rn);
@@ -3454,18 +3439,8 @@
 }
 
 // Executes the current instruction.
-void Simulator::InstructionDecode(Instr* instr) {
+DART_FORCE_INLINE void Simulator::InstructionDecodeImpl(Instr* instr) {
   pc_modified_ = false;
-  if (IsTracingExecution()) {
-    THR_Print("%" Pu64 " ", icount_);
-    const uword start = reinterpret_cast<uword>(instr);
-    const uword end = start + Instr::kInstrSize;
-    if (FLAG_support_disassembler) {
-      Disassembler::Disassemble(start, end);
-    } else {
-      THR_Print("Disassembler not supported in this mode.\n");
-    }
-  }
   if (instr->ConditionField() == kSpecialCondition) {
     if (instr->InstructionBits() == static_cast<int32_t>(0xf57ff01f)) {
       // Format(instr, "clrex");
@@ -3520,12 +3495,26 @@
   }
 }
 
+void Simulator::InstructionDecode(Instr* instr) {
+  if (IsTracingExecution()) {
+    THR_Print("%" Pu64 " ", icount_);
+    const uword start = reinterpret_cast<uword>(instr);
+    const uword end = start + Instr::kInstrSize;
+    if (FLAG_support_disassembler) {
+      Disassembler::Disassemble(start, end);
+    } else {
+      THR_Print("Disassembler not supported in this mode.\n");
+    }
+  }
+  InstructionDecodeImpl(instr);
+}
+
 void Simulator::Execute() {
   // Get the PC to simulate. Cannot use the accessor here as we need the
   // raw PC value and not the one used as input to arithmetic instructions.
   uword program_counter = get_pc();
 
-  if (FLAG_stop_sim_at == ULLONG_MAX) {
+  if (FLAG_stop_sim_at == ULLONG_MAX && FLAG_trace_sim_after == ULLONG_MAX) {
     // Fast version of the dispatch loop without checking whether the simulator
     // should be stopping at a particular executed instruction.
     while (program_counter != kEndSimulatingPC) {
@@ -3534,7 +3523,7 @@
       if (IsIllegalAddress(program_counter)) {
         HandleIllegalAccess(program_counter, instr);
       } else {
-        InstructionDecode(instr);
+        InstructionDecodeImpl(instr);
       }
       program_counter = get_pc();
     }
diff --git a/runtime/vm/simulator_arm.h b/runtime/vm/simulator_arm.h
index 566f857..ad94b25 100644
--- a/runtime/vm/simulator_arm.h
+++ b/runtime/vm/simulator_arm.h
@@ -50,13 +50,16 @@
   // architecture specification and is off by 8 from the currently executing
   // instruction.
   void set_register(Register reg, int32_t value);
-  int32_t get_register(Register reg) const;
+  DART_FORCE_INLINE int32_t get_register(Register reg) const {
+    ASSERT((reg >= 0) && (reg < kNumberOfCpuRegisters));
+    return registers_[reg] + ((reg == PC) ? Instr::kPCReadOffset : 0);
+  }
 
   int32_t get_sp() const { return get_register(SPREG); }
 
   // Special case of set_register and get_register to access the raw PC value.
   void set_pc(int32_t value);
-  int32_t get_pc() const;
+  DART_FORCE_INLINE int32_t get_pc() const { return registers_[PC]; }
 
   // Accessors for VFP register state.
   void set_sregister(SRegister reg, float value);
@@ -232,6 +235,7 @@
 
   // Executes one instruction.
   void InstructionDecode(Instr* instr);
+  void InstructionDecodeImpl(Instr* instr);
 
   // Executes ARM instructions until the PC reaches kEndSimulatingPC.
   void Execute();
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index 2e1c8d7..5dd9ffd 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -22,8 +22,9 @@
  *     array are the type arguments.
  *  3) `null`: the dynamic type.
  *  4) a JavaScript object representing the function type. For instance, it has
- *     the form  {ret: rti, args: [rti], opt: [rti], named: {name: rti}} for a
+ *     the form {ret: rti, args: [rti], opt: [rti], named: {name: rti}} for a
  *     function with a return type, regular, optional and named arguments.
+ *     Generic function types have a 'bounds' property.
  *
  * To check subtype relations between generic classes we use a JavaScript
  * expression that describes the necessary substitution for type arguments.
@@ -531,14 +532,25 @@
  * representations.
  *
  * The arguments [s] and [t] must be types, usually represented by the
- * constructor of the class, or an array (for generic types).
+ * constructor of the class, or an array (for generic class types).
  */
 bool isSubtype(var s, var t) {
   // Subtyping is reflexive.
   if (isIdentical(s, t)) return true;
   // If either type is dynamic, [s] is a subtype of [t].
   if (s == null || t == null) return true;
+
+  // Generic function type parameters must match exactly, which would have
+  // exited earlier. The de Bruijn indexing ensures the representation as a
+  // small number can be used for type comparison.
+  if (isGenericFunctionTypeParameter(s)) {
+    // TODO(sra):  tau <: Object.
+    return false;
+  }
+  if (isGenericFunctionTypeParameter(t)) return false;
+
   if (isNullType(s)) return true;
+
   if (isDartFunctionType(t)) {
     return isFunctionSubtype(s, t);
   }
@@ -633,8 +645,24 @@
 bool isFunctionSubtype(var s, var t) {
   assert(isDartFunctionType(t));
   if (!isDartFunctionType(s)) return false;
+  var genericBoundsTag =
+      JS_GET_NAME(JsGetName.FUNCTION_TYPE_GENERIC_BOUNDS_TAG);
   var voidReturnTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_VOID_RETURN_TAG);
   var returnTypeTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_RETURN_TYPE_TAG);
+
+  // Generic function types must agree on number of type parameters and bounds.
+  if (hasField(s, genericBoundsTag)) {
+    if (hasNoField(t, genericBoundsTag)) return false;
+    var sBounds = getField(s, genericBoundsTag);
+    var tBounds = getField(t, genericBoundsTag);
+    int sGenericParameters = getLength(sBounds);
+    int tGenericParameters = getLength(tBounds);
+    if (sGenericParameters != tGenericParameters) return false;
+    // TODO(sra): Compare bounds.
+  } else if (hasField(t, genericBoundsTag)) {
+    return false;
+  }
+
   if (hasField(s, voidReturnTag)) {
     if (hasNoField(t, voidReturnTag) && hasField(t, returnTypeTag)) {
       return false;
@@ -717,6 +745,15 @@
 }
 
 /**
+ * Returns whether [type] is the representation of a generic function type
+ * parameter. Generic function type parameters are represented de Bruijn
+ * indexes.
+ */
+bool isGenericFunctionTypeParameter(var type) {
+  return type is num; // Actually int, but 'is num' is faster.
+}
+
+/**
  * Calls the JavaScript [function] with the [arguments] with the global scope
  * as the `this` context.
  */
diff --git a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart b/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
index 5b40739..e1eb66d 100644
--- a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
+++ b/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
@@ -327,6 +327,11 @@
   /// Name used to tag a function type.
   FUNCTION_TYPE_TAG,
 
+  /// Name used to tag bounds of a generic function type. If bounds are present,
+  /// the property value is an Array of bounds (the length gives the number of
+  /// type parameters). If absent, the type is not a generic function type.
+  FUNCTION_TYPE_GENERIC_BOUNDS_TAG,
+
   /// Name used to tag void return in function type representations in
   /// JavaScript.
   FUNCTION_TYPE_VOID_RETURN_TAG,
diff --git a/sdk/lib/core/iterable.dart b/sdk/lib/core/iterable.dart
index 864dc0f..e91b3a8 100644
--- a/sdk/lib/core/iterable.dart
+++ b/sdk/lib/core/iterable.dart
@@ -111,6 +111,17 @@
   const factory Iterable.empty() = EmptyIterable<E>;
 
   /**
+   * Adapts [source] to be an `Iterable<T>`.
+   *
+   * Any time the iterable would produce an element that is not a [T],
+   * the element access will throw. If all elements of [source] are actually
+   * instances of [T], or if only elements that are actually instances of [T]
+   * are accessed, then the resulting iterable can be used as an `Iterable<T>`.
+   */
+  static Iterable<T> castTo<S, T>(Iterable<S> source) =>
+      new CastIterable<S, T>(source);
+
+  /**
    * Returns a new `Iterator` that allows iterating the elements of this
    * `Iterable`.
    *
diff --git a/sdk/lib/core/list.dart b/sdk/lib/core/list.dart
index e412b3e..3f3f381 100644
--- a/sdk/lib/core/list.dart
+++ b/sdk/lib/core/list.dart
@@ -156,6 +156,22 @@
   external factory List.unmodifiable(Iterable elements);
 
   /**
+   * Adapts [source] to be a `List<T>`.
+   *
+   * Any time the list would produce an element that is not a [T],
+   * the element access will throw.
+   *
+   * Any time a [T] value is attempted stored into the adapted list,
+   * the store will throw unless the value is also an instance of [S].
+   *
+   * If all accessed elements of [source] are actually instances of [T],
+   * and if all elements stored into the returned list are actually instance
+   * of [S],
+   * then the returned list can be used as a `List<T>`.
+   */
+  static List<T> castTo<S, T>(List<S> source) => new CastList<S, T>(source);
+
+  /**
    * Returns the object at the given [index] in the list
    * or throws a [RangeError] if [index] is out of bounds.
    */
diff --git a/sdk/lib/core/map.dart b/sdk/lib/core/map.dart
index fb5a596..316febb 100644
--- a/sdk/lib/core/map.dart
+++ b/sdk/lib/core/map.dart
@@ -143,6 +143,23 @@
       LinkedHashMap<K, V>.fromIterables;
 
   /**
+   * Adapts [source] to be a `Map<K2, V2>`.
+   *
+   * Any time the set would produce a key or value that is not a [K2] or [V2],
+   * the access will throw.
+   *
+   * Any time [K2] key or [V2] value is attempted added into the adapted map,
+   * the store will throw unless the key is also an instance of [K] and
+   * the value is also an instance of [V].
+   *
+   * If all accessed entries of [source] are have [K2] keys and [V2] values
+   * and if all entries added to the returned map have [K] keys and [V]] values,
+   * then the returned map can be used as a `Map<K2, V2>`.
+   */
+  static Map<K2, V2> castTo<K, V, K2, V2>(Map<K, V> source) =>
+      new CastMap<K, V, K2, V2>(source);
+
+  /**
    * Returns true if this map contains the given [value].
    *
    * Returns true if any of the values in the map are equal to `value`
diff --git a/sdk/lib/core/set.dart b/sdk/lib/core/set.dart
index 2d0bda5..1813fc7 100644
--- a/sdk/lib/core/set.dart
+++ b/sdk/lib/core/set.dart
@@ -79,6 +79,29 @@
   factory Set.from(Iterable elements) = LinkedHashSet<E>.from;
 
   /**
+   * Adapts [source] to be a `Set<T>`.
+   *
+   * If [newSet] is provided, it is used to create the new sets returned
+   * by [toSet], [union], and is also used for [intersection] and [difference].
+   * If [newSet] is omitted, it defaults to creating a new set using the
+   * default [Set] constructor, and [intersection] and [difference]
+   * returns an adapted version of calling the same method on the source.
+   *
+   * Any time the set would produce an element that is not a [T],
+   * the element access will throw.
+   *
+   * Any time a [T] value is attempted added into the adapted set,
+   * the store will throw unless the value is also an instance of [S].
+   *
+   * If all accessed elements of [source] are actually instances of [T],
+   * and if all elements added to the returned set are actually instance
+   * of [S],
+   * then the returned set can be used as a `Set<T>`.
+   */
+  static Set<T> castTo<S, T>(Set<S> source, {Set<R> Function<R>() newSet}) =>
+      new CastSet<S, T>(source, newSet);
+
+  /**
    * Provides an iterator that iterates over the elements of this set.
    *
    * The order of iteration is defined by the individual `Set` implementation,
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index ef20c8d..b301d80 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -1694,7 +1694,7 @@
         if (argumentError) {
           throw new ArgumentError("Illegal character in path");
         } else {
-          throw new UnsupportedError("Illegal character in path");
+          throw new UnsupportedError("Illegal character in path: $segment");
         }
       }
     }
diff --git a/sdk/lib/internal/cast.dart b/sdk/lib/internal/cast.dart
new file mode 100644
index 0000000..4a39115
--- /dev/null
+++ b/sdk/lib/internal/cast.dart
@@ -0,0 +1,352 @@
+// Copyright (c) 2012, 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._internal;
+
+// Casting wrappers for collections and asynchronous classes.
+
+abstract class _CastIterableBase<S, T> extends Iterable<T> {
+  Iterable<S> get _source;
+
+  Iterator<T> get iterator => new CastIterator<S, T>(_source.iterator);
+
+  // The following members use the default implementation on the
+  // throwing iterator. These are all operations that have no more efficient
+  // implementation than visiting every element in order,
+  // or that has no more efficient way to get the correct type (toList, toSet).
+  //
+  // * map
+  // * where
+  // * expand
+  // * forEach
+  // * reduce
+  // * fold
+  // * every
+  // * any
+  // * join
+  // * toList
+  // * toSet
+  // * skipWhile
+  // * takeWhile
+  // * firstWhere
+  // * singleWhere
+
+  int get length => _source.length;
+  bool get isEmpty => _source.isEmpty;
+  bool get isNotEmpty => _source.isNotEmpty;
+
+  Iterable<T> skip(int count) => new CastIterable<S, T>(_source.skip(count));
+  Iterable<T> take(int count) => new CastIterable<S, T>(_source.take(count));
+
+  T elementAt(int index) => _source.elementAt(index) as T;
+  T get first => _source.first as T;
+  T get last => _source.last as T;
+  T get single => _source.single as T;
+
+  bool contains(Object other) => _source.contains(other);
+
+  // Might be implemented by testing backwards from the end,
+  // so use the _source's implementation.
+  T lastWhere(bool test(T element), {T orElse()}) =>
+      _source.lastWhere((S element) => test(element as T),
+          orElse: (orElse == null) ? null : () => orElse() as S) as T;
+
+  String toString() => _source.toString();
+}
+
+class CastIterator<S, T> implements Iterator<T> {
+  Iterator<S> _source;
+  CastIterator(this._source);
+  bool moveNext() => _source.moveNext();
+  T get current => _source.current as T;
+}
+
+class CastIterable<S, T> extends _CastIterableBase<S, T> {
+  final Iterable<S> _source;
+
+  CastIterable._(this._source);
+
+  factory CastIterable(Iterable<S> source) {
+    if (source is EfficientLengthIterable<S>) {
+      return new _EfficientLengthCastIterable<S, T>(source);
+    }
+    return new CastIterable<S, T>._(source);
+  }
+
+  Iterable<R> cast<R>() => new CastIterable<S, R>(_source);
+}
+
+class _EfficientLengthCastIterable<S, T> extends CastIterable<S, T>
+    implements EfficientLengthIterable<T> {
+  _EfficientLengthCastIterable(EfficientLengthIterable<S> source)
+      : super._(source);
+}
+
+abstract class _CastListBase<S, T> extends _CastIterableBase<S, T>
+    with ListMixin<T> {
+  List<S> get _source;
+
+  // Using the default implementation from ListMixin:
+  // * reversed
+  // * shuffle
+  // * indexOf
+  // * lastIndexOf
+  // * clear
+  // * sublist
+  // * asMap
+
+  T operator [](int index) => _source[index] as T;
+
+  void operator []=(int index, T value) {
+    _source[index] = value as S;
+  }
+
+  void set length(int length) {
+    _source.length = length;
+  }
+
+  void add(T value) {
+    _source.add(value as S);
+  }
+
+  void addAll(Iterable<T> values) {
+    _source.addAll(new CastIterable<T, S>(values));
+  }
+
+  void sort([int compare(T v1, T v2)]) {
+    _source.sort((S v1, S v2) => compare(v1 as T, v2 as T));
+  }
+
+  void shuffle([Random random]) {
+    _source.shuffle(random);
+  }
+
+  void insert(int index, T element) {
+    _source.insert(index, element as S);
+  }
+
+  void insertAll(int index, Iterable<T> elements) {
+    _source.insertAll(index, new CastIterable<T, S>(elements));
+  }
+
+  void setAll(int index, Iterable<T> elements) {
+    _source.setAll(index, new CastIterable<T, S>(elements));
+  }
+
+  bool remove(Object value) => _source.remove(value);
+
+  T removeAt(int index) => _source.removeAt(index) as T;
+
+  T removeLast() => _source.removeLast() as T;
+
+  void removeWhere(bool test(T element)) {
+    _source.removeWhere((S element) => test(element as T));
+  }
+
+  void retainWhere(bool test(T element)) {
+    _source.retainWhere((S element) => test(element as T));
+  }
+
+  Iterable<T> getRange(int start, int end) =>
+      new CastIterable<S, T>(_source.getRange(start, end));
+
+  void setRange(int start, int end, Iterable<T> iterable, [int skipCount = 0]) {
+    _source.setRange(start, end, new CastIterable<T, S>(iterable), skipCount);
+  }
+
+  void removeRange(int start, int end) {
+    _source.removeRange(start, end);
+  }
+
+  void fillRange(int start, int end, [T fillValue]) {
+    _source.fillRange(start, end, fillValue as S);
+  }
+
+  void replaceRange(int start, int end, Iterable<T> replacement) {
+    _source.replaceRange(start, end, new CastIterable<T, S>(replacement));
+  }
+}
+
+class CastList<S, T> extends _CastListBase<S, T> {
+  final List<S> _source;
+  CastList(this._source);
+
+  List<R> cast<R>() => new CastList<S, R>(_source);
+}
+
+class CastSet<S, T> extends _CastIterableBase<S, T> implements Set<T> {
+  final Set<S> _source;
+
+  /// Creates a new empty set of the same *kind* as [_source],
+  /// but with `<R>` as type argument.
+  /// Used by [toSet] (and indirectly by [union]).
+  final Set<R> Function<R>() _emptySet;
+
+  CastSet(this._source, this._emptySet);
+
+  static Set<R> _defaultEmptySet<R>() => new Set<R>();
+
+  Set<R> cast<R>() => new CastSet<S, R>(_source, _emptySet);
+
+  bool add(T value) => _source.add(value as S);
+
+  void addAll(Iterable<T> elements) {
+    _source.addAll(new CastIterable<T, S>(elements));
+  }
+
+  bool remove(Object object) => _source.remove(object);
+
+  void removeAll(Iterable<Object> objects) {
+    _source.removeAll(objects);
+  }
+
+  void retainAll(Iterable<Object> objects) {
+    _source.retainAll(objects);
+  }
+
+  void removeWhere(bool test(T element)) {
+    _source.removeWhere((S element) => test(element as T));
+  }
+
+  void retainWhere(bool test(T element)) {
+    _source.retainWhere((S element) => test(element as T));
+  }
+
+  bool containsAll(Iterable<Object> objects) => _source.containsAll(objects);
+
+  Set<T> intersection(Set<Object> other) {
+    if (_emptySet != null) return _conditionalAdd(other, true);
+    return new CastSet<S, T>(_source.intersection(other), null);
+  }
+
+  Set<T> difference(Set<Object> other) {
+    if (_emptySet != null) return _conditionalAdd(other, false);
+    return new CastSet<S, T>(_source.difference(other), null);
+  }
+
+  Set<T> _conditionalAdd(Set<Object> other, bool otherContains) {
+    Set<T> result = (_emptySet == null) ? new Set<T>() : _emptySet<T>();
+    for (var element in _source) {
+      T castElement = element as T;
+      if (otherContains == other.contains(castElement)) result.add(castElement);
+    }
+    return result;
+  }
+
+  Set<T> union(Set<T> other) => _clone()..addAll(other);
+
+  void clear() {
+    _source.clear();
+  }
+
+  Set<T> _clone() {
+    Set<T> result = (_emptySet == null) ? new Set<T>() : _emptySet<T>();
+    result.addAll(this);
+    return result;
+  }
+
+  Set<T> toSet() => _clone();
+
+  T lookup(Object key) => _source.lookup(key) as T;
+}
+
+abstract class _CastQueueMixin<S, T> implements Queue<T> {
+  Queue<S> get _source;
+
+  T removeFirst() => _source.removeFirst() as T;
+  T removeLast() => _source.removeLast() as T;
+
+  @deprecated
+  void add(T value) {
+    _source.add(value as S);
+  }
+
+  void addFirst(T value) {
+    _source.addFirst(value as S);
+  }
+
+  void addLast(T value) {
+    _source.addLast(value as S);
+  }
+
+  bool remove(Object other) => _source.remove(other);
+  void addAll(Iterable<T> elements) {
+    _source.addAll(new CastIterable<T, S>(elements));
+  }
+
+  void removeWhere(bool test(T element)) {
+    _source.removeWhere((S element) => test(element as T));
+  }
+
+  void retainWhere(bool test(T element)) {
+    _source.retainWhere((S element) => test(element as T));
+  }
+
+  void clear() {
+    _source.clear();
+  }
+}
+
+class CastMap<SK, SV, K, V> implements Map<K, V> {
+  final Map<SK, SV> _source;
+
+  CastMap(this._source);
+
+  Map<RK, RV> cast<RK, RV>() => new CastMap<SK, SV, RK, RV>(_source);
+
+  bool containsValue(Object value) => _source.containsValue(value);
+
+  bool containsKey(Object key) => _source.containsKey(key);
+
+  V operator [](Object key) => _source[key] as V;
+
+  void operator []=(K key, V value) {
+    _source[key as SK] = value as SV;
+  }
+
+  V putIfAbsent(K key, V ifAbsent()) => _source.putIfAbsent(
+      key as SK, (ifAbsent == null) ? null : () => ifAbsent() as SV) as V;
+
+  void addAll(Map<K, V> other) {
+    _source.addAll(new CastMap<K, V, SK, SV>(other));
+  }
+
+  V remove(Object key) => _source.remove(key) as V;
+
+  void clear() {
+    _source.clear();
+  }
+
+  void forEach(void f(K key, V value)) {
+    _source.forEach((SK key, SV value) {
+      f(key as K, value as V);
+    });
+  }
+
+  Iterable<K> get keys => new CastIterable<SK, K>(_source.keys);
+
+  Iterable<V> get values => new CastIterable<SV, V>(_source.values);
+
+  int get length => _source.length;
+
+  bool get isEmpty => _source.isEmpty;
+
+  bool get isNotEmpty => _source.isNotEmpty;
+}
+
+class CastQueue<S, T> extends _CastIterableBase<S, T>
+    with _CastQueueMixin<S, T> {
+  final Queue<S> _source;
+  CastQueue(this._source);
+  Queue<R> cast<R>() => new CastQueue<S, R>(_source);
+}
+
+// TODO(lrn): Use when ListQueue implements List.
+// class CastListQueue<S, T>
+//     extends _CastListBase<S, T> with _CastQueueMixin<S, T>
+//     implements ListQueue<T> {
+//   final ListQueue<S> _source;
+//   CastListQueue(this._source);
+//   ListQueue<R> cast<R>() => new CastListQueue<S, R>(_source);
+// }
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index eeb0f85..430698c 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -10,6 +10,7 @@
 import 'dart:core' as core;
 import 'dart:math' show Random;
 
+part 'cast.dart';
 part 'iterable.dart';
 part 'list.dart';
 part 'print.dart';
diff --git a/sdk/lib/internal/internal_sources.gni b/sdk/lib/internal/internal_sources.gni
index 9f7db6b..6acd227 100644
--- a/sdk/lib/internal/internal_sources.gni
+++ b/sdk/lib/internal/internal_sources.gni
@@ -7,6 +7,7 @@
   "internal.dart",
 
   # The above file needs to be first as it lists the parts below.
+  "cast.dart",
   "iterable.dart",
   "list.dart",
   "linked_list.dart",
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index be5d4a9..9c6b0b9 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -32,8 +32,12 @@
 Language/Expressions/Await_Expressions/evaluation_throws_t04: RuntimeError # Please triage this failure
 Language/Expressions/Await_Expressions/evaluation_throws_t06: RuntimeError # Please triage this failure
 Language/Expressions/Await_Expressions/evaluation_throws_t07: RuntimeError # Please triage this failure
+Language/Expressions/Constants/exception_t02: Crash # Issue 31762
 Language/Expressions/Constants/identifier_denotes_a_constant_t06: MissingCompileTimeError # Issue 26580
 Language/Expressions/Constants/identifier_denotes_a_constant_t07: MissingCompileTimeError # Issue 26580
+Language/Expressions/Constants/literal_number_t01: Crash # Issue 31762
+Language/Expressions/Constants/math_operators_t01: Crash # Issue 31762
+Language/Expressions/Constants/math_operators_t06: Crash # Issue 31762
 Language/Expressions/Function_Invocation/async_cleanup_t01: Skip # https://github.com/dart-lang/sdk/issues/28873
 Language/Expressions/Function_Invocation/async_cleanup_t03: Skip # https://github.com/dart-lang/sdk/issues/28873
 Language/Expressions/Function_Invocation/async_cleanup_t05: Skip # https://github.com/dart-lang/sdk/issues/28873
@@ -50,8 +54,12 @@
 Language/Expressions/Maps/static_type_dynamic_t01: CompileTimeError # Maybe ok. Issue 17207
 Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t01: MissingCompileTimeError # Issue 25496
 Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t02: MissingCompileTimeError # Issue 25496
+Language/Expressions/Numbers/static_type_of_int_t01: Crash # Issue 31762
+Language/Expressions/Numbers/syntax_t06: Crash # Issue 31762
 Language/Expressions/Numbers/syntax_t06: Fail # Issue 21098
+Language/Expressions/Numbers/syntax_t09: Crash # Issue 31762
 Language/Expressions/Numbers/syntax_t09: Fail # Issue 21098
+Language/Expressions/Numbers/syntax_t10: Crash # Issue 31762
 Language/Expressions/Object_Identity/Object_Identity/constant_objects_t01: Fail # Issue 11551, also related to issue 563, 18738
 Language/Expressions/Object_Identity/Object_Identity/double_t02: Fail # Issue 11551, also related to issue 563, 18738
 Language/Expressions/Object_Identity/constant_objects_t01: RuntimeError # Please triage this failure
@@ -183,19 +191,64 @@
 LibTest/core/RegExp/Pattern_semantics/splitQueryString_A02_t01: Pass, RuntimeError # https://github.com/dart-lang/sdk/issues/29814
 LibTest/core/double/INFINITY_A01_t04: RuntimeError # Expected to fail because double.INFINITY is int.
 LibTest/core/double/NEGATIVE_INFINITY_A01_t04: RuntimeError # Expected to fail because double.NEGATIVE_INFINITY is int.
+LibTest/core/double/isInfinite_A01_t03: Crash # Issue 31762
+LibTest/core/double/operator_GE_A01_t02: Crash # Issue 31762
+LibTest/core/double/operator_GT_A01_t02: Crash # Issue 31762
+LibTest/core/double/operator_LE_A01_t02: Crash # Issue 31762
+LibTest/core/double/operator_LT_A01_t02: Crash # Issue 31762
+LibTest/core/int/abs_A01_t01: Crash # Issue 31762
+LibTest/core/int/ceilToDouble_A01_t01: Crash # Issue 31762
+LibTest/core/int/ceil_A01_t01: Crash # Issue 31762
+LibTest/core/int/compareTo_A01_t01: Crash # Issue 31762
+LibTest/core/int/floorToDouble_A01_t01: Crash # Issue 31762
+LibTest/core/int/floor_A01_t01: Crash # Issue 31762
+LibTest/core/int/hashCode_A01_t01: Crash # Issue 31762
 LibTest/core/int/hashCode_A01_t01: RuntimeError, OK # co19 issue 308
 LibTest/core/int/isEven_A01_t01: RuntimeError, OK # co19 issue 277
+LibTest/core/int/isEven_A01_t01: Crash # Issue 31762
+LibTest/core/int/isInfinite_A01_t01: Crash # Issue 31762
+LibTest/core/int/isNaN_A01_t01: Crash # Issue 31762
+LibTest/core/int/isNegative_A01_t01: Crash # Issue 31762
 LibTest/core/int/isOdd_A01_t01: RuntimeError, OK # co19 issue 277
+LibTest/core/int/isOdd_A01_t01: Crash # Issue 31762
 LibTest/core/int/operator_AND_A01_t01: RuntimeError, OK # Requires bigints.
+LibTest/core/int/operator_AND_A01_t01: Crash # Issue 31762
+LibTest/core/int/operator_GE_A01_t01: Crash # Issue 31762
 LibTest/core/int/operator_GT_A01_t01: RuntimeError, OK # co19 issue 200
+LibTest/core/int/operator_GT_A01_t01: Crash # Issue 31762
+LibTest/core/int/operator_LE_A01_t01: Crash # Issue 31762
 LibTest/core/int/operator_LT_A01_t01: RuntimeError, OK # co19 issue 200
+LibTest/core/int/operator_LT_A01_t01: Crash # Issue 31762
+LibTest/core/int/operator_NOT_A01_t01: Crash # Issue 31762
 LibTest/core/int/operator_NOT_A01_t01: RuntimeError, OK # Expects negative result from bit-operation.
 LibTest/core/int/operator_OR_A01_t01: RuntimeError, OK # Requires bigints.
+LibTest/core/int/operator_OR_A01_t01: Crash # Issue 31762
 LibTest/core/int/operator_XOR_A01_t01: RuntimeError, OK # Requires bigints.
+LibTest/core/int/operator_XOR_A01_t01: Crash # Issue 31762
 LibTest/core/int/operator_addition_A01_t01: RuntimeError, OK # co19 issue 200
+LibTest/core/int/operator_addition_A01_t01: Crash # Issue 31762
+LibTest/core/int/operator_division_A01_t01: Crash # Issue 31762
+LibTest/core/int/operator_left_shift_A01_t01: Crash # Issue 31762
+LibTest/core/int/operator_multiplication_A01_t01: Crash # Issue 31762
+LibTest/core/int/operator_remainder_A01_t01: Crash # Issue 31762
 LibTest/core/int/operator_remainder_A01_t01: RuntimeError, OK # Requires bigints.
+LibTest/core/int/operator_remainder_A01_t02: Crash # Issue 31762
 LibTest/core/int/operator_right_shift_A01_t01: RuntimeError, OK # Expects negative result from bit-operation.
+LibTest/core/int/operator_right_shift_A01_t01: Crash # Issue 31762
+LibTest/core/int/operator_subtraction_A01_t01: Crash # Issue 31762
+LibTest/core/int/operator_truncating_division_A01_t01: Crash # Issue 31762
+LibTest/core/int/operator_truncating_division_A01_t02: Crash # Issue 31762
+LibTest/core/int/operator_unary_minus_A01_t01: Crash # Issue 31762
+LibTest/core/int/parse_A01_t01: Crash # Issue 31762
+LibTest/core/int/remainder_A01_t01: Crash # Issue 31762
+LibTest/core/int/remainder_A01_t02: Crash # Issue 31762
+LibTest/core/int/roundToDouble_A01_t01: Crash # Issue 31762
+LibTest/core/int/round_A01_t01: Crash # Issue 31762
+LibTest/core/int/toDouble_A01_t01: Crash # Issue 31762
 LibTest/core/int/toDouble_A01_t01: RuntimeError, OK # co19 issue 200
+LibTest/core/int/toInt_A01_t01: Crash # Issue 31762
+LibTest/core/int/truncateToDouble_A01_t01: Crash # Issue 31762
+LibTest/core/int/truncate_A01_t01: Crash # Issue 31762
 LibTest/html/Element/addEventListener_A01_t04: Skip # https://github.com/dart-lang/sdk/issues/28873
 LibTest/html/HttpRequest/responseType_A01_t03: CompileTimeError # co19-roll r706: Please triage this failure
 LibTest/html/IFrameElement/addEventListener_A01_t04: Skip # https://github.com/dart-lang/sdk/issues/28873
@@ -218,6 +271,8 @@
 LibTest/math/MutableRectangle/boundingBox_A01_t01: RuntimeError, Pass # co19-roll r706: Please triage this failure.
 LibTest/math/Rectangle/boundingBox_A01_t01: RuntimeError, Pass # co19-roll r706: Please triage this failure.
 LibTest/math/pow_A04_t01: Fail # co19-roll r587: Please triage this failure
+LibTest/math/pow_A09_t01: Crash # Issue 31762
+LibTest/math/pow_A10_t01: Crash # Issue 31762
 LibTest/math/pow_A14_t01: Fail # co19-roll r587: Please triage this failure
 LibTest/math/pow_A16_t01: Fail # co19-roll r587: Please triage this failure
 LibTest/typed_data/ByteData/*Int64*: Fail # co19-roll r569: Please triage this failure
@@ -238,6 +293,7 @@
 LibTest/typed_data/ByteData/getInt16_A02_t02: Fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/getInt32_A02_t01: Fail # Issue 12989
 LibTest/typed_data/ByteData/getInt32_A02_t02: Fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/getInt64_A01_t01: Crash # Issue 31762
 LibTest/typed_data/ByteData/getInt64_A02_t02: Fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/getInt8_A02_t01: Fail # Issue 12989
 LibTest/typed_data/ByteData/getInt8_A02_t02: Fail # Issue 12989
@@ -245,6 +301,7 @@
 LibTest/typed_data/ByteData/getUint16_A02_t02: Fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/getUint32_A02_t01: Fail # Issue 12989
 LibTest/typed_data/ByteData/getUint32_A02_t02: Fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/getUint64_A01_t01: Crash # Issue 31762
 LibTest/typed_data/ByteData/getUint64_A02_t02: Fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/getUint8_A02_t01: Fail # Issue 12989
 LibTest/typed_data/ByteData/getUint8_A02_t02: Fail # Issue 12989
@@ -256,6 +313,7 @@
 LibTest/typed_data/ByteData/setInt16_A02_t02: Fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/setInt32_A02_t01: Fail # Issue 12989
 LibTest/typed_data/ByteData/setInt32_A02_t02: Fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/setInt64_A01_t01: Crash # Issue 31762
 LibTest/typed_data/ByteData/setInt64_A02_t02: Fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/setInt8_A02_t01: Fail # Issue 12989
 LibTest/typed_data/ByteData/setInt8_A02_t02: Fail # Issue 12989
@@ -263,6 +321,7 @@
 LibTest/typed_data/ByteData/setUint16_A02_t02: Fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/setUint32_A02_t01: Fail # Issue 12989
 LibTest/typed_data/ByteData/setUint32_A02_t02: Fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/setUint64_A01_t01: Crash # Issue 31762
 LibTest/typed_data/ByteData/setUint64_A02_t02: Fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/setUint8_A02_t01: Fail # Issue 12989
 LibTest/typed_data/ByteData/setUint8_A02_t02: Fail # Issue 12989
@@ -302,6 +361,10 @@
 LibTest/typed_data/Int32List/Int32List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
 LibTest/typed_data/Int32List/Int32List_A02_t01: Fail # co19-roll r576: Please triage this failure
 LibTest/typed_data/Int64List/*: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int64List/Int64List.fromList_A01_t01: Crash # Issue 31762
+LibTest/typed_data/Int64List/Int64List.fromList_A01_t02: Crash # Issue 31762
+LibTest/typed_data/Int64List/Int64List.view_A01_t01: Crash # Issue 31762
+LibTest/typed_data/Int64List/Int64List.view_A01_t02: Crash # Issue 31762
 LibTest/typed_data/Int64List/Int64List_A02_t01: Pass # co19-roll r559: Please triage this failure
 LibTest/typed_data/Int8List/Int8List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
 LibTest/typed_data/Int8List/Int8List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
@@ -316,6 +379,10 @@
 LibTest/typed_data/Uint32List/Uint32List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
 LibTest/typed_data/Uint32List/Uint32List_A02_t01: Fail # co19-roll r576: Please triage this failure
 LibTest/typed_data/Uint64List/*: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint64List/Uint64List.fromList_A01_t01: Crash # Issue 31762
+LibTest/typed_data/Uint64List/Uint64List.fromList_A01_t02: Crash # Issue 31762
+LibTest/typed_data/Uint64List/Uint64List.view_A01_t01: Crash # Issue 31762
+LibTest/typed_data/Uint64List/Uint64List.view_A01_t02: Crash # Issue 31762
 LibTest/typed_data/Uint64List/Uint64List_A02_t01: Pass # co19-roll r559: Please triage this failure
 LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
 LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 92571b0..88395aa 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -273,8 +273,15 @@
 
 [ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
 Language/Expressions/Assignment/super_assignment_failed_t05: RuntimeError # Issue 25671
+Language/Expressions/Constants/literal_number_t01: CompileTimeError # Large integer literal
+Language/Expressions/Constants/math_operators_t01: CompileTimeError # Large integer literal
+Language/Expressions/Constants/math_operators_t06: CompileTimeError # Large integer literal
 Language/Expressions/Function_Invocation/async_generator_invokation_t08: Fail # Issue 25967
 Language/Expressions/Function_Invocation/async_generator_invokation_t10: Fail # Issue 25967
+Language/Expressions/Numbers/static_type_of_int_t01: CompileTimeError # Large integer literal
+Language/Expressions/Numbers/syntax_t06: CompileTimeError # Large integer literal
+Language/Expressions/Numbers/syntax_t09: CompileTimeError # Large integer literal
+Language/Expressions/Numbers/syntax_t10: CompileTimeError # Large integer literal
 Language/Libraries_and_Scripts/Exports/reexport_t02: MissingCompileTimeError, Fail # Dart issue 12916
 Language/Libraries_and_Scripts/Scripts/top_level_main_t01: Skip # Issue 29895
 Language/Statements/Assert/execution_t02: Skip # co19 issue 734
@@ -286,6 +293,14 @@
 Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t10: RuntimeError # Issue 25748
 Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_sync_t05: RuntimeError # Issue 25662,25634
 LayoutTests/fast/*: SkipByDesign # DOM not supported on VM.
+LibTest/collection/ListBase/ListBase_class_A01_t01: RuntimeError # Large integers
+LibTest/collection/ListMixin/ListMixin_class_A01_t01: RuntimeError # Large integers
+LibTest/core/Duration/inDays_A01_t01: RuntimeError # Large integers
+LibTest/core/Duration/inHours_A01_t01: RuntimeError # Large integers
+LibTest/core/Duration/inMilliseconds_A01_t01: RuntimeError # Large integers
+LibTest/core/Duration/inMinutes_A01_t01: RuntimeError # Large integers
+LibTest/core/Duration/inSeconds_A01_t01: RuntimeError # Large integers
+LibTest/core/List/List_class_A01_t01: RuntimeError # Large integers
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: RuntimeError # Issue 1296
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError, Fail # Issue 22200
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: RuntimeError, Fail # Issue 22200
@@ -293,7 +308,52 @@
 LibTest/core/RegExp/Pattern_semantics/splitQueryString_A02_t01: RuntimeError # Issue 1296
 LibTest/core/Symbol/Symbol_A01_t03: RuntimeError # Issue 13596
 LibTest/core/Symbol/Symbol_A01_t05: RuntimeError # Issue 13596
+LibTest/core/double/ceil_A01_t04: RuntimeError # Large integers
+LibTest/core/double/floor_A01_t04: RuntimeError # Large integers
+LibTest/core/double/isInfinite_A01_t03: CompileTimeError # Large integer literal
+LibTest/core/double/round_A01_t03: RuntimeError # Large integers
+LibTest/core/double/toInt_A01_t05: RuntimeError # Large integers
+LibTest/core/double/truncate_A01_t05: RuntimeError # Large integers
+LibTest/core/int/abs_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/ceilToDouble_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/ceil_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/compareTo_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/floorToDouble_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/floor_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/isEven_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/isInfinite_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/isNaN_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/isNegative_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/isOdd_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_AND_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_GE_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_GT_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_LE_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_LT_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_NOT_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_OR_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_XOR_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_addition_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_division_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_left_shift_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_multiplication_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_remainder_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_remainder_A01_t02: CompileTimeError # Large integer literal
+LibTest/core/int/operator_right_shift_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_subtraction_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_truncating_division_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/operator_truncating_division_A01_t02: CompileTimeError # Large integer literal
+LibTest/core/int/operator_unary_minus_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/parse_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/remainder_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/remainder_A01_t02: CompileTimeError # Large integer literal
+LibTest/core/int/roundToDouble_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/round_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/toDouble_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/toInt_A01_t01: CompileTimeError # Large integer literal
 LibTest/core/int/toRadixString_A01_t01: Fail # co19 issue 492
+LibTest/core/int/truncateToDouble_A01_t01: CompileTimeError # Large integer literal
+LibTest/core/int/truncate_A01_t01: CompileTimeError # Large integer literal
 LibTest/html/*: SkipByDesign # dart:html not supported on VM.
 LibTest/isolate/Isolate/spawnUri_A02_t02: Skip # Issue 15974
 LibTest/isolate/Isolate/spawnUri_A02_t03: Skip # Issue 15974
@@ -304,8 +364,15 @@
 LibTest/isolate/Isolate/spawn_A04_t04: Skip # Issue 15974
 LibTest/isolate/Isolate/spawn_A06_t03: Skip # Issue 15974
 LibTest/isolate/Isolate/spawn_A06_t05: Skip # Issue 15974
+LibTest/math/pow_A10_t01: CompileTimeError # Large integer literal
+LibTest/typed_data/ByteData/getUint64_A01_t01: CompileTimeError # Large integer literal
+LibTest/typed_data/ByteData/setUint64_A01_t01: CompileTimeError # Large integer literal
 LibTest/typed_data/Float32x4/reciprocalSqrt_A01_t01: Pass, Fail # co19 issue 599
 LibTest/typed_data/Float32x4/reciprocal_A01_t01: Pass, Fail # co19 issue 599
+LibTest/typed_data/Uint64List/Uint64List.fromList_A01_t01: CompileTimeError # Large integer literal
+LibTest/typed_data/Uint64List/Uint64List.fromList_A01_t02: CompileTimeError # Large integer literal
+LibTest/typed_data/Uint64List/Uint64List.view_A01_t01: CompileTimeError # Large integer literal
+LibTest/typed_data/Uint64List/Uint64List.view_A01_t02: CompileTimeError # Large integer literal
 WebPlatformTest/*: SkipByDesign # dart:html not supported on VM.
 
 [ $runtime == flutter || $hot_reload || $hot_reload_rollback ]
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_relations_test.dart b/tests/compiler/dart2js/codegen/simple_inferrer_relations_test.dart
similarity index 72%
rename from tests/compiler/dart2js/inference/simple_inferrer_relations_test.dart
rename to tests/compiler/dart2js/codegen/simple_inferrer_relations_test.dart
index 9125ad8..b89d27a 100644
--- a/tests/compiler/dart2js/inference/simple_inferrer_relations_test.dart
+++ b/tests/compiler/dart2js/codegen/simple_inferrer_relations_test.dart
@@ -50,10 +50,19 @@
 """;
 
 void main() {
-  asyncTest(() => compileAll(TEST).then((generated) {
-        if (generated.contains(r'=== true')) {
-          print(generated);
-          Expect.fail("missing elision of '=== true'");
-        }
-      }));
+  runTest({bool useKernel}) async {
+    String generated = await compileAll(TEST,
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+    if (generated.contains(r'=== true')) {
+      print(generated);
+      Expect.fail("missing elision of '=== true'");
+    }
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 5984d35..dcf56c9 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -1,6 +1,7 @@
+# Copyright (c) 2012, 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.
-# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+
 analyze_dart_test: Slow, Pass
 analyze_test: Slow, Pass
 async_await_syntax_test: Pass # DON'T CHANGE THIS LINE -- Don't mark these tests as failing. Instead, fix the errors/warnings that they report or update the whitelist in the test-files to temporarily allow digression.
@@ -8,6 +9,7 @@
 codegen/gvn_dynamic_field_get_test: Fail # Issue 18519
 codegen/load_elimination_test: Pass, Slow
 codegen/logical_expression_test: Fail # Issue 17027
+codegen/number_output_test: RuntimeError # Issue 31762
 codegen/simple_function_subtype_test: Fail # simple_function_subtype_test is temporarily(?) disabled due to new method for building function type tests.
 deferred_loading/deferred_loading_test: Slow, Pass
 equivalence/id_equivalence_test: Pass, Slow
@@ -17,6 +19,7 @@
 inference/simple_inferrer_global_field_closure_test: Fail # Issue 16507
 inference/swarm_test: Slow, Pass
 inlining/inlining_test: Slow, Pass
+js/js_parser_test: RuntimeError # Issue 31762
 kernel/*: Slow, Pass
 kernel/compile_from_dill_fast_startup_test: RuntimeError # Test must be updated to support FE with patching.
 kernel/compile_from_dill_test: RuntimeError # Test must be updated to support FE with patching.
@@ -44,13 +47,18 @@
 serialization/compilation4_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/compilation5_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/compilation_1_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
+serialization/equivalence_test: RuntimeError # Issue 31762
+serialization/impact_test: RuntimeError # Issue 31762
 serialization/library_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
+serialization/model0_test: RuntimeError # Issue 31762
 serialization/model1_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/model3_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/model4_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/model5_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/model_1_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/native_data_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
+serialization/reserialization_test: RuntimeError # Issue 31762
+serialization/resolved_ast_test: RuntimeError # Issue 31762
 sourcemaps/source_mapping_invokes_test: Pass, Slow
 sourcemaps/source_mapping_operators_test: Pass, Slow
 sourcemaps/source_mapping_test: Pass, Slow
diff --git a/tests/compiler/dart2js/deferred_loading/data/shared_constant.dart b/tests/compiler/dart2js/deferred_loading/data/shared_constant.dart
new file mode 100644
index 0000000..a1bccc0
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/data/shared_constant.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Regression test for issue https://github.com/dart-lang/sdk/issues/31306.
+///
+/// When 1 constant was imported in two libraries by using the same exact
+/// deferred import URI, the deferred-constant initializer was incorrectly moved
+/// to the main output unit.
+
+import '../libs/shared_constant_a.dart';
+import '../libs/shared_constant_b.dart';
+
+/*element: main:OutputUnit(main, {})*/
+main() async {
+  (await doA()).method();
+  await doB();
+}
diff --git a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
index ec84fcd..9a48d0c 100644
--- a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
+++ b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
@@ -66,8 +66,16 @@
     Expect.isTrue(import.isDeferred);
 
     if (importPrefixes.containsKey(import.name)) {
+      var existing = importPrefixes[import.name];
+      var current = import.enclosingLibrary.canonicalUri;
       Expect.equals(
-          importPrefixes[import.name], import.enclosingLibrary.canonicalUri);
+          existing,
+          current,
+          '\n    Duplicate prefix \'${import.name}\' used in both:\n'
+          '     - $existing and\n'
+          '     - $current.\n'
+          '    We require using unique prefixes on these tests to make '
+          'the expectations more readable.');
     }
     importPrefixes[import.name] = import.enclosingLibrary.canonicalUri;
   }
diff --git a/tests/compiler/dart2js/deferred_loading/libs/shared_constant_a.dart b/tests/compiler/dart2js/deferred_loading/libs/shared_constant_a.dart
new file mode 100644
index 0000000..8821616
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/shared_constant_a.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'shared_constant_shared.dart' deferred as s1;
+
+/*element: doA:OutputUnit(main, {})*/
+doA() async {
+  await s1.loadLibrary();
+  return s1.constant;
+}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/shared_constant_b.dart b/tests/compiler/dart2js/deferred_loading/libs/shared_constant_b.dart
new file mode 100644
index 0000000..3e87532
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/shared_constant_b.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'shared_constant_shared.dart' deferred as s2;
+
+/*element: doB:OutputUnit(main, {})*/
+doB() async {
+  await s2.loadLibrary();
+  return s2.constant;
+}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/shared_constant_c.dart b/tests/compiler/dart2js/deferred_loading/libs/shared_constant_c.dart
new file mode 100644
index 0000000..370c0e1
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/shared_constant_c.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class C {
+  /*element: C.:OutputUnit(1, {s1, s2})*/
+  const C();
+
+  /*element: C.method:OutputUnit(1, {s1, s2})*/
+  method() => print("1");
+}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/shared_constant_shared.dart b/tests/compiler/dart2js/deferred_loading/libs/shared_constant_shared.dart
new file mode 100644
index 0000000..c309a75
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/shared_constant_shared.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'shared_constant_c.dart';
+
+/*element: constant:OutputUnit(1, {s1, s2})*/
+const constant =
+    /*OutputUnit(1, {s1, s2})*/ const C();
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index a19dc4b..939543a 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -233,7 +233,7 @@
       sb.write(sourceCode.substring(end, offset));
     }
     for (String annotation in annotations[offset]) {
-      sb.write(colorizeAnnotation('/* ', annotation, ' */'));
+      sb.write(colorizeAnnotation('/*', annotation, '*/'));
     }
     end = offset;
   }
@@ -579,8 +579,10 @@
     for (Annotation annotation in code.annotations) {
       String text = annotation.text;
       IdValue idValue = IdValue.decode(annotation.offset, text);
-      Expect.isFalse(expectedValues.containsKey(idValue.id),
-          "Duplicate annotations for ${idValue.id}.");
+      Expect.isFalse(
+          expectedValues.containsKey(idValue.id),
+          "Duplicate annotations for ${idValue.id}: ${idValue} and "
+          "${expectedValues[idValue.id]}.");
       expectedValues[idValue.id] = idValue;
     }
   });
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_test.dart b/tests/compiler/dart2js/equivalence/id_equivalence_test.dart
index a7f811b..93646f7 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_test.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_test.dart
@@ -26,6 +26,14 @@
   '../jumps/data',
 ];
 
+const List<String> skipList = const <String>[
+  // TODO(johnniwinther): Fix these when kernel provides a unique offset for
+  // `()` in `foo[0]()`.
+  'closure_tracer.dart',
+  'closure_tracer_28919.dart',
+  'index_call.dart',
+];
+
 main(List<String> args) {
   asyncTest(() async {
     for (String path in dataDirectories) {
@@ -34,6 +42,10 @@
         if (args.isNotEmpty && !args.contains(entity.uri.pathSegments.last)) {
           continue;
         }
+        if (skipList.contains(entity.uri.pathSegments.last)) {
+          print('Skipping ${entity.uri}');
+          continue;
+        }
         print('Checking ${entity.uri}');
         String annotatedCode =
             await new File.fromUri(entity.uri).readAsString();
diff --git a/tests/compiler/dart2js/generic_methods/generic_method_test.dart b/tests/compiler/dart2js/generic_methods/generic_method_test.dart
new file mode 100644
index 0000000..1de091b
--- /dev/null
+++ b/tests/compiler/dart2js/generic_methods/generic_method_test.dart
@@ -0,0 +1,103 @@
+// 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:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/common_elements.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/js/js.dart' as js;
+import 'package:compiler/src/world.dart';
+import 'package:expect/expect.dart';
+import '../kernel/compiler_helper.dart';
+
+const String SOURCE = r'''
+import 'package:meta/dart2js.dart';
+
+// TODO(johnniwinther): Remove these when the needed RTI is correctly computed
+// for function type variables.
+test(o) => o is double || o is String || o is int;
+
+@noInline
+genericMethod1<T>(T t) {
+  test(t);
+  print('genericMethod1:');
+  print('$t is $T = ${t is T}');
+  print('"foo" is $T = ${"foo" is T}');
+  print('');
+}
+
+@noInline
+genericMethod2<T, S>(S s, T t) {
+  test(t);
+  test(s);
+  print('genericMethod2:');
+  print('$t is $T = ${t is T}');
+  print('$s is $T = ${s is T}');
+  print('$t is $S = ${t is S}');
+  print('$s is $S = ${s is S}');
+  print('');
+}
+
+@tryInline
+genericMethod3<T, S>(T t, S s) {
+  test(t);
+  test(s);
+  print('genericMethod3:');
+  print('$t is $T = ${t is T}');
+  print('$s is $T = ${s is T}');
+  print('$t is $S = ${t is S}');
+  print('$s is $S = ${s is S}');
+  print('');
+}
+
+main() {
+  genericMethod1<int>(0);
+  genericMethod2<String, double>(0.5, 'foo');
+  genericMethod3<double, String>(1.5, 'bar');
+}
+''';
+
+const String OUTPUT = r'''
+genericMethod1:
+0 is int = true
+"foo" is int = false
+
+genericMethod2:
+foo is String = true
+0.5 is String = false
+foo is double = false
+0.5 is double = true
+
+genericMethod3:
+1.5 is double = true
+bar is double = false
+1.5 is String = false
+bar is String = true
+
+''';
+
+main(List<String> args) {
+  asyncTest(() async {
+    Compiler compiler = await runWithD8(
+        memorySourceFiles: {'main.dart': SOURCE},
+        options: [Flags.useKernel, Flags.strongMode],
+        expectedOutput: OUTPUT,
+        printJs: args.contains('-v'));
+    ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+    ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+
+    void checkMethod(String name, int expectedParameterCount) {
+      FunctionEntity function = elementEnvironment.lookupLibraryMember(
+          elementEnvironment.mainLibrary, name);
+      Expect.isNotNull(function, "Method '$name' not found.");
+      js.Fun fun = compiler.backend.generatedCode[function];
+      Expect.equals(expectedParameterCount, fun.params.length,
+          "Unexpected parameter count for $function:\n${js.nodeToString(fun)}");
+    }
+
+    checkMethod('genericMethod1', 2);
+    checkMethod('genericMethod2', 4);
+  });
+}
diff --git a/tests/compiler/dart2js/inference/assert_message_throw_test.dart b/tests/compiler/dart2js/inference/assert_message_throw_test.dart
deleted file mode 100644
index d64ba79..0000000
--- a/tests/compiler/dart2js/inference/assert_message_throw_test.dart
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (c) 2016, 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.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/elements/elements.dart';
-import 'package:compiler/src/types/masks.dart';
-import 'package:compiler/src/world.dart' show ClosedWorld;
-import 'package:expect/expect.dart';
-import 'type_mask_test_helper.dart';
-import '../memory_compiler.dart';
-
-const String SOURCE = '''
-main(args) {
-  test0();
-  test1(args == null);
-  test2(args == null);
-  test3(args);
-}
-
-// Check that `throw` in the message does is handled conditionally.
-test0() {
-  assert(true, throw "unreachable");
-  var list = [];
-  return list;
-}
-
-// Check that side-effects of the assert message is not included after the
-// assert.
-test1(b) {
-  var a;
-  assert(b, a = 42);
-  return a;
-}
-
-// Check that side-effects of the assert message is included after the assert
-// through the thrown exception.
-test2(b) {
-  var a;
-  try {
-    assert(b, a = 42);
-  } catch (e) {}
-  return a;
-}
-
-// Check that type tests are preserved after the assert.
-test3(a) {
-  assert(a is int);
-  return a;
-}
-''';
-
-main() {
-  asyncTest(() async {
-    CompilationResult result = await runCompiler(
-        entryPoint: Uri.parse('memory:main.dart'),
-        memorySourceFiles: {'main.dart': SOURCE},
-        options: [Flags.enableCheckedMode, Flags.enableAssertMessage]);
-    Compiler compiler = result.compiler;
-    ClosedWorld closedWorld =
-        compiler.resolutionWorldBuilder.closedWorldForTesting;
-
-    void check(String methodName, TypeMask expectedReturnType) {
-      LibraryElement mainApp = closedWorld.elementEnvironment.mainLibrary;
-      MemberElement element = mainApp.find(methodName);
-      TypeMask typeMask = simplify(
-          compiler.globalInference.results.resultOfMember(element).returnType,
-          closedWorld);
-      Expect.equals(expectedReturnType, typeMask,
-          "Unexpected return type on method '$methodName'.");
-    }
-
-    check('test0', closedWorld.commonMasks.growableListType);
-    check('test1', closedWorld.commonMasks.nullType);
-    check('test2', closedWorld.commonMasks.uint31Type.nullable());
-    check('test3', closedWorld.commonMasks.intType);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/closure_tracer_28919_test.dart b/tests/compiler/dart2js/inference/closure_tracer_28919_test.dart
deleted file mode 100644
index 46ad3d3..0000000
--- a/tests/compiler/dart2js/inference/closure_tracer_28919_test.dart
+++ /dev/null
@@ -1,114 +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.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/common_elements.dart';
-import 'package:compiler/src/elements/entities.dart';
-import 'package:compiler/src/inferrer/type_graph_inferrer.dart';
-import 'package:compiler/src/types/types.dart';
-import 'package:compiler/src/world.dart';
-import 'package:expect/expect.dart';
-
-import 'type_mask_test_helper.dart';
-import '../memory_compiler.dart';
-
-bool isContainer(TypeMask mask) {
-  return mask is ContainerTypeMask;
-}
-
-const String TEST = '''
-
-foo1() {
-  final methods = [];
-  var res, sum;
-  for (int i = 0; i != 3; i++) {
-    methods.add((int x) { res = x; sum = x + i; });
-  }
-  methods[0](499);
-  probe1res(res);
-  probe1sum(sum);
-  probe1methods(methods);
-}
-probe1res(x) => x;
-probe1sum(x) => x;
-probe1methods(x) => x;
-
-nonContainer(choice) {
-  var m = choice == 0 ? [] : "<String>";
-  if (m is !List) throw 123;
-  // The union then filter leaves us with a non-container type.
-  return m;
-}
-
-foo2(int choice) {
-  final methods = nonContainer(choice);
-  var res, sum;
-  for (int i = 0; i != 3; i++) {
-    methods.add((int x) { res = x; sum = x + i; });
-  }
-  methods[0](499);
-  probe2res(res);
-  probe2methods(methods);
-}
-probe2res(x) => x;
-probe2methods(x) => x;
-
-main() {
-  foo1();
-  foo2(0);
-  foo2(1);
-}
-''';
-
-void main() {
-  runTest({bool useKernel}) async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': TEST},
-        options: useKernel ? [Flags.useKernel] : []);
-    Expect.isTrue(result.isSuccess);
-    Compiler compiler = result.compiler;
-
-    TypeGraphInferrer typesInferrer =
-        compiler.globalInference.typesInferrerInternal;
-    ClosedWorld closedWorld = typesInferrer.closedWorld;
-    ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
-    CommonMasks commonMasks = closedWorld.commonMasks;
-
-    typeOf(String name) {
-      LibraryEntity library = elementEnvironment.mainLibrary;
-      MemberEntity member =
-          elementEnvironment.lookupLibraryMember(library, name);
-      return typesInferrer.getReturnTypeOfMember(member);
-    }
-
-    checkType(String name, type) {
-      var mask = typeOf(name);
-      Expect.equals(type.nullable(), simplify(mask, closedWorld), name);
-    }
-
-    checkContainer(String name, bool value) {
-      var mask = typeOf(name);
-      Expect.equals(
-          value, isContainer(mask), '$name is container (mask: $mask)');
-    }
-
-    checkContainer('probe1methods', true);
-    checkType('probe1res', commonMasks.uint31Type);
-    checkType('probe1sum', commonMasks.positiveIntType);
-
-    checkContainer('probe2methods', false);
-    checkType('probe2res', commonMasks.dynamicType);
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/closure_tracer_test.dart b/tests/compiler/dart2js/inference/closure_tracer_test.dart
deleted file mode 100644
index be82ef3..0000000
--- a/tests/compiler/dart2js/inference/closure_tracer_test.dart
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright (c) 2013, 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.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-/// Currently it only works with the mock compiler.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-
-import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
-
-const String TEST = '''
-testFunctionStatement() {
-  var res;
-  closure(a) => res = a;
-  closure(42);
-  return res;
-}
-
-testFunctionExpression() {
-  var res;
-  var closure = (a) => res = a;
-  closure(42);
-  return res;
-}
-
-var staticField;
-
-testStoredInStatic() {
-  var res;
-  closure(a) => res = a;
-  staticField = closure;
-  staticField(42);
-  return res;
-}
-
-class A {
-  var field;
-  A(this.field);
-  static foo(a) => topLevel3 = a;
-}
-
-testStoredInInstance() {
-  var res;
-  closure(a) => res = a;
-  var a = new A(closure);
-  a.field(42);
-  return res;
-}
-
-testStoredInMapOfList() {
-  var res;
-  closure(a) => res = a;
-  var a = [closure];
-  var b = {'foo' : 1};
-  b['bar'] = a;
-  b['bar'][0](42);
-  return res;
-}
-
-testStoredInListOfList() {
-  var res;
-  closure(a) => res = a;
-  var a = [closure];
-  var b = [0, 1, 2];
-  b[1] = a;
-  b[1][0](42);
-  return res;
-}
-
-testStoredInListOfListUsingInsert() {
-  var res;
-  closure(a) => res = a;
-  var a = [closure];
-  var b = [0, 1, 2];
-  b.insert(1, a);
-  b[1][0](42);
-  return res;
-}
-
-testStoredInListOfListUsingAdd() {
-  var res;
-  closure(a) => res = a;
-  var a = [closure];
-  var b = [0, 1, 2];
-  b.add(a);
-  b[3][0](42);
-  return res;
-}
-
-foo(closure) {
-  closure(42);
-}
-
-testPassedInParameter() {
-  var res;
-  closure(a) => res = a;
-  foo(closure);
-  return res;
-}
-
-var topLevel1;
-foo2(a) => topLevel1 = a;
-testStaticClosure1() {
-  var a = foo2;
-  a(42);
-  return topLevel1;
-}
-
-var topLevel2;
-bar(a) => topLevel2 = a;
-testStaticClosure2() {
-  var a = bar;
-  a(42);
-  var b = bar;
-  b(2.5);
-  return topLevel2;
-}
-
-var topLevel3;
-testStaticClosure3() {
-  var a = A.foo;
-  a(42);
-  return topLevel3;
-}
-
-var topLevel4;
-testStaticClosure4Helper(a) => topLevel4 = a;
-testStaticClosure4() {
-  var a = testStaticClosure4Helper;
-  // Test calling the static after tearing it off.
-  testStaticClosure4Helper(2.5);
-  a(42);
-  return topLevel4;
-}
-
-main() {
-  testFunctionStatement();
-  testFunctionExpression();
-  testStoredInStatic();
-  testStoredInInstance();
-  testStoredInMapOfList();
-  testStoredInListOfList();
-  testStoredInListOfListUsingInsert();
-  testStoredInListOfListUsingAdd();
-  testPassedInParameter();
-  testStaticClosure1();
-  testStaticClosure2();
-  testStaticClosure3();
-  testStaticClosure4();
-}
-''';
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-        var commonMasks = closedWorld.commonMasks;
-
-        checkType(String name, type) {
-          MemberElement element = findElement(compiler, name);
-          var mask = typesInferrer.getReturnTypeOfMember(element);
-          Expect.equals(type.nullable(), simplify(mask, closedWorld), name);
-        }
-
-        checkType('testFunctionStatement', commonMasks.uint31Type);
-        checkType('testFunctionExpression', commonMasks.uint31Type);
-        checkType('testStoredInInstance', commonMasks.uint31Type);
-        checkType('testStoredInStatic', commonMasks.uint31Type);
-        checkType('testStoredInMapOfList', commonMasks.uint31Type);
-        checkType('testStoredInListOfList', commonMasks.uint31Type);
-        checkType('testStoredInListOfListUsingInsert', commonMasks.uint31Type);
-        checkType('testStoredInListOfListUsingAdd', commonMasks.uint31Type);
-        checkType('testPassedInParameter', commonMasks.uint31Type);
-        checkType('testStaticClosure1', commonMasks.uint31Type);
-        checkType('testStaticClosure2', commonMasks.numType);
-        checkType('testStaticClosure3', commonMasks.uint31Type);
-        checkType('testStaticClosure4', commonMasks.numType);
-      }));
-}
diff --git a/tests/compiler/dart2js/inference/container_mask_equal_test.dart b/tests/compiler/dart2js/inference/container_mask_equal_test.dart
deleted file mode 100644
index 5f8af3a..0000000
--- a/tests/compiler/dart2js/inference/container_mask_equal_test.dart
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (c) 2013, 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.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-// Regression test for dart2js that used to have a bogus
-// implementation of var.== and
-// var.hashCode.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:expect/expect.dart';
-import '../memory_compiler.dart';
-
-const MEMORY_SOURCE_FILES = const {
-  'main.dart': '''
-
-import 'dart:typed_data';
-
-a() => [0];
-b() => [1, 2];
-c() => new Uint8List(1);
-d() => new Uint8List(2);
-
-main() {
-  print(a); print(b); print(c); print(d);
-}
-''',
-};
-
-main() {
-  runTests({bool useKernel}) async {
-    var result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        options: useKernel ? [Flags.useKernel] : []);
-    var compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-    var elementEnvironment = closedWorld.elementEnvironment;
-
-    var element = elementEnvironment.lookupLibraryMember(
-        elementEnvironment.mainLibrary, 'a');
-    var mask1 = typesInferrer.getReturnTypeOfMember(element);
-
-    element = elementEnvironment.lookupLibraryMember(
-        elementEnvironment.mainLibrary, 'b');
-    var mask2 = typesInferrer.getReturnTypeOfMember(element);
-
-    element = elementEnvironment.lookupLibraryMember(
-        elementEnvironment.mainLibrary, 'c');
-    var mask3 = typesInferrer.getReturnTypeOfMember(element);
-
-    element = elementEnvironment.lookupLibraryMember(
-        elementEnvironment.mainLibrary, 'd');
-    var mask4 = typesInferrer.getReturnTypeOfMember(element);
-
-    Expect.notEquals(
-        mask1.union(mask2, closedWorld), mask3.union(mask4, closedWorld));
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/data/assert_message_throw.dart b/tests/compiler/dart2js/inference/data/assert_message_throw.dart
new file mode 100644
index 0000000..d310309
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/assert_message_throw.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// This file contains tests of assertions when assertions are _disabled_. The
+/// file 'assert_message_throw_ea.dart' contains similar tests for when
+/// assertions are _enabled_.
+
+/*element: main:[null]*/
+main(/*[null|subclass=Object]*/ args) {
+  test0();
+  test1(args == null);
+  test2(args == null);
+  test3(args);
+}
+
+// Check that `throw` in the message is handled conditionally.
+/*element: test0:Container([exact=JSExtendableArray], element: [empty], length: 0)*/
+test0() {
+  assert(true, throw "unreachable");
+  var list = [];
+  return list;
+}
+
+// Check that side-effects of the assert message is not included after the
+// assert.
+/*element: test1:[null]*/
+test1(/*[exact=JSBool]*/ b) {
+  var a;
+  assert(b, a = 42);
+  return a;
+}
+
+// Check that side-effects of the assert message is included after the assert
+// through the thrown exception.
+/*element: test2:[null]*/
+test2(/*[exact=JSBool]*/ b) {
+  var a;
+  try {
+    assert(b, a = 42);
+  } catch (e) {}
+  return a;
+}
+
+// Check that type tests are preserved after the assert.
+/*element: test3:[null|subclass=Object]*/
+test3(/*[null|subclass=Object]*/ a) {
+  assert(a is int);
+  return a;
+}
diff --git a/tests/compiler/dart2js/inference/data/assert_message_throw_ea.dart b/tests/compiler/dart2js/inference/data/assert_message_throw_ea.dart
new file mode 100644
index 0000000..c3f0a1b
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/assert_message_throw_ea.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// This file contains tests of assertions when assertions are _enabled_. The
+/// file 'assert_message_throw.dart' contains similar tests for when assertions
+/// are _disabled_.
+
+/*element: main:[null]*/
+main(/*[null|subclass=Object]*/ args) {
+  test0();
+  test1(args == null);
+  test2(args == null);
+  test3(args);
+}
+
+// Check that `throw` in the message is handled conditionally.
+/*element: test0:Container([exact=JSExtendableArray], element: [empty], length: 0)*/
+test0() {
+  assert(true, throw "unreachable");
+  var list = [];
+  return list;
+}
+
+// Check that side-effects of the assert message is not included after the
+// assert.
+/*element: test1:[null]*/
+test1(/*[exact=JSBool]*/ b) {
+  var a;
+  assert(b, a = 42);
+  return a;
+}
+
+// Check that side-effects of the assert message is included after the assert
+// through the thrown exception.
+/*element: test2:[null|exact=JSUInt31]*/
+test2(/*[exact=JSBool]*/ b) {
+  var a;
+  try {
+    assert(b, a = 42);
+  } catch (e) {}
+  return a;
+}
+
+// Check that type tests are preserved after the assert.
+/*element: test3:[subclass=JSInt]*/
+test3(/*[null|subclass=Object]*/ a) {
+  assert(a is int);
+  return a;
+}
diff --git a/tests/compiler/dart2js/inference/data/closure_tracer.dart b/tests/compiler/dart2js/inference/data/closure_tracer.dart
new file mode 100644
index 0000000..f1dfbb1
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/closure_tracer.dart
@@ -0,0 +1,210 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: testFunctionStatement:[null|exact=JSUInt31]*/
+testFunctionStatement() {
+  var res;
+  /*[exact=JSUInt31]*/ closure(/*[exact=JSUInt31]*/ a) => res = a;
+  closure(42);
+  return res;
+}
+
+/*element: testFunctionExpression:[null|exact=JSUInt31]*/
+testFunctionExpression() {
+  var res;
+  var closure = /*[exact=JSUInt31]*/ (/*[exact=JSUInt31]*/ a) => res = a;
+  closure(42);
+  return res;
+}
+
+/*element: staticField:[null|subclass=Closure]*/
+var staticField;
+
+/*element: testStoredInStatic:[null|exact=JSUInt31]*/
+testStoredInStatic() {
+  var res;
+  /*[exact=JSUInt31]*/ closure(/*[exact=JSUInt31]*/ a) => res = a;
+  staticField = closure;
+  staticField(42);
+  return res;
+}
+
+class A {
+  /*element: A.field:[subclass=Closure]*/
+  var field;
+  /*element: A.:[exact=A]*/
+  A(this. /*[subclass=Closure]*/ field);
+
+  /*element: A.foo:[exact=JSUInt31]*/
+  static foo(/*[exact=JSUInt31]*/ a) => topLevel3 = a;
+}
+
+/*element: testStoredInInstance:[null|exact=JSUInt31]*/
+testStoredInInstance() {
+  var res;
+  /*[exact=JSUInt31]*/ closure(/*[exact=JSUInt31]*/ a) => res = a;
+  var a = new A(closure);
+  a. /*invoke: [exact=A]*/ field(42);
+  return res;
+}
+
+/*element: testStoredInMapOfList:[null|subclass=Object]*/
+testStoredInMapOfList() {
+  var res;
+  /*[null|subclass=Object]*/ closure(/*[null|subclass=Object]*/ a) => res = a;
+  dynamic a = [closure];
+  dynamic b = {'foo': 1};
+
+  b
+      /*update: Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSUInt31], [null|exact=JSExtendableArray]), map: {foo: [exact=JSUInt31], bar: Container([null|exact=JSExtendableArray], element: [null|subclass=Object], length: null)})*/
+      ['bar'] = a;
+
+  b
+          /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSUInt31], [null|exact=JSExtendableArray]), map: {foo: [exact=JSUInt31], bar: Container([null|exact=JSExtendableArray], element: [null|subclass=Object], length: null)})*/
+          ['bar']
+
+      /*Container([null|exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
+      [0](42);
+  return res;
+}
+
+/*element: testStoredInListOfList:[null|exact=JSUInt31]*/
+testStoredInListOfList() {
+  var res;
+  /*[exact=JSUInt31]*/ closure(/*[exact=JSUInt31]*/ a) => res = a;
+  dynamic a = [closure];
+  dynamic b = [0, 1, 2];
+
+  b
+      /*update: Container([exact=JSExtendableArray], element: Union([exact=JSExtendableArray], [exact=JSUInt31]), length: 3)*/
+      [1] = a;
+
+  b
+          /*Container([exact=JSExtendableArray], element: Union([exact=JSExtendableArray], [exact=JSUInt31]), length: 3)*/
+          [1]
+      /*Union([exact=JSExtendableArray], [exact=JSUInt31])*/
+      [0](42);
+  return res;
+}
+
+/*element: testStoredInListOfListUsingInsert:[null|exact=JSUInt31]*/
+testStoredInListOfListUsingInsert() {
+  var res;
+  /*[exact=JSUInt31]*/ closure(/*[exact=JSUInt31]*/ a) => res = a;
+  dynamic a = [closure];
+  dynamic b = [0, 1, 2];
+
+  b
+      .
+      /*invoke: Container([exact=JSExtendableArray], element: Union([exact=JSExtendableArray], [exact=JSUInt31]), length: null)*/
+      insert(1, a);
+
+  b /*Container([exact=JSExtendableArray], element: Union([exact=JSExtendableArray], [exact=JSUInt31]), length: null)*/
+          [1]
+      /*Union([exact=JSExtendableArray], [exact=JSUInt31])*/
+      [0](42);
+  return res;
+}
+
+/*element: testStoredInListOfListUsingAdd:[null|exact=JSUInt31]*/
+testStoredInListOfListUsingAdd() {
+  var res;
+  /*[exact=JSUInt31]*/ closure(/*[exact=JSUInt31]*/ a) => res = a;
+  dynamic a = [closure];
+  dynamic b = [0, 1, 2];
+
+  b
+      .
+      /*invoke: Container([exact=JSExtendableArray], element: Union([exact=JSExtendableArray], [exact=JSUInt31]), length: null)*/
+      add(a);
+
+  b
+          /*Container([exact=JSExtendableArray], element: Union([exact=JSExtendableArray], [exact=JSUInt31]), length: null)*/
+          [3]
+      /*Union([exact=JSExtendableArray], [exact=JSUInt31])*/
+      [0](42);
+  return res;
+}
+
+/*element: foo:[null]*/
+foo(/*[subclass=Closure]*/ closure) {
+  closure(42);
+}
+
+/*element: testPassedInParameter:[null|exact=JSUInt31]*/
+testPassedInParameter() {
+  var res;
+  /*[exact=JSUInt31]*/ closure(/*[exact=JSUInt31]*/ a) => res = a;
+  foo(closure);
+  return res;
+}
+
+/*element: topLevel1:[null|exact=JSUInt31]*/
+var topLevel1;
+/*element: foo2:[exact=JSUInt31]*/
+foo2(/*[exact=JSUInt31]*/ a) => topLevel1 = a;
+
+/*element: testStaticClosure1:[null|exact=JSUInt31]*/
+testStaticClosure1() {
+  var a = foo2;
+  a(42);
+  return topLevel1;
+}
+
+/*element: topLevel2:Union([exact=JSUInt31], [null|exact=JSDouble])*/
+var topLevel2;
+
+/*element: bar:Union([exact=JSDouble], [exact=JSUInt31])*/
+bar(/*Union([exact=JSDouble], [exact=JSUInt31])*/ a) => topLevel2 = a;
+
+/*element: testStaticClosure2:Union([exact=JSUInt31], [null|exact=JSDouble])*/
+testStaticClosure2() {
+  var a = bar;
+  a(42);
+  var b = bar;
+  b(2.5);
+  return topLevel2;
+}
+
+/*element: topLevel3:[null|exact=JSUInt31]*/
+var topLevel3;
+
+/*element: testStaticClosure3:[null|exact=JSUInt31]*/ testStaticClosure3() {
+  var a = A.foo;
+  a(42);
+  return topLevel3;
+}
+
+/*element: topLevel4:Union([exact=JSUInt31], [null|exact=JSDouble])*/
+var topLevel4;
+
+/*element: testStaticClosure4Helper:Union([exact=JSDouble], [exact=JSUInt31])*/
+testStaticClosure4Helper(/*Union([exact=JSDouble], [exact=JSUInt31])*/ a) =>
+    topLevel4 = a;
+
+/*element: testStaticClosure4:Union([exact=JSUInt31], [null|exact=JSDouble])*/
+testStaticClosure4() {
+  var a = testStaticClosure4Helper;
+  // Test calling the static after tearing it off.
+  testStaticClosure4Helper(2.5);
+  a(42);
+  return topLevel4;
+}
+
+/*element: main:[null]*/
+main() {
+  testFunctionStatement();
+  testFunctionExpression();
+  testStoredInStatic();
+  testStoredInInstance();
+  testStoredInMapOfList();
+  testStoredInListOfList();
+  testStoredInListOfListUsingInsert();
+  testStoredInListOfListUsingAdd();
+  testPassedInParameter();
+  testStaticClosure1();
+  testStaticClosure2();
+  testStaticClosure3();
+  testStaticClosure4();
+}
diff --git a/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart b/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart
new file mode 100644
index 0000000..1fece67
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for issue 28919.
+
+/*element: foo1:[null]*/
+foo1() {
+  final methods = [];
+  var res, sum;
+  for (int i = 0;
+      i /*invoke: [subclass=JSPositiveInt]*/ != 3;
+      i /*invoke: [subclass=JSPositiveInt]*/ ++) {
+    methods
+        . /*invoke: Container([exact=JSExtendableArray], element: [subclass=Closure], length: null)*/ add(
+            /*[null]*/ (int /*[exact=JSUInt31]*/ x) {
+      res = x;
+      sum = x /*invoke: [exact=JSUInt31]*/ + i;
+    });
+  }
+  methods /*Container([exact=JSExtendableArray], element: [subclass=Closure], length: null)*/ [
+      0](499);
+  probe1res(res);
+  probe1sum(sum);
+  probe1methods(methods);
+}
+
+/*element: probe1res:[null|exact=JSUInt31]*/
+probe1res(/*[null|exact=JSUInt31]*/ x) => x;
+
+/*element: probe1sum:[null|subclass=JSPositiveInt]*/
+probe1sum(/*[null|subclass=JSPositiveInt]*/ x) => x;
+
+/*element: probe1methods:Container([exact=JSExtendableArray], element: [subclass=Closure], length: null)*/
+probe1methods(
+        /*Container([exact=JSExtendableArray], element: [subclass=Closure], length: null)*/ x) =>
+    x;
+
+/*element: nonContainer:[exact=JSExtendableArray]*/
+nonContainer(/*[exact=JSUInt31]*/ choice) {
+  var m = choice /*invoke: [exact=JSUInt31]*/ == 0 ? [] : "<String>";
+  if (m is! List) throw 123;
+  // The union then filter leaves us with a non-container type.
+  return m;
+}
+
+/*element: foo2:[null]*/
+foo2(int /*[exact=JSUInt31]*/ choice) {
+  final methods = nonContainer(choice);
+
+  /// ignore: unused_local_variable
+  var res, sum;
+  for (int i = 0;
+      i /*invoke: [subclass=JSPositiveInt]*/ != 3;
+      i /*invoke: [subclass=JSPositiveInt]*/ ++) {
+    methods. /*invoke: [exact=JSExtendableArray]*/ add(
+        /*[null]*/ (int /*[null|subclass=Object]*/ x) {
+      res = x;
+      sum = x + i;
+    });
+  }
+  methods /*[exact=JSExtendableArray]*/ [0](499);
+  probe2res(res);
+  probe2methods(methods);
+}
+
+/*element: probe2res:[null|subclass=Object]*/
+probe2res(/*[null|subclass=Object]*/ x) => x;
+
+/*element: probe2methods:[exact=JSExtendableArray]*/
+probe2methods(/*[exact=JSExtendableArray]*/ x) => x;
+
+/*element: main:[null]*/
+main() {
+  foo1();
+  foo2(0);
+  foo2(1);
+}
diff --git a/tests/compiler/dart2js/inference/data/container_mask_equal.dart b/tests/compiler/dart2js/inference/data/container_mask_equal.dart
new file mode 100644
index 0000000..be6deee
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/container_mask_equal.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for dart2js that used to have a bogus
+// implementation of var.== and var.hashCode.
+
+import 'dart:typed_data';
+
+/*element: method1:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+method1() => [0];
+
+/*element: method2:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 2)*/
+method2() => [1, 2];
+
+/*element: method3:Container([exact=NativeUint8List], element: [exact=JSUInt31], length: 1)*/
+method3() => new Uint8List(1);
+
+/*element: method4:Container([exact=NativeUint8List], element: [exact=JSUInt31], length: 2)*/
+method4() => new Uint8List(2);
+
+/*element: method1or2:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: null)*/
+method1or2(/*[exact=JSBool]*/ c) => c ? method1() : method2();
+
+/*element: method3or4:Container([exact=NativeUint8List], element: [exact=JSUInt31], length: null)*/
+method3or4(/*[exact=JSBool]*/ c) => c ? method3() : method4();
+
+/*element: main:[null]*/
+main() {
+  method1or2(true);
+  method1or2(false);
+  method3or4(true);
+  method3or4(false);
+}
diff --git a/tests/compiler/dart2js/inference/data/index_call.dart b/tests/compiler/dart2js/inference/data/index_call.dart
new file mode 100644
index 0000000..1bab3af
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/index_call.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: main:[null]*/
+main() {
+  listIndexCall();
+  listIndexExplicitCall();
+  multiListIndex();
+  multiListIndexCall();
+  multiMapIndex();
+  multiMapIndexCall();
+  multiMapListIndexCall();
+}
+
+/*element: listIndexCall:[null|subclass=Object]*/
+listIndexCall() {
+  var closure = /*[exact=JSUInt31]*/ ({/*[exact=JSUInt31]*/ a}) => a;
+  var a = [closure];
+  return a /*Container([exact=JSExtendableArray], element: [subclass=Closure], length: 1)*/
+      [0](a: 0);
+}
+
+/*element: listIndexExplicitCall:[null|subclass=Object]*/
+listIndexExplicitCall() {
+  var closure = /*[exact=JSUInt31]*/ ({/*[exact=JSUInt31]*/ b}) => b;
+  var a = [closure];
+  return a /*Container([exact=JSExtendableArray], element: [subclass=Closure], length: 1)*/
+          [0]
+      .call(b: 0);
+}
+
+/*element: multiListIndex:[subclass=JSPositiveInt]*/
+multiListIndex() {
+  var a = [
+    [0]
+  ];
+  return a
+              /*Container([exact=JSExtendableArray], element: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1), length: 1)*/
+              [0]
+          /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+          [0]
+      . /*invoke: [exact=JSUInt31]*/ abs();
+}
+
+/*element: multiListIndexCall:[null|subclass=Object]*/
+multiListIndexCall() {
+  var closure = /*[exact=JSUInt31]*/ ({/*[exact=JSUInt31]*/ c}) => c;
+  var a = [
+    [closure]
+  ];
+  return a
+          /*Container([exact=JSExtendableArray], element: Container([exact=JSExtendableArray], element: [subclass=Closure], length: 1), length: 1)*/
+          [0]
+      /*Container([exact=JSExtendableArray], element: [subclass=Closure], length: 1)*/
+      [0](c: 0);
+}
+
+/*element: multiMapIndex:[subclass=JSPositiveInt]*/
+multiMapIndex() {
+  var a = {
+    'a': {'b': 0}
+  };
+  return a /*Dictionary([subclass=JsLinkedHashMap], key: Value([exact=JSString], value: "a"), value: Dictionary([null|subclass=JsLinkedHashMap], key: Value([exact=JSString], value: "b"), value: [null|exact=JSUInt31], map: {b: [exact=JSUInt31]}), map: {a: Dictionary([subclass=JsLinkedHashMap], key: Value([exact=JSString], value: "b"), value: [null|exact=JSUInt31], map: {b: [exact=JSUInt31]})})*/
+              ['a']
+          /*Dictionary([subclass=JsLinkedHashMap], key: Value([exact=JSString], value: "b"), value: [null|exact=JSUInt31], map: {b: [exact=JSUInt31]})*/
+          ['b']
+      . /*invoke: [exact=JSUInt31]*/
+      abs();
+}
+
+/*element: multiMapIndexCall:[null|subclass=Object]*/
+multiMapIndexCall() {
+  var closure = /*[exact=JSUInt31]*/ ({/*[exact=JSUInt31]*/ d}) => d;
+  var a = {
+    'a': {'b': closure}
+  };
+  return a /*Dictionary([subclass=JsLinkedHashMap], key: Value([exact=JSString], value: "a"), value: Dictionary([null|subclass=JsLinkedHashMap], key: Value([exact=JSString], value: "b"), value: [null|subclass=Closure], map: {b: [subclass=Closure]}), map: {a: Dictionary([subclass=JsLinkedHashMap], key: Value([exact=JSString], value: "b"), value: [null|subclass=Closure], map: {b: [subclass=Closure]})})*/
+          ['a']
+      /*Dictionary([subclass=JsLinkedHashMap], key: Value([exact=JSString], value: "b"), value: [null|subclass=Closure], map: {b: [subclass=Closure]})*/
+      ['b'](d: 0);
+}
+
+/*element: multiMapListIndexCall:[null|subclass=Object]*/
+multiMapListIndexCall() {
+  var closure = /*[exact=JSUInt31]*/ ({/*[exact=JSUInt31]*/ d}) => d;
+  var a = {
+    'a': [closure]
+  };
+  return a /*Dictionary([subclass=JsLinkedHashMap], key: Value([exact=JSString], value: "a"), value: Container([null|exact=JSExtendableArray], element: [subclass=Closure], length: 1), map: {a: Container([exact=JSExtendableArray], element: [subclass=Closure], length: 1)})*/
+          ['a']
+      /*Container([exact=JSExtendableArray], element: [subclass=Closure], length: 1)*/
+      [0](d: 0);
+}
diff --git a/tests/compiler/dart2js/inference/data/issue13354.dart b/tests/compiler/dart2js/inference/data/issue13354.dart
new file mode 100644
index 0000000..24a47b0
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/issue13354.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for issue 13354.
+
+/*element: bar:[exact=JSUInt31]*/
+bar() => 42;
+
+/*element: baz:[subclass=Closure]*/
+baz() => bar;
+
+/*element: A.:[exact=A]*/
+class A {
+  /*element: A.foo:[exact=JSUInt31]*/
+  foo() => 42;
+}
+
+/*element: B.:[exact=B]*/
+class B extends A {
+  /*element: B.foo:[subclass=Closure]*/
+  foo() => super.foo;
+}
+
+/*element: main:[null]*/
+main() {
+  baz();
+  new B(). /*invoke: [exact=B]*/ foo();
+}
diff --git a/tests/compiler/dart2js/inference/data/list_tracer2.dart b/tests/compiler/dart2js/inference/data/list_tracer2.dart
new file mode 100644
index 0000000..356c791
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/list_tracer2.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// We used to always nullify the element type of a list we are tracing in
+// the presence of a fixed length list constructor call.
+
+/*element: myList:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+var myList = [42];
+
+/*element: main:[exact=JSUInt31]*/
+main() {
+  /// ignore: unused_local_variable
+  var a = new List(42);
+  return myList
+      /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+      [0];
+}
diff --git a/tests/compiler/dart2js/inference/data/list_tracer3.dart b/tests/compiler/dart2js/inference/data/list_tracer3.dart
new file mode 100644
index 0000000..7782208
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/list_tracer3.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// We used to always nullify the element type of a list we are tracing in
+// the presence of a fixed length list constructor call.
+
+/*element: myList:Container([exact=JSExtendableArray], element: Union([exact=JSString], [subclass=JSNumber]), length: null)*/
+var myList = [];
+
+/*element: otherList:Container([exact=JSExtendableArray], element: Union([exact=JSString], [exact=JSUInt31]), length: 2)*/
+var otherList = ['foo', 42];
+
+/*element: main:[null]*/
+main() {
+  dynamic a = otherList
+      /*Container([exact=JSExtendableArray], element: Union([exact=JSString], [exact=JSUInt31]), length: 2)*/
+      [0];
+  a /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ += 54;
+  myList
+      .
+      /*invoke: Container([exact=JSExtendableArray], element: Union([exact=JSString], [subclass=JSNumber]), length: null)*/
+      add(a);
+}
diff --git a/tests/compiler/dart2js/inference/issue13354_test.dart b/tests/compiler/dart2js/inference/issue13354_test.dart
deleted file mode 100644
index e5c7b4ea..0000000
--- a/tests/compiler/dart2js/inference/issue13354_test.dart
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (c) 2013, 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.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/elements/entities.dart';
-import 'package:expect/expect.dart';
-import 'type_mask_test_helper.dart';
-import '../memory_compiler.dart';
-
-const String TEST = """
-bar() => 42;
-baz() => bar;
-
-class A {
-  foo() => 42;
-}
-
-class B extends A {
-  foo() => super.foo;
-}
-
-main() {
-  baz();
-  new B().foo();
-}
-""";
-
-void main() {
-  runTest({bool useKernel}) async {
-    var result = await runCompiler(
-        memorySourceFiles: {'main.dart': TEST},
-        options: useKernel ? [Flags.useKernel] : []);
-    var compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-    var elementEnvironment = closedWorld.elementEnvironment;
-    var commonMasks = closedWorld.commonMasks;
-
-    checkReturn(String name, type) {
-      MemberEntity element = elementEnvironment.lookupLibraryMember(
-          elementEnvironment.mainLibrary, name);
-      Expect.equals(
-          type,
-          simplify(typesInferrer.getReturnTypeOfMember(element), closedWorld),
-          name);
-    }
-
-    checkReturnInClass(String className, String methodName, type) {
-      dynamic cls = elementEnvironment.lookupClass(
-          elementEnvironment.mainLibrary, className);
-      var element = elementEnvironment.lookupClassMember(cls, methodName);
-      Expect.equals(type,
-          simplify(typesInferrer.getReturnTypeOfMember(element), closedWorld));
-    }
-
-    checkReturn('bar', commonMasks.uint31Type);
-    checkReturn('baz', commonMasks.functionType);
-
-    checkReturnInClass('A', 'foo', commonMasks.uint31Type);
-    checkReturnInClass('B', 'foo', commonMasks.functionType);
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/list_tracer2_test.dart b/tests/compiler/dart2js/inference/list_tracer2_test.dart
deleted file mode 100644
index b76158d..0000000
--- a/tests/compiler/dart2js/inference/list_tracer2_test.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2013, 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.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-
-// We used to always nullify the element type of a list we are tracing in
-// the presence of a fixed length list constructor call.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/elements/entities.dart';
-import 'package:compiler/src/types/types.dart' show ContainerTypeMask;
-import 'package:expect/expect.dart';
-import 'type_mask_test_helper.dart';
-import '../memory_compiler.dart';
-
-const String TEST = r'''
-var myList = [42];
-main() {
-  var a = new List(42);
-  return myList[0];
-}
-''';
-
-void main() {
-  runTest({bool useKernel}) async {
-    var result = await runCompiler(
-        memorySourceFiles: {'main.dart': TEST},
-        options: useKernel ? [Flags.useKernel] : []);
-    var compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-    var elementEnvironment = closedWorld.elementEnvironment;
-
-    checkType(String name, type) {
-      MemberEntity element = elementEnvironment.lookupLibraryMember(
-          elementEnvironment.mainLibrary, name);
-      ContainerTypeMask mask = typesInferrer.getTypeOfMember(element);
-      Expect.equals(type, simplify(mask.elementType, closedWorld), name);
-    }
-
-    checkType('myList', typesInferrer.closedWorld.commonMasks.uint31Type);
-  }
-
-  asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/inference/list_tracer3_test.dart b/tests/compiler/dart2js/inference/list_tracer3_test.dart
deleted file mode 100644
index b229cf6..0000000
--- a/tests/compiler/dart2js/inference/list_tracer3_test.dart
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2013, 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.
-
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-/// Currently it only works with the mock compiler.
-
-// We used to always nullify the element type of a list we are tracing in
-// the presence of a fixed length list constructor call.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'package:compiler/src/types/types.dart' show ContainerTypeMask;
-
-import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
-
-const String TEST = r'''
-var myList = [];
-var otherList = ['foo', 42];
-main() {
-  var a = otherList[0];
-  a += 54;
-  myList.add(a);
-}
-''';
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-
-        checkType(String name, type) {
-          MemberElement element = findElement(compiler, name);
-          ContainerTypeMask mask = typesInferrer.getTypeOfMember(element);
-          Expect.equals(type, simplify(mask.elementType, closedWorld), name);
-        }
-
-        var interceptorType =
-            typesInferrer.closedWorld.commonMasks.interceptorType;
-        checkType('myList', interceptorType);
-      }));
-}
diff --git a/tests/compiler/dart2js/inference/list_tracer_length_test.dart b/tests/compiler/dart2js/inference/list_tracer_length_test.dart
index 01523e2..5ad3506 100644
--- a/tests/compiler/dart2js/inference/list_tracer_length_test.dart
+++ b/tests/compiler/dart2js/inference/list_tracer_length_test.dart
@@ -2,8 +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.
 
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-/// Currently it only works with the mock compiler.
+/// TODO(johnniwinther): Currently this only works with the mock compiler.
 
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
diff --git a/tests/compiler/dart2js/inference/list_tracer_node_type_test.dart b/tests/compiler/dart2js/inference/list_tracer_node_type_test.dart
index 62b25da..b1d315f 100644
--- a/tests/compiler/dart2js/inference/list_tracer_node_type_test.dart
+++ b/tests/compiler/dart2js/inference/list_tracer_node_type_test.dart
@@ -2,8 +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.
 
-/// TODO(johnniwinther): Port this test to use the equivalence framework.
-/// Currently it only works with the mock compiler.
+/// TODO(johnniwinther): Currently this only works with the mock compiler.
 
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_and_or_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_and_or_test.dart
index eaacd3e..e990edb 100644
--- a/tests/compiler/dart2js/inference/simple_inferrer_and_or_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_and_or_test.dart
@@ -4,10 +4,12 @@
 
 /// TODO(johnniwinther): Port this test to use the equivalence framework.
 
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/entities.dart';
 import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
 import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
+import '../memory_compiler.dart';
 
 const String TEST = """
 class X {}
@@ -95,35 +97,43 @@
 """;
 
 void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
+  runTest({bool useKernel}) async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': TEST},
+        options: useKernel ? [Flags.useKernel] : []);
+    Expect.isTrue(result.isSuccess);
+    var compiler = result.compiler;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
+    var closedWorld = typesInferrer.closedWorld;
 
-        checkReturn(String name, type) {
-          MemberElement element = findElement(compiler, name);
-          Expect.equals(
-              type,
-              simplify(
-                  typesInferrer.getReturnTypeOfMember(element), closedWorld));
-        }
+    checkReturn(String name, type) {
+      MemberEntity element = findMember(closedWorld, name);
+      Expect.equals(type,
+          simplify(typesInferrer.getReturnTypeOfMember(element), closedWorld));
+    }
 
-        var subclassOfInterceptor = closedWorld.commonMasks.interceptorType;
+    var subclassOfInterceptor = interceptorOrComparable(closedWorld);
 
-        checkReturn('returnDyn1', subclassOfInterceptor);
-        checkReturn('returnDyn2', subclassOfInterceptor);
-        checkReturn('returnDyn3', subclassOfInterceptor);
-        checkReturn(
-            'returnDyn4', closedWorld.commonMasks.dynamicType.nonNullable());
-        checkReturn(
-            'returnDyn5', closedWorld.commonMasks.dynamicType.nonNullable());
-        checkReturn(
-            'returnDyn6', closedWorld.commonMasks.dynamicType.nonNullable());
-        checkReturn('returnDyn7', subclassOfInterceptor);
-        checkReturn('returnDyn7b', subclassOfInterceptor);
-        checkReturn('returnDyn8', subclassOfInterceptor);
-        checkReturn('returnDyn9', subclassOfInterceptor);
-        checkReturn('returnString', closedWorld.commonMasks.stringType);
-      }));
+    checkReturn('returnDyn1', subclassOfInterceptor);
+    checkReturn('returnDyn2', subclassOfInterceptor);
+    checkReturn('returnDyn3', subclassOfInterceptor);
+    checkReturn(
+        'returnDyn4', closedWorld.commonMasks.dynamicType.nonNullable());
+    checkReturn(
+        'returnDyn5', closedWorld.commonMasks.dynamicType.nonNullable());
+    checkReturn(
+        'returnDyn6', closedWorld.commonMasks.dynamicType.nonNullable());
+    checkReturn('returnDyn7', subclassOfInterceptor);
+    checkReturn('returnDyn7b', subclassOfInterceptor);
+    checkReturn('returnDyn8', subclassOfInterceptor);
+    checkReturn('returnDyn9', subclassOfInterceptor);
+    checkReturn('returnString', closedWorld.commonMasks.stringType);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_closure_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_closure_test.dart
index 9b418e9..915eeb4 100644
--- a/tests/compiler/dart2js/inference/simple_inferrer_closure_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_closure_test.dart
@@ -4,10 +4,12 @@
 
 /// TODO(johnniwinther): Port this test to use the equivalence framework.
 
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/entities.dart';
 import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
 import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
+import '../memory_compiler.dart';
 
 const String TEST = """
 returnInt1() {
@@ -117,47 +119,52 @@
 """;
 
 void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
+  runTest({bool useKernel}) async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': TEST},
+        options: useKernel ? [Flags.useKernel] : []);
+    Expect.isTrue(result.isSuccess);
+    var compiler = result.compiler;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
+    var closedWorld = typesInferrer.closedWorld;
 
-        checkReturn(String name, type) {
-          MemberElement element = findElement(compiler, name);
-          Expect.equals(
-              type,
-              simplify(
-                  typesInferrer.getReturnTypeOfMember(element), closedWorld),
-              name);
-        }
+    checkReturn(String name, type) {
+      MemberEntity element = findMember(closedWorld, name);
+      Expect.equals(
+          type,
+          simplify(typesInferrer.getReturnTypeOfMember(element), closedWorld),
+          name);
+    }
 
-        checkReturn('returnInt1', closedWorld.commonMasks.uint31Type);
-        checkReturn('returnInt2', closedWorld.commonMasks.uint31Type);
-        checkReturn('returnInt3', closedWorld.commonMasks.uint31Type);
-        checkReturn('returnInt4', closedWorld.commonMasks.uint31Type);
-        checkReturn(
-            'returnIntOrNull', closedWorld.commonMasks.uint31Type.nullable());
+    checkReturn('returnInt1', closedWorld.commonMasks.uint31Type);
+    checkReturn('returnInt2', closedWorld.commonMasks.uint31Type);
+    checkReturn('returnInt3', closedWorld.commonMasks.uint31Type);
+    checkReturn('returnInt4', closedWorld.commonMasks.uint31Type);
+    checkReturn(
+        'returnIntOrNull', closedWorld.commonMasks.uint31Type.nullable());
 
-        checkReturn(
-            'returnDyn1', closedWorld.commonMasks.dynamicType.nonNullable());
-        checkReturn(
-            'returnDyn2', closedWorld.commonMasks.dynamicType.nonNullable());
-        checkReturn(
-            'returnDyn3', closedWorld.commonMasks.dynamicType.nonNullable());
-        checkReturn('returnNum1', closedWorld.commonMasks.numType);
+    checkReturn(
+        'returnDyn1', closedWorld.commonMasks.dynamicType.nonNullable());
+    checkReturn(
+        'returnDyn2', closedWorld.commonMasks.dynamicType.nonNullable());
+    checkReturn(
+        'returnDyn3', closedWorld.commonMasks.dynamicType.nonNullable());
+    checkReturn('returnNum1', closedWorld.commonMasks.numType);
 
-        checkReturnInClass(String className, String methodName, type) {
-          dynamic cls = findElement(compiler, className);
-          var element = cls.lookupLocalMember(methodName);
-          Expect.equals(
-              type,
-              simplify(
-                  typesInferrer.getReturnTypeOfMember(element), closedWorld));
-        }
+    checkReturnInClass(String className, String methodName, type) {
+      var element = findClassMember(closedWorld, className, methodName);
+      Expect.equals(type,
+          simplify(typesInferrer.getReturnTypeOfMember(element), closedWorld));
+    }
 
-        dynamic cls = findElement(compiler, 'A');
-        checkReturnInClass(
-            'A', 'foo', new TypeMask.nonNullExact(cls, closedWorld));
-      }));
+    dynamic cls = findClass(closedWorld, 'A');
+    checkReturnInClass('A', 'foo', new TypeMask.nonNullExact(cls, closedWorld));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_const_closure2_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_const_closure2_test.dart
index d7c416e..3b418e7 100644
--- a/tests/compiler/dart2js/inference/simple_inferrer_const_closure2_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_const_closure2_test.dart
@@ -4,9 +4,12 @@
 
 /// TODO(johnniwinther): Port this test to use the equivalence framework.
 
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/entities.dart';
 import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import '../compiler_helper.dart';
+import 'type_mask_test_helper.dart';
+import '../memory_compiler.dart';
 
 const String TEST = """
 
@@ -27,19 +30,29 @@
 """;
 
 void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
+  runTest({bool useKernel}) async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': TEST},
+        options: useKernel ? [Flags.useKernel] : []);
+    Expect.isTrue(result.isSuccess);
+    var compiler = result.compiler;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
+    var closedWorld = typesInferrer.closedWorld;
 
-        checkReturn(String name, type) {
-          MemberElement element = findElement(compiler, name);
-          dynamic returnType = typesInferrer.getReturnTypeOfMember(element);
-          Expect.equals(type, returnType.simplify(compiler), name);
-        }
+    checkReturn(String name, type) {
+      MemberEntity element = findMember(closedWorld, name);
+      TypeMask returnType = typesInferrer.getReturnTypeOfMember(element);
+      Expect.equals(type, simplify(returnType, closedWorld), name);
+    }
 
-        checkReturn('method', closedWorld.commonMasks.numType);
-        checkReturn('returnNum', closedWorld.commonMasks.numType);
-      }));
+    checkReturn('method', closedWorld.commonMasks.numType);
+    checkReturn('returnNum', closedWorld.commonMasks.numType);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_final_field2_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_final_field2_test.dart
index 53db6e1..47349b4 100644
--- a/tests/compiler/dart2js/inference/simple_inferrer_final_field2_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_final_field2_test.dart
@@ -8,9 +8,10 @@
 // inferring types for fields.
 
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
-
-import '../compiler_helper.dart';
+import 'type_mask_test_helper.dart';
+import '../memory_compiler.dart';
 
 const String TEST = """
 
@@ -27,21 +28,30 @@
 """;
 
 void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
+  runTest({bool useKernel}) async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': TEST},
+        options: useKernel ? [Flags.useKernel] : []);
+    Expect.isTrue(result.isSuccess);
+    var compiler = result.compiler;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
+    var closedWorld = typesInferrer.closedWorld;
 
-        checkFieldTypeInClass(String className, String fieldName, type) {
-          dynamic cls = findElement(compiler, className);
-          var element = cls.lookupLocalMember(fieldName);
-          Expect.isTrue(
-              typesInferrer.getTypeOfMember(element).containsOnly(type));
-        }
+    checkFieldTypeInClass(String className, String fieldName, type) {
+      var element = findClassMember(closedWorld, className, fieldName);
+      Expect.isTrue(typesInferrer.getTypeOfMember(element).containsOnly(type));
+    }
 
-        checkFieldTypeInClass('A', 'intField',
-            typesInferrer.closedWorld.commonElements.jsUInt31Class);
-        checkFieldTypeInClass('A', 'stringField',
-            typesInferrer.closedWorld.commonElements.jsStringClass);
-      }));
+    checkFieldTypeInClass('A', 'intField',
+        typesInferrer.closedWorld.commonElements.jsUInt31Class);
+    checkFieldTypeInClass('A', 'stringField',
+        typesInferrer.closedWorld.commonElements.jsStringClass);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_final_field3_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_final_field3_test.dart
index 20c319a..613466e 100644
--- a/tests/compiler/dart2js/inference/simple_inferrer_final_field3_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_final_field3_test.dart
@@ -6,10 +6,11 @@
 
 // Test that we are analyzing field parameters correctly.
 
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
 import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
+import '../memory_compiler.dart';
 
 const String TEST = """
 
@@ -26,20 +27,29 @@
 """;
 
 void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
+  runTest({bool useKernel}) async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': TEST},
+        options: useKernel ? [Flags.useKernel] : []);
+    Expect.isTrue(result.isSuccess);
+    var compiler = result.compiler;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
+    var closedWorld = typesInferrer.closedWorld;
 
-        checkFieldTypeInClass(String className, String fieldName, type) {
-          dynamic cls = findElement(compiler, className);
-          var element = cls.lookupLocalMember(fieldName);
-          Expect.equals(type,
-              simplify(typesInferrer.getTypeOfMember(element), closedWorld));
-        }
+    checkFieldTypeInClass(String className, String fieldName, type) {
+      var element = findClassMember(closedWorld, className, fieldName);
+      Expect.equals(
+          type, simplify(typesInferrer.getTypeOfMember(element), closedWorld));
+    }
 
-        checkFieldTypeInClass(
-            'A', 'dynamicField', closedWorld.commonMasks.interceptorType);
-      }));
+    checkFieldTypeInClass(
+        'A', 'dynamicField', interceptorOrComparable(closedWorld));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_test.dart
index 9f79e36..97d1ff9 100644
--- a/tests/compiler/dart2js/inference/simple_inferrer_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_test.dart
@@ -4,12 +4,12 @@
 
 /// TODO(johnniwinther): Port this test to use the equivalence framework.
 
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/entities.dart';
 import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'package:compiler/src/types/types.dart' show TypeMask;
-
 import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
+import '../memory_compiler.dart';
 
 const String TEST = """
 returnNum1(a) {
@@ -521,19 +521,19 @@
 }
 
 testReturnNull4() {
-  var a = topLeveGetter();
+  var a = topLevelGetter();
   if (a == null) return a;
   return null;
 }
 
 testReturnNull5() {
-  var a = topLeveGetter();
+  var a = topLevelGetter();
   if (a != null) return null;
   return a;
 }
 
 testReturnNull6() {
-  var a = topLeveGetter();
+  var a = topLevelGetter();
   if (a == null) return 42;
   return a;
 }
@@ -725,168 +725,164 @@
 """;
 
 void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  compiler.diagnosticHandler = createHandler(compiler, TEST);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-        var commonMasks = closedWorld.commonMasks;
+  runTest({bool useKernel}) async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': TEST},
+        options: useKernel ? [Flags.useKernel] : []);
+    Expect.isTrue(result.isSuccess);
+    var compiler = result.compiler;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
+    var closedWorld = typesInferrer.closedWorld;
+    var commonMasks = closedWorld.commonMasks;
 
-        checkReturn(String name, type) {
-          MemberElement element = findElement(compiler, name);
-          Expect.equals(
-              type,
-              simplify(
-                  typesInferrer.getReturnTypeOfMember(element), closedWorld),
-              name);
-        }
+    checkReturn(String name, type) {
+      MemberEntity element = findMember(closedWorld, name);
+      Expect.equals(
+          type,
+          simplify(typesInferrer.getReturnTypeOfMember(element), closedWorld),
+          name);
+    }
 
-        var interceptorType = commonMasks.interceptorType;
+    var interceptorType = commonMasks.interceptorType;
+    var interceptorOrComparableType = interceptorOrComparable(closedWorld);
 
-        checkReturn('returnNum1', commonMasks.numType);
-        checkReturn('returnNum2', commonMasks.numType);
-        checkReturn('returnInt1', commonMasks.uint31Type);
-        checkReturn('returnInt2', commonMasks.uint31Type);
-        checkReturn('returnDouble', commonMasks.doubleType);
-        checkReturn('returnGiveUp', interceptorType);
-        checkReturn(
-            'returnInt5', commonMasks.uint32Type); // uint31+uint31->uint32
-        checkReturn(
-            'returnInt6', commonMasks.uint32Type); // uint31+uint31->uint32
-        checkReturn('returnIntOrNull', commonMasks.uint31Type.nullable());
-        checkReturn('returnInt3', commonMasks.uint31Type);
-        checkReturn('returnDynamic', commonMasks.dynamicType);
-        checkReturn('returnInt4', commonMasks.uint31Type);
-        checkReturn('returnInt7', commonMasks.positiveIntType);
-        checkReturn('returnInt8', commonMasks.positiveIntType);
-        checkReturn('returnEmpty1', const TypeMask.nonNullEmpty());
-        checkReturn('returnEmpty2', const TypeMask.nonNullEmpty());
-        TypeMask intType = new TypeMask.nonNullSubtype(
-            closedWorld.commonElements.intClass, closedWorld);
-        checkReturn('testIsCheck1', intType);
-        checkReturn('testIsCheck2', intType);
-        checkReturn('testIsCheck3', intType.nullable());
-        checkReturn('testIsCheck4', intType);
-        checkReturn('testIsCheck5', intType);
-        checkReturn('testIsCheck6', commonMasks.dynamicType);
-        checkReturn('testIsCheck7', intType);
-        checkReturn('testIsCheck8', commonMasks.dynamicType);
-        checkReturn('testIsCheck9', intType);
-        checkReturn('testIsCheck10', commonMasks.dynamicType);
-        checkReturn('testIsCheck11', intType);
-        checkReturn('testIsCheck12', commonMasks.dynamicType);
-        checkReturn('testIsCheck13', intType);
-        checkReturn('testIsCheck14', commonMasks.dynamicType);
-        // TODO(29309): Re-enable when 29309 is fixed.
-        // checkReturn('testIsCheck15', intType);
-        checkReturn('testIsCheck16', commonMasks.dynamicType);
-        checkReturn('testIsCheck17', intType);
-        checkReturn('testIsCheck18', commonMasks.dynamicType);
-        checkReturn('testIsCheck19', commonMasks.dynamicType);
-        checkReturn('testIsCheck20', interceptorType);
-        checkReturn('testIsCheck21', commonMasks.dynamicType);
-        checkReturn('testIsCheck22', commonMasks.dynamicType);
-        checkReturn('testIsCheck23', intType);
-        checkReturn('testIsCheck24', intType);
-        checkReturn('testIsCheck25', commonMasks.dynamicType);
-        checkReturn('testIsCheck26', intType);
-        checkReturn('testIsCheck27', intType);
-        checkReturn('testIsCheck28', commonMasks.dynamicType);
-        checkReturn('testIsCheck29', commonMasks.dynamicType);
-        checkReturn('testIf1', commonMasks.uint31Type.nullable());
-        checkReturn('testIf2', commonMasks.uint31Type.nullable());
-        checkReturn(
-            'returnAsString',
-            new TypeMask.subtype(
-                closedWorld.commonElements.stringClass, closedWorld));
-        checkReturn('returnIntAsNum', commonMasks.uint31Type);
-        checkReturn('returnAsTypedef', commonMasks.functionType.nullable());
-        checkReturn('returnTopLevelGetter', commonMasks.uint31Type);
-        checkReturn('testDeadCode', commonMasks.uint31Type);
-        checkReturn('testLabeledIf', commonMasks.uint31Type.nullable());
-        checkReturn(
-            'testSwitch1',
-            simplify(
-                commonMasks.intType
-                    .union(commonMasks.doubleType, closedWorld)
-                    .nullable(),
-                closedWorld));
-        checkReturn('testSwitch2', commonMasks.uint31Type);
-        checkReturn('testSwitch3', interceptorType.nullable());
-        checkReturn('testSwitch4', commonMasks.uint31Type);
-        checkReturn('testSwitch5', commonMasks.uint31Type);
-        checkReturn('testContinue1', interceptorType.nullable());
-        checkReturn('testBreak1', interceptorType.nullable());
-        checkReturn('testContinue2', interceptorType.nullable());
-        checkReturn('testBreak2', commonMasks.uint32Type.nullable());
-        checkReturn('testReturnElementOfConstList1', commonMasks.uint31Type);
-        checkReturn('testReturnElementOfConstList2', commonMasks.uint31Type);
-        checkReturn('testReturnItselfOrInt', commonMasks.uint31Type);
-        checkReturn('testReturnInvokeDynamicGetter', commonMasks.dynamicType);
+    checkReturn('returnNum1', commonMasks.numType);
+    checkReturn('returnNum2', commonMasks.numType);
+    checkReturn('returnInt1', commonMasks.uint31Type);
+    checkReturn('returnInt2', commonMasks.uint31Type);
+    checkReturn('returnDouble', commonMasks.doubleType);
+    checkReturn('returnGiveUp', interceptorOrComparableType);
+    checkReturn('returnInt5', commonMasks.uint32Type); // uint31+uint31->uint32
+    checkReturn('returnInt6', commonMasks.uint32Type); // uint31+uint31->uint32
+    checkReturn('returnIntOrNull', commonMasks.uint31Type.nullable());
+    checkReturn('returnInt3', commonMasks.uint31Type);
+    checkReturn('returnDynamic', commonMasks.dynamicType);
+    checkReturn('returnInt4', commonMasks.uint31Type);
+    checkReturn('returnInt7', commonMasks.positiveIntType);
+    checkReturn('returnInt8', commonMasks.positiveIntType);
+    checkReturn('returnEmpty1', const TypeMask.nonNullEmpty());
+    checkReturn('returnEmpty2', const TypeMask.nonNullEmpty());
+    TypeMask intType = new TypeMask.nonNullSubtype(
+        closedWorld.commonElements.intClass, closedWorld);
+    checkReturn('testIsCheck1', intType);
+    checkReturn('testIsCheck2', intType);
+    checkReturn('testIsCheck3', intType.nullable());
+    checkReturn('testIsCheck4', intType);
+    checkReturn('testIsCheck5', intType);
+    checkReturn('testIsCheck6', commonMasks.dynamicType);
+    checkReturn('testIsCheck7', intType);
+    checkReturn('testIsCheck8', commonMasks.dynamicType);
+    checkReturn('testIsCheck9', intType);
+    checkReturn('testIsCheck10', commonMasks.dynamicType);
+    checkReturn('testIsCheck11', intType);
+    checkReturn('testIsCheck12', commonMasks.dynamicType);
+    checkReturn('testIsCheck13', intType);
+    checkReturn('testIsCheck14', commonMasks.dynamicType);
+    // TODO(29309): Re-enable when 29309 is fixed.
+    // checkReturn('testIsCheck15', intType);
+    checkReturn('testIsCheck16', commonMasks.dynamicType);
+    checkReturn('testIsCheck17', intType);
+    checkReturn('testIsCheck18', commonMasks.dynamicType);
+    checkReturn('testIsCheck19', commonMasks.dynamicType);
+    checkReturn('testIsCheck20', interceptorOrComparableType);
+    checkReturn('testIsCheck21', commonMasks.dynamicType);
+    checkReturn('testIsCheck22', commonMasks.dynamicType);
+    checkReturn('testIsCheck23', intType);
+    checkReturn('testIsCheck24', intType);
+    checkReturn('testIsCheck25', commonMasks.dynamicType);
+    checkReturn('testIsCheck26', intType);
+    checkReturn('testIsCheck27', intType);
+    checkReturn('testIsCheck28', commonMasks.dynamicType);
+    checkReturn('testIsCheck29', commonMasks.dynamicType);
+    checkReturn('testIf1', commonMasks.uint31Type.nullable());
+    checkReturn('testIf2', commonMasks.uint31Type.nullable());
+    checkReturn(
+        'returnAsString',
+        new TypeMask.subtype(
+            closedWorld.commonElements.stringClass, closedWorld));
+    checkReturn('returnIntAsNum', commonMasks.uint31Type);
+    checkReturn('returnAsTypedef', commonMasks.functionType.nullable());
+    checkReturn('returnTopLevelGetter', commonMasks.uint31Type);
+    checkReturn('testDeadCode', commonMasks.uint31Type);
+    checkReturn('testLabeledIf', commonMasks.uint31Type.nullable());
+    checkReturn(
+        'testSwitch1',
+        simplify(
+            commonMasks.intType
+                .union(commonMasks.doubleType, closedWorld)
+                .nullable(),
+            closedWorld));
+    checkReturn('testSwitch2', commonMasks.uint31Type);
+    checkReturn('testSwitch3', interceptorOrComparableType.nullable());
+    checkReturn('testSwitch4', commonMasks.uint31Type);
+    checkReturn('testSwitch5', commonMasks.uint31Type);
+    checkReturn('testContinue1', interceptorOrComparableType.nullable());
+    checkReturn('testBreak1', interceptorOrComparableType.nullable());
+    checkReturn('testContinue2', interceptorOrComparableType.nullable());
+    checkReturn('testBreak2', commonMasks.uint32Type.nullable());
+    checkReturn('testReturnElementOfConstList1', commonMasks.uint31Type);
+    checkReturn('testReturnElementOfConstList2', commonMasks.uint31Type);
+    checkReturn('testReturnItselfOrInt', commonMasks.uint31Type);
+    checkReturn('testReturnInvokeDynamicGetter', commonMasks.dynamicType);
 
-        checkReturn('testDoWhile1', commonMasks.stringType);
-        checkReturn('testDoWhile2', commonMasks.nullType);
-        checkReturn('testDoWhile3', commonMasks.uint31Type);
-        checkReturn('testDoWhile4', commonMasks.numType);
+    checkReturn('testDoWhile1', commonMasks.stringType);
+    checkReturn('testDoWhile2', commonMasks.nullType);
+    checkReturn('testDoWhile3', commonMasks.uint31Type);
+    checkReturn('testDoWhile4', commonMasks.numType);
 
-        checkReturnInClass(String className, String methodName, type) {
-          dynamic cls = findElement(compiler, className);
-          var element = cls.lookupLocalMember(methodName);
-          Expect.equals(
-              type,
-              simplify(
-                  typesInferrer.getReturnTypeOfMember(element), closedWorld),
-              '$className:$methodName');
-        }
+    checkReturnInClass(String className, String methodName, type) {
+      var element = findClassMember(closedWorld, className, methodName);
+      Expect.equals(
+          type,
+          simplify(typesInferrer.getReturnTypeOfMember(element), closedWorld),
+          '$className:$methodName');
+    }
 
-        checkReturnInClass('A', 'returnInt1', commonMasks.uint32Type);
-        checkReturnInClass('A', 'returnInt2', commonMasks.uint32Type);
-        checkReturnInClass('A', 'returnInt3', commonMasks.uint32Type);
-        checkReturnInClass('A', 'returnInt4', commonMasks.uint32Type);
-        checkReturnInClass('A', 'returnInt5', commonMasks.uint32Type);
-        checkReturnInClass('A', 'returnInt6', commonMasks.uint32Type);
-        checkReturnInClass('A', '==', interceptorType);
+    checkReturnInClass('A', 'returnInt1', commonMasks.uint32Type);
+    checkReturnInClass('A', 'returnInt2', commonMasks.uint32Type);
+    checkReturnInClass('A', 'returnInt3', commonMasks.uint32Type);
+    checkReturnInClass('A', 'returnInt4', commonMasks.uint32Type);
+    checkReturnInClass('A', 'returnInt5', commonMasks.uint32Type);
+    checkReturnInClass('A', 'returnInt6', commonMasks.uint32Type);
+    checkReturnInClass('A', '==', interceptorType);
 
-        checkReturnInClass('B', 'returnInt1', commonMasks.uint32Type);
-        checkReturnInClass('B', 'returnInt2', commonMasks.uint32Type);
-        checkReturnInClass('B', 'returnInt3', commonMasks.uint32Type);
-        checkReturnInClass('B', 'returnInt4', commonMasks.uint32Type);
-        checkReturnInClass('B', 'returnInt5', commonMasks.uint32Type);
-        checkReturnInClass('B', 'returnInt6', commonMasks.uint32Type);
-        checkReturnInClass('B', 'returnInt7', commonMasks.uint32Type);
-        checkReturnInClass('B', 'returnInt8', commonMasks.uint32Type);
-        checkReturnInClass('B', 'returnInt9', commonMasks.uint31Type);
+    checkReturnInClass('B', 'returnInt1', commonMasks.uint32Type);
+    checkReturnInClass('B', 'returnInt2', commonMasks.uint32Type);
+    checkReturnInClass('B', 'returnInt3', commonMasks.uint32Type);
+    checkReturnInClass('B', 'returnInt4', commonMasks.uint32Type);
+    checkReturnInClass('B', 'returnInt5', commonMasks.uint32Type);
+    checkReturnInClass('B', 'returnInt6', commonMasks.uint32Type);
+    checkReturnInClass('B', 'returnInt7', commonMasks.uint32Type);
+    checkReturnInClass('B', 'returnInt8', commonMasks.uint32Type);
+    checkReturnInClass('B', 'returnInt9', commonMasks.uint31Type);
 
-        checkReturnInClass('C', 'returnInt1', commonMasks.positiveIntType);
-        checkReturnInClass('C', 'returnInt2', commonMasks.positiveIntType);
-        checkReturnInClass('C', 'returnInt3', commonMasks.positiveIntType);
-        checkReturnInClass('C', 'returnInt4', commonMasks.positiveIntType);
-        checkReturnInClass('C', 'returnInt5', commonMasks.positiveIntType);
-        checkReturnInClass('C', 'returnInt6', commonMasks.positiveIntType);
+    checkReturnInClass('C', 'returnInt1', commonMasks.positiveIntType);
+    checkReturnInClass('C', 'returnInt2', commonMasks.positiveIntType);
+    checkReturnInClass('C', 'returnInt3', commonMasks.positiveIntType);
+    checkReturnInClass('C', 'returnInt4', commonMasks.positiveIntType);
+    checkReturnInClass('C', 'returnInt5', commonMasks.positiveIntType);
+    checkReturnInClass('C', 'returnInt6', commonMasks.positiveIntType);
 
-        checkFactoryConstructor(String className, String factoryName) {
-          dynamic cls = findElement(compiler, className);
-          var element = cls.localLookup(factoryName);
-          Expect.equals(new TypeMask.nonNullExact(cls, closedWorld),
-              typesInferrer.getReturnTypeOfMember(element));
-        }
+    checkReturn('testCascade1', commonMasks.growableListType);
+    ClassEntity clsCascadeHelper = findClass(closedWorld, 'CascadeHelper');
+    checkReturn('testCascade2',
+        new TypeMask.nonNullExact(clsCascadeHelper, closedWorld));
+    checkReturn('testSpecialization1', commonMasks.numType);
+    checkReturn('testSpecialization2', commonMasks.dynamicType);
+    checkReturn('testSpecialization3', commonMasks.uint31Type.nullable());
+    checkReturn('testReturnNull1', commonMasks.nullType);
+    checkReturn('testReturnNull2', commonMasks.nullType);
+    checkReturn('testReturnNull3', commonMasks.dynamicType);
+    checkReturn('testReturnNull4', commonMasks.nullType);
+    checkReturn('testReturnNull5', commonMasks.nullType);
+    checkReturn('testReturnNull6', commonMasks.dynamicType);
+    checkReturn('testReturnNotEquals', commonMasks.boolType);
+  }
 
-        checkFactoryConstructor('A', '');
-
-        checkReturn('testCascade1', commonMasks.growableListType);
-        ClassElement clsCascadeHelper = findElement(compiler, 'CascadeHelper');
-        checkReturn('testCascade2',
-            new TypeMask.nonNullExact(clsCascadeHelper, closedWorld));
-        checkReturn('testSpecialization1', commonMasks.numType);
-        checkReturn('testSpecialization2', commonMasks.dynamicType);
-        checkReturn('testSpecialization3', commonMasks.uint31Type.nullable());
-        checkReturn('testReturnNull1', commonMasks.nullType);
-        checkReturn('testReturnNull2', commonMasks.nullType);
-        checkReturn('testReturnNull3', commonMasks.dynamicType);
-        checkReturn('testReturnNull4', commonMasks.nullType);
-        checkReturn('testReturnNull5', commonMasks.nullType);
-        checkReturn('testReturnNull6', commonMasks.dynamicType);
-        checkReturn('testReturnNotEquals', commonMasks.boolType);
-      }));
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_try_catch_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_try_catch_test.dart
index 8105bd0..bfe19ca 100644
--- a/tests/compiler/dart2js/inference/simple_inferrer_try_catch_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_try_catch_test.dart
@@ -4,12 +4,12 @@
 
 /// TODO(johnniwinther): Port this test to use the equivalence framework.
 
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/entities.dart';
 import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'package:compiler/src/types/types.dart' show TypeMask;
-
 import 'type_mask_test_helper.dart';
-import '../compiler_helper.dart';
+import '../memory_compiler.dart';
 
 const String TEST = """
 returnInt1() {
@@ -166,38 +166,46 @@
 """;
 
 void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-        var commonMasks = closedWorld.commonMasks;
+  runTest({bool useKernel}) async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': TEST},
+        options: useKernel ? [Flags.useKernel] : []);
+    Expect.isTrue(result.isSuccess);
+    var compiler = result.compiler;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
+    var closedWorld = typesInferrer.closedWorld;
+    var commonMasks = closedWorld.commonMasks;
 
-        checkReturn(String name, type) {
-          MemberElement element = findElement(compiler, name);
-          Expect.equals(
-              type,
-              simplify(
-                  typesInferrer.getReturnTypeOfMember(element), closedWorld));
-        }
+    checkReturn(String name, type) {
+      MemberEntity element = findMember(closedWorld, name);
+      Expect.equals(type,
+          simplify(typesInferrer.getReturnTypeOfMember(element), closedWorld));
+    }
 
-        checkReturn('returnInt1', commonMasks.uint31Type);
-        checkReturn('returnInt2', commonMasks.uint31Type);
-        checkReturn('returnInt3', commonMasks.uint31Type);
-        checkReturn('returnInt4', commonMasks.uint31Type);
-        checkReturn('returnInt5', commonMasks.uint31Type);
-        checkReturn(
-            'returnInt6',
-            new TypeMask.nonNullSubtype(
-                closedWorld.commonElements.intClass, closedWorld));
+    checkReturn('returnInt1', commonMasks.uint31Type);
+    checkReturn('returnInt2', commonMasks.uint31Type);
+    checkReturn('returnInt3', commonMasks.uint31Type);
+    checkReturn('returnInt4', commonMasks.uint31Type);
+    checkReturn('returnInt5', commonMasks.uint31Type);
+    checkReturn(
+        'returnInt6',
+        new TypeMask.nonNullSubtype(
+            closedWorld.commonElements.intClass, closedWorld));
 
-        var subclassOfInterceptor = commonMasks.interceptorType;
+    var subclassOfInterceptor = interceptorOrComparable(closedWorld);
 
-        checkReturn('returnDyn1', subclassOfInterceptor);
-        checkReturn('returnDyn2', subclassOfInterceptor);
-        checkReturn('returnDyn3', subclassOfInterceptor);
-        checkReturn('returnDyn4', subclassOfInterceptor);
-        checkReturn('returnDyn5', subclassOfInterceptor);
-        checkReturn('returnDyn6', commonMasks.dynamicType);
-      }));
+    checkReturn('returnDyn1', subclassOfInterceptor);
+    checkReturn('returnDyn2', subclassOfInterceptor);
+    checkReturn('returnDyn3', subclassOfInterceptor);
+    checkReturn('returnDyn4', subclassOfInterceptor);
+    checkReturn('returnDyn5', subclassOfInterceptor);
+    checkReturn('returnDyn6', commonMasks.dynamicType);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/inference/simple_inferrer_unregister_call_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_unregister_call_test.dart
index 5356f65..ae5835a 100644
--- a/tests/compiler/dart2js/inference/simple_inferrer_unregister_call_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_unregister_call_test.dart
@@ -5,9 +5,10 @@
 /// TODO(johnniwinther): Port this test to use the equivalence framework.
 
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
-
-import '../compiler_helper.dart';
+import 'type_mask_test_helper.dart';
+import '../memory_compiler.dart';
 
 const String TEST = """
 var a = '';
@@ -31,18 +32,28 @@
 """;
 
 void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
+  runTest({bool useKernel}) async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': TEST},
+        options: useKernel ? [Flags.useKernel] : []);
+    Expect.isTrue(result.isSuccess);
+    var compiler = result.compiler;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
+    var closedWorld = typesInferrer.closedWorld;
 
-        checkReturnInClass(String className, String methodName, type) {
-          dynamic cls = findElement(compiler, className);
-          var element = cls.lookupLocalMember(methodName);
-          Expect.equals(type, typesInferrer.getReturnTypeOfMember(element));
-        }
+    checkReturnInClass(String className, String methodName, type) {
+      var element = findClassMember(closedWorld, className, methodName);
+      Expect.equals(type, typesInferrer.getReturnTypeOfMember(element));
+    }
 
-        checkReturnInClass(
-            'A', '+', typesInferrer.closedWorld.commonMasks.uint31Type);
-      }));
+    checkReturnInClass(
+        'A', '+', typesInferrer.closedWorld.commonMasks.uint31Type);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/inference/type_combination_test.dart b/tests/compiler/dart2js/inference/type_combination_test.dart
index dbbd030..c79b188 100644
--- a/tests/compiler/dart2js/inference/type_combination_test.dart
+++ b/tests/compiler/dart2js/inference/type_combination_test.dart
@@ -2,18 +2,17 @@
 // 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.
 
-// TODO(johnniwinther): Port this test to be frontend agnostic.
-
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
-import 'package:compiler/src/js_backend/backend.dart' show JavaScriptBackend;
-import 'package:compiler/src/js_backend/js_backend.dart';
+import 'package:compiler/src/common_elements.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/types/types.dart';
 import 'package:compiler/src/world.dart';
-import 'package:compiler/src/universe/use.dart';
-import 'package:compiler/src/universe/world_impact.dart';
-import '../compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
+import '../memory_compiler.dart';
 
 TypeMask nullType;
 TypeMask objectType;
@@ -34,6 +33,7 @@
 TypeMask potentialArray;
 TypeMask potentialString;
 TypeMask jsInterceptor;
+TypeMask jsInterceptorOrComparable;
 
 TypeMask jsIndexable;
 TypeMask jsReadableArray;
@@ -50,6 +50,7 @@
 TypeMask jsUnmodifiableArrayOrNull;
 TypeMask jsIndexableOrNull;
 TypeMask jsInterceptorOrNull;
+TypeMask jsInterceptorOrComparableOrNull;
 
 class Pair {
   final first;
@@ -105,9 +106,7 @@
   }
 }
 
-void testUnion(MockCompiler compiler) {
-  ClosedWorld closedWorld =
-      compiler.resolutionWorldBuilder.closedWorldForTesting;
+void testUnion(ClosedWorld closedWorld) {
   RuleSet ruleSet = new RuleSet(
       'union', (t1, t2) => simplify(t1.union(t2, closedWorld), closedWorld));
   rule(type1, type2, result) => ruleSet.rule(type1, type2, result);
@@ -186,7 +185,7 @@
   rule(jsNumber, jsInteger, jsNumber);
   rule(jsNumber, jsDouble, jsNumber);
   rule(jsNumber, jsIndexable, objectType);
-  rule(jsNumber, jsString, jsInterceptor);
+  rule(jsNumber, jsString, jsInterceptorOrComparable);
   rule(jsNumber, jsReadableArray, jsInterceptor);
   rule(jsNumber, jsMutableArray, jsInterceptor);
   rule(jsNumber, jsExtendableArray, jsInterceptor);
@@ -199,14 +198,14 @@
   rule(jsNumber, jsNumberOrNull, jsNumberOrNull);
   rule(jsNumber, jsIntegerOrNull, jsNumberOrNull);
   rule(jsNumber, jsDoubleOrNull, jsNumberOrNull);
-  rule(jsNumber, jsStringOrNull, jsInterceptorOrNull);
+  rule(jsNumber, jsStringOrNull, jsInterceptorOrComparableOrNull);
   rule(jsNumber, nullType, jsNumberOrNull);
   rule(jsNumber, jsFixedArray, jsInterceptor);
 
   rule(jsInteger, jsInteger, jsInteger);
   rule(jsInteger, jsDouble, jsNumber);
   rule(jsInteger, jsIndexable, objectType);
-  rule(jsInteger, jsString, jsInterceptor);
+  rule(jsInteger, jsString, jsInterceptorOrComparable);
   rule(jsInteger, jsReadableArray, jsInterceptor);
   rule(jsInteger, jsMutableArray, jsInterceptor);
   rule(jsInteger, jsExtendableArray, jsInterceptor);
@@ -219,13 +218,13 @@
   rule(jsInteger, jsNumberOrNull, jsNumberOrNull);
   rule(jsInteger, jsIntegerOrNull, jsIntegerOrNull);
   rule(jsInteger, jsDoubleOrNull, jsNumberOrNull);
-  rule(jsInteger, jsStringOrNull, jsInterceptorOrNull);
+  rule(jsInteger, jsStringOrNull, jsInterceptorOrComparableOrNull);
   rule(jsInteger, nullType, jsIntegerOrNull);
   rule(jsInteger, jsFixedArray, jsInterceptor);
 
   rule(jsDouble, jsDouble, jsDouble);
   rule(jsDouble, jsIndexable, objectType);
-  rule(jsDouble, jsString, jsInterceptor);
+  rule(jsDouble, jsString, jsInterceptorOrComparable);
   rule(jsDouble, jsReadableArray, jsInterceptor);
   rule(jsDouble, jsMutableArray, jsInterceptor);
   rule(jsDouble, jsExtendableArray, jsInterceptor);
@@ -238,7 +237,7 @@
   rule(jsDouble, jsNumberOrNull, jsNumberOrNull);
   rule(jsDouble, jsIntegerOrNull, jsNumberOrNull);
   rule(jsDouble, jsDoubleOrNull, jsDoubleOrNull);
-  rule(jsDouble, jsStringOrNull, jsInterceptorOrNull);
+  rule(jsDouble, jsStringOrNull, jsInterceptorOrComparableOrNull);
   rule(jsDouble, nullType, jsDoubleOrNull);
   rule(jsDouble, jsFixedArray, jsInterceptor);
 
@@ -270,9 +269,9 @@
   rule(jsString, potentialArray, dynamicType);
   rule(jsString, potentialString, potentialString);
   rule(jsString, jsBooleanOrNull, jsInterceptorOrNull);
-  rule(jsString, jsNumberOrNull, jsInterceptorOrNull);
-  rule(jsString, jsIntegerOrNull, jsInterceptorOrNull);
-  rule(jsString, jsDoubleOrNull, jsInterceptorOrNull);
+  rule(jsString, jsNumberOrNull, jsInterceptorOrComparableOrNull);
+  rule(jsString, jsIntegerOrNull, jsInterceptorOrComparableOrNull);
+  rule(jsString, jsDoubleOrNull, jsInterceptorOrComparableOrNull);
   rule(jsString, jsStringOrNull, jsStringOrNull);
   rule(jsString, nullType, jsStringOrNull);
   rule(jsString, jsFixedArray, jsIndexable);
@@ -386,18 +385,18 @@
   rule(jsNumberOrNull, jsNumberOrNull, jsNumberOrNull);
   rule(jsNumberOrNull, jsIntegerOrNull, jsNumberOrNull);
   rule(jsNumberOrNull, jsDoubleOrNull, jsNumberOrNull);
-  rule(jsNumberOrNull, jsStringOrNull, jsInterceptorOrNull);
+  rule(jsNumberOrNull, jsStringOrNull, jsInterceptorOrComparableOrNull);
   rule(jsNumberOrNull, nullType, jsNumberOrNull);
   rule(jsNumberOrNull, jsFixedArray, jsInterceptorOrNull);
 
   rule(jsIntegerOrNull, jsIntegerOrNull, jsIntegerOrNull);
   rule(jsIntegerOrNull, jsDoubleOrNull, jsNumberOrNull);
-  rule(jsIntegerOrNull, jsStringOrNull, jsInterceptorOrNull);
+  rule(jsIntegerOrNull, jsStringOrNull, jsInterceptorOrComparableOrNull);
   rule(jsIntegerOrNull, nullType, jsIntegerOrNull);
   rule(jsIntegerOrNull, jsFixedArray, jsInterceptorOrNull);
 
   rule(jsDoubleOrNull, jsDoubleOrNull, jsDoubleOrNull);
-  rule(jsDoubleOrNull, jsStringOrNull, jsInterceptorOrNull);
+  rule(jsDoubleOrNull, jsStringOrNull, jsInterceptorOrComparableOrNull);
   rule(jsDoubleOrNull, nullType, jsDoubleOrNull);
   rule(jsDoubleOrNull, jsFixedArray, jsInterceptorOrNull);
 
@@ -418,9 +417,7 @@
   ruleSet.validateCoverage();
 }
 
-void testIntersection(MockCompiler compiler) {
-  ClosedWorld closedWorld =
-      compiler.resolutionWorldBuilder.closedWorldForTesting;
+void testIntersection(ClosedWorld closedWorld) {
   RuleSet ruleSet =
       new RuleSet('intersection', (t1, t2) => t1.intersection(t2, closedWorld));
   rule(type1, type2, result) => ruleSet.rule(type1, type2, result);
@@ -735,9 +732,7 @@
   ruleSet.validateCoverage();
 }
 
-void testRegressions(MockCompiler compiler) {
-  ClosedWorld closedWorld =
-      compiler.resolutionWorldBuilder.closedWorldForTesting;
+void testRegressions(ClosedWorld closedWorld) {
   TypeMask nonNullPotentialString =
       new TypeMask.nonNullSubtype(patternClass, closedWorld);
   Expect.equals(potentialString,
@@ -746,113 +741,114 @@
 
 void main() {
   asyncTest(() async {
-    MockCompiler compiler = new MockCompiler.internal();
-    await compiler.init("""
-    class PatternImpl implements Pattern {}
-    """);
-    JavaScriptBackend backend = compiler.backend;
-    WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl();
-    LibraryElement interceptorsLibrary =
-        compiler.resolution.commonElements.interceptorsLibrary;
-    interceptorsLibrary.forEachLocalMember((dynamic element) {
-      if (element.isClass) {
-        element.ensureResolved(compiler.resolution);
-        impactBuilder
-            .registerTypeUse(new TypeUse.instantiation(element.rawType));
-      }
-    });
-    LibraryElement mainApp = compiler.mainApp;
-    ClassElement patternImplClass = mainApp.find('PatternImpl');
-    patternImplClass.ensureResolved(compiler.resolution);
-
-    impactBuilder.registerTypeUse(new TypeUse.instantiation(
-        compiler.resolution.commonElements.mapType()));
-    impactBuilder.registerTypeUse(new TypeUse.instantiation(
-        compiler.resolution.commonElements.functionType));
-    impactBuilder
-        .registerTypeUse(new TypeUse.instantiation(patternImplClass.rawType));
-    compiler.enqueuer.resolution.applyImpact(impactBuilder);
-    backend.onResolutionEnd();
-    compiler.closeResolution(null);
-    ClosedWorld closedWorld =
-        compiler.resolutionWorldBuilder.closedWorldForTesting;
-
-    // Grab hold of a supertype for String so we can produce potential
-    // string types.
-    LibraryElement coreLibrary = closedWorld.commonElements.coreLibrary;
-    patternClass = coreLibrary.find('Pattern');
-
-    nonPrimitive1 = new TypeMask.nonNullSubtype(
-        closedWorld.commonElements.mapClass, closedWorld);
-    nonPrimitive2 = new TypeMask.nonNullSubtype(
-        closedWorld.commonElements.functionClass, closedWorld);
-    potentialArray =
-        new TypeMask.subtype(closedWorld.commonElements.listClass, closedWorld);
-    potentialString = new TypeMask.subtype(patternClass, closedWorld);
-    jsInterceptor = new TypeMask.nonNullSubclass(
-        closedWorld.commonElements.jsInterceptorClass, closedWorld);
-    jsArrayOrNull = new TypeMask.subclass(
-        closedWorld.commonElements.jsArrayClass, closedWorld);
-    jsReadableArray = new TypeMask.nonNullSubclass(
-        closedWorld.commonElements.jsArrayClass, closedWorld);
-    jsMutableArrayOrNull = new TypeMask.subclass(
-        closedWorld.commonElements.jsMutableArrayClass, closedWorld);
-    jsMutableArray = new TypeMask.nonNullSubclass(
-        closedWorld.commonElements.jsMutableArrayClass, closedWorld);
-    jsFixedArrayOrNull = new TypeMask.exact(
-        closedWorld.commonElements.jsFixedArrayClass, closedWorld);
-    jsFixedArray = new TypeMask.nonNullExact(
-        closedWorld.commonElements.jsFixedArrayClass, closedWorld);
-    jsExtendableArrayOrNull = new TypeMask.exact(
-        closedWorld.commonElements.jsExtendableArrayClass, closedWorld);
-    jsExtendableArray = new TypeMask.nonNullExact(
-        closedWorld.commonElements.jsExtendableArrayClass, closedWorld);
-    jsUnmodifiableArrayOrNull = new TypeMask.exact(
-        closedWorld.commonElements.jsUnmodifiableArrayClass, closedWorld);
-    jsUnmodifiableArray = new TypeMask.nonNullExact(
-        closedWorld.commonElements.jsUnmodifiableArrayClass, closedWorld);
-    jsIndexableOrNull = new TypeMask.subtype(
-        closedWorld.commonElements.jsIndexableClass, closedWorld);
-    jsIndexable = new TypeMask.nonNullSubtype(
-        closedWorld.commonElements.jsIndexableClass, closedWorld);
-    jsInterceptorOrNull = new TypeMask.subclass(
-        closedWorld.commonElements.jsInterceptorClass, closedWorld);
-    jsStringOrNull = new TypeMask.exact(
-        closedWorld.commonElements.jsStringClass, closedWorld);
-    jsString = new TypeMask.nonNullExact(
-        closedWorld.commonElements.jsStringClass, closedWorld);
-    jsBoolean = new TypeMask.nonNullExact(
-        closedWorld.commonElements.jsBoolClass, closedWorld);
-    jsNumber = new TypeMask.nonNullSubclass(
-        closedWorld.commonElements.jsNumberClass, closedWorld);
-    jsInteger = new TypeMask.nonNullExact(
-        closedWorld.commonElements.jsIntClass, closedWorld);
-    jsDouble = new TypeMask.nonNullExact(
-        closedWorld.commonElements.jsDoubleClass, closedWorld);
-    jsBooleanOrNull =
-        new TypeMask.exact(closedWorld.commonElements.jsBoolClass, closedWorld);
-    jsNumberOrNull = new TypeMask.subclass(
-        closedWorld.commonElements.jsNumberClass, closedWorld);
-    jsIntegerOrNull =
-        new TypeMask.exact(closedWorld.commonElements.jsIntClass, closedWorld);
-    jsDoubleOrNull = new TypeMask.exact(
-        closedWorld.commonElements.jsDoubleClass, closedWorld);
-    nullType = const TypeMask.empty();
-    objectType = new TypeMask.nonNullSubclass(
-        closedWorld.commonElements.objectClass, closedWorld);
-    emptyType = const TypeMask.nonNullEmpty();
-    dynamicType = new TypeMask.subclass(
-        closedWorld.commonElements.objectClass, closedWorld);
-
-    Expect.notEquals(
-        emptyType, nonPrimitive1, "nonPrimitive1 expected to be non-empty.");
-    Expect.notEquals(jsStringOrNull, potentialString,
-        "potentialString expected not to be exact JSString");
-    Expect.notEquals(jsArrayOrNull, potentialArray,
-        "potentialArray expected not to be JSArray subclass");
-
-    testUnion(compiler);
-    testIntersection(compiler);
-    testRegressions(compiler);
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
   });
 }
+
+runTests({bool useKernel}) async {
+  CompilationResult result = await runCompiler(
+      memorySourceFiles: {
+        'main.dart': r'''
+    import 'dart:collection';
+    class AList<E> extends ListBase<E> {}
+    main() {
+      print('${0}${true}${null}${0.5}${[]}${{}}');
+      print('${"".split("")}${new RegExp('')}');
+      print('${const []}${const {}}${(){}}${new AList()}');
+    }
+    '''
+      },
+      options: useKernel ? [Flags.useKernel] : [],
+      beforeRun: (compiler) => compiler.stopAfterTypeInference = true);
+  Expect.isTrue(result.isSuccess);
+  Compiler compiler = result.compiler;
+  ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+  CommonElements commonElements = closedWorld.commonElements;
+  ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+
+  // Grab hold of a supertype for String so we can produce potential
+  // string types.
+  LibraryEntity coreLibrary = commonElements.coreLibrary;
+  patternClass = elementEnvironment.lookupClass(coreLibrary, 'Pattern');
+
+  nonPrimitive1 = new TypeMask.nonNullSubtype(
+      closedWorld.commonElements.mapClass, closedWorld);
+  nonPrimitive2 = new TypeMask.nonNullSubtype(
+      closedWorld.commonElements.functionClass, closedWorld);
+  potentialArray =
+      new TypeMask.subtype(closedWorld.commonElements.listClass, closedWorld);
+  potentialString = new TypeMask.subtype(patternClass, closedWorld);
+  jsInterceptor = new TypeMask.nonNullSubclass(
+      closedWorld.commonElements.jsInterceptorClass, closedWorld);
+  jsArrayOrNull = new TypeMask.subclass(
+      closedWorld.commonElements.jsArrayClass, closedWorld);
+  jsReadableArray = new TypeMask.nonNullSubclass(
+      closedWorld.commonElements.jsArrayClass, closedWorld);
+  jsMutableArrayOrNull = new TypeMask.subclass(
+      closedWorld.commonElements.jsMutableArrayClass, closedWorld);
+  jsMutableArray = new TypeMask.nonNullSubclass(
+      closedWorld.commonElements.jsMutableArrayClass, closedWorld);
+  jsFixedArrayOrNull = new TypeMask.exact(
+      closedWorld.commonElements.jsFixedArrayClass, closedWorld);
+  jsFixedArray = new TypeMask.nonNullExact(
+      closedWorld.commonElements.jsFixedArrayClass, closedWorld);
+  jsExtendableArrayOrNull = new TypeMask.exact(
+      closedWorld.commonElements.jsExtendableArrayClass, closedWorld);
+  jsExtendableArray = new TypeMask.nonNullExact(
+      closedWorld.commonElements.jsExtendableArrayClass, closedWorld);
+  jsUnmodifiableArrayOrNull = new TypeMask.exact(
+      closedWorld.commonElements.jsUnmodifiableArrayClass, closedWorld);
+  jsUnmodifiableArray = new TypeMask.nonNullExact(
+      closedWorld.commonElements.jsUnmodifiableArrayClass, closedWorld);
+  jsIndexableOrNull = new TypeMask.subtype(
+      closedWorld.commonElements.jsIndexableClass, closedWorld);
+  jsIndexable = new TypeMask.nonNullSubtype(
+      closedWorld.commonElements.jsIndexableClass, closedWorld);
+  jsInterceptorOrNull = new TypeMask.subclass(
+      closedWorld.commonElements.jsInterceptorClass, closedWorld);
+  jsStringOrNull =
+      new TypeMask.exact(closedWorld.commonElements.jsStringClass, closedWorld);
+  jsString = new TypeMask.nonNullExact(
+      closedWorld.commonElements.jsStringClass, closedWorld);
+  jsBoolean = new TypeMask.nonNullExact(
+      closedWorld.commonElements.jsBoolClass, closedWorld);
+  jsNumber = new TypeMask.nonNullSubclass(
+      closedWorld.commonElements.jsNumberClass, closedWorld);
+  jsInteger = new TypeMask.nonNullExact(
+      closedWorld.commonElements.jsIntClass, closedWorld);
+  jsDouble = new TypeMask.nonNullExact(
+      closedWorld.commonElements.jsDoubleClass, closedWorld);
+  jsBooleanOrNull =
+      new TypeMask.exact(closedWorld.commonElements.jsBoolClass, closedWorld);
+  jsNumberOrNull = new TypeMask.subclass(
+      closedWorld.commonElements.jsNumberClass, closedWorld);
+  jsIntegerOrNull =
+      new TypeMask.exact(closedWorld.commonElements.jsIntClass, closedWorld);
+  jsDoubleOrNull =
+      new TypeMask.exact(closedWorld.commonElements.jsDoubleClass, closedWorld);
+  nullType = const TypeMask.empty();
+  objectType = new TypeMask.nonNullSubclass(
+      closedWorld.commonElements.objectClass, closedWorld);
+  emptyType = const TypeMask.nonNullEmpty();
+  dynamicType = new TypeMask.subclass(
+      closedWorld.commonElements.objectClass, closedWorld);
+
+  jsInterceptorOrComparable =
+      interceptorOrComparable(closedWorld, nullable: false);
+  jsInterceptorOrComparableOrNull =
+      interceptorOrComparable(closedWorld, nullable: true);
+
+  Expect.notEquals(
+      emptyType, nonPrimitive1, "nonPrimitive1 expected to be non-empty.");
+  Expect.notEquals(jsStringOrNull, potentialString,
+      "potentialString expected not to be exact JSString");
+  Expect.notEquals(jsArrayOrNull, potentialArray,
+      "potentialArray expected not to be JSArray subclass");
+
+  testUnion(closedWorld);
+  testIntersection(closedWorld);
+  testRegressions(closedWorld);
+}
diff --git a/tests/compiler/dart2js/inference/type_inference6_test.dart b/tests/compiler/dart2js/inference/type_inference6_test.dart
index 0c899a5..659e104 100644
--- a/tests/compiler/dart2js/inference/type_inference6_test.dart
+++ b/tests/compiler/dart2js/inference/type_inference6_test.dart
@@ -4,12 +4,12 @@
 
 /// TODO(johnniwinther): Port this test to use the equivalence framework.
 
-import "package:async_helper/async_helper.dart";
-import "package:expect/expect.dart";
-import '../compiler_helper.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:expect/expect.dart';
 import 'type_mask_test_helper.dart';
-
-import 'dart:async';
+import '../memory_compiler.dart';
 
 const String TEST = r"""
 foo() {
@@ -22,23 +22,25 @@
 }
 """;
 
-Future runTest() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  return compiler.run(uri).then((_) {
+main() {
+  runTest({bool useKernel}) async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': TEST},
+        options: useKernel ? [Flags.useKernel] : []);
+    Expect.isTrue(result.isSuccess);
+    var compiler = result.compiler;
     var typesInferrer = compiler.globalInference.typesInferrerInternal;
     var closedWorld = typesInferrer.closedWorld;
     var commonMasks = closedWorld.commonMasks;
-    MemberElement element = findElement(compiler, "foo");
+    MemberEntity element = findMember(closedWorld, "foo");
     var mask = typesInferrer.getReturnTypeOfMember(element);
     Expect.equals(commonMasks.uint31Type, simplify(mask, closedWorld));
-  });
-}
+  }
 
-main() {
-  asyncStart();
-  runTest().then((_) {
-    // Make sure that the type is still correct when we do a second compilation.
-    return runTest();
-  }).whenComplete(asyncEnd);
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/inference/type_inference_switch_test.dart b/tests/compiler/dart2js/inference/type_inference_switch_test.dart
index 20da364..9823a26 100644
--- a/tests/compiler/dart2js/inference/type_inference_switch_test.dart
+++ b/tests/compiler/dart2js/inference/type_inference_switch_test.dart
@@ -4,12 +4,12 @@
 
 /// TODO(johnniwinther): Port this test to use the equivalence framework.
 
-import "package:async_helper/async_helper.dart";
-import "package:expect/expect.dart";
-import '../compiler_helper.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:expect/expect.dart';
 import 'type_mask_test_helper.dart';
-
-import 'dart:async';
+import '../memory_compiler.dart';
 
 const String TEST1 = r"""
 foo(int x) {
@@ -132,31 +132,39 @@
 }
 """;
 
-Future runTest(String test, checker) {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(test, uri);
-  return compiler.run(uri).then((_) {
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-    var commonMasks = closedWorld.commonMasks;
+main() {
+  runTests({bool useKernel}) async {
+    runTest(String test, checker) async {
+      CompilationResult result = await runCompiler(
+          memorySourceFiles: {'main.dart': test},
+          options: useKernel ? [Flags.useKernel] : []);
+      Expect.isTrue(result.isSuccess);
+      var compiler = result.compiler;
+      var typesInferrer = compiler.globalInference.typesInferrerInternal;
+      var closedWorld = typesInferrer.closedWorld;
+      var commonMasks = closedWorld.commonMasks;
 
-    checkTypeOf(String name, TypeMask type) {
-      MemberElement element = findElement(compiler, name);
-      var mask = typesInferrer.getReturnTypeOfMember(element);
-      Expect.equals(type, simplify(mask, closedWorld));
+      checkTypeOf(String name, TypeMask type) {
+        FunctionEntity element = findMember(closedWorld, name);
+        var mask = typesInferrer.getReturnTypeOfMember(element);
+        Expect.equals(type, simplify(mask, closedWorld));
+      }
+
+      checker(commonMasks, checkTypeOf);
     }
 
-    checker(commonMasks, checkTypeOf);
-  });
-}
-
-main() {
-  asyncTest(() async {
     await runTest(TEST1, (t, c) => c("foo", t.stringType));
     await runTest(TEST2, (t, c) => c("foo", t.stringType.nullable()));
     await runTest(TEST3, (t, c) => c("foo", t.uint31Type.nullable()));
     await runTest(TEST4, (t, c) => c("foo", t.uint31Type));
     await runTest(TEST5, (t, c) => c("foo", t.uint31Type.nullable()));
     await runTest(TEST6, (t, c) => c("foo", t.uint31Type.nullable()));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/inference/type_mask_test_helper.dart b/tests/compiler/dart2js/inference/type_mask_test_helper.dart
index 414d259..450821c 100644
--- a/tests/compiler/dart2js/inference/type_mask_test_helper.dart
+++ b/tests/compiler/dart2js/inference/type_mask_test_helper.dart
@@ -4,9 +4,14 @@
 
 library type_mask_test_helper;
 
+import 'package:compiler/src/common_elements.dart' show ElementEnvironment;
+import 'package:compiler/src/elements/entities.dart'
+    show ClassEntity, MemberEntity;
 import 'package:compiler/src/types/types.dart';
 import 'package:compiler/src/world.dart' show ClosedWorld;
 
+export 'package:compiler/src/types/types.dart';
+
 TypeMask simplify(TypeMask mask, ClosedWorld closedWorld) {
   if (mask is ForwardingTypeMask) {
     return simplify(mask.forwardTo, closedWorld);
@@ -16,3 +21,49 @@
     return mask;
   }
 }
+
+TypeMask interceptorOrComparable(ClosedWorld closedWorld,
+    {bool nullable: false}) {
+  // TODO(johnniwinther): The mock libraries are missing 'Comparable' and
+  // therefore consider the union of for instance 'String' and 'num' to be
+  // 'Interceptor' and not 'Comparable'. Maybe the union mask should be changed
+  // to favor 'Interceptor' when flattening.
+  if (nullable) {
+    return new TypeMask.subtype(
+        closedWorld.elementEnvironment
+            .lookupClass(closedWorld.commonElements.coreLibrary, 'Comparable'),
+        closedWorld);
+  } else {
+    return new TypeMask.nonNullSubtype(
+        closedWorld.elementEnvironment
+            .lookupClass(closedWorld.commonElements.coreLibrary, 'Comparable'),
+        closedWorld);
+  }
+}
+
+ClassEntity findClass(ClosedWorld closedWorld, String name) {
+  ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+  ClassEntity cls =
+      elementEnvironment.lookupClass(elementEnvironment.mainLibrary, name);
+  assert(cls != null, "Class '$name' not found.");
+  return cls;
+}
+
+MemberEntity findClassMember(
+    ClosedWorld closedWorld, String className, String memberName) {
+  ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+  ClassEntity cls =
+      elementEnvironment.lookupClass(elementEnvironment.mainLibrary, className);
+  assert(cls != null, "Class '$className' not found.");
+  MemberEntity member = elementEnvironment.lookupClassMember(cls, memberName);
+  assert(member != null, "Member '$memberName' not found in $cls.");
+  return member;
+}
+
+MemberEntity findMember(ClosedWorld closedWorld, String name) {
+  ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+  MemberEntity member = elementEnvironment.lookupLibraryMember(
+      elementEnvironment.mainLibrary, name);
+  assert(member != null, "Member '$name' not found.");
+  return member;
+}
diff --git a/tests/compiler/dart2js/kernel/compiler_helper.dart b/tests/compiler/dart2js/kernel/compiler_helper.dart
index 56d9b7d..903758a 100644
--- a/tests/compiler/dart2js/kernel/compiler_helper.dart
+++ b/tests/compiler/dart2js/kernel/compiler_helper.dart
@@ -14,11 +14,15 @@
 import 'package:compiler/src/common.dart';
 import 'package:compiler/src/common/tasks.dart';
 import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/dart2js.dart' as dart2js;
+import 'package:compiler/src/filenames.dart';
 import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/library_loader.dart';
 import 'package:compiler/src/universe/world_builder.dart';
 import 'package:compiler/src/util/util.dart';
+import 'package:expect/expect.dart';
 import 'package:kernel/ast.dart' as ir;
+import 'package:sourcemap_testing/src/stacktrace_helper.dart';
 import '../memory_compiler.dart';
 
 /// Analyze [memorySourceFiles] with [entryPoint] as entry-point using the
@@ -80,6 +84,47 @@
   return entryPoint;
 }
 
+Future<Compiler> runWithD8(
+    {Uri entryPoint,
+    Map<String, String> memorySourceFiles: const <String, String>{},
+    List<String> options: const <String>[],
+    String expectedOutput,
+    bool printJs: false}) async {
+  entryPoint ??= Uri.parse('memory:main.dart');
+  Uri mainFile =
+      await createTemp(entryPoint, memorySourceFiles, printSteps: true);
+  String output = uriPathToNative(mainFile.resolve('out.js').path);
+  List<String> dart2jsArgs = [
+    mainFile.toString(),
+    '-o$output',
+    '--packages=${Platform.packageConfig}',
+  ]..addAll(options);
+  print('Running: dart2js ${dart2jsArgs.join(' ')}');
+
+  CompilationResult result = await dart2js.internalMain(dart2jsArgs);
+  Expect.isTrue(result.isSuccess);
+  if (printJs) {
+    print('dart2js output:');
+    print(new File(output).readAsStringSync());
+  }
+
+  List<String> d8Args = [
+    'sdk/lib/_internal/js_runtime/lib/preambles/d8.js',
+    output
+  ];
+  print('Running: d8 ${d8Args.join(' ')}');
+  ProcessResult runResult = Process.runSync(d8executable, d8Args);
+  String out = '${runResult.stderr}\n${runResult.stdout}';
+  print('d8 output:');
+  print(out);
+  if (expectedOutput != null) {
+    Expect.equals(0, runResult.exitCode);
+    Expect.stringEquals(
+        expectedOutput, runResult.stdout.replaceAll('\r\n', '\n'));
+  }
+  return result.compiler;
+}
+
 Future<Compiler> compileWithDill(
     {Uri entryPoint,
     Map<String, String> memorySourceFiles: const <String, String>{},
diff --git a/tests/compiler/dart2js/kernel/run_from_dill_test.dart b/tests/compiler/dart2js/kernel/run_from_dill_test.dart
index 77243cc..6012caf 100644
--- a/tests/compiler/dart2js/kernel/run_from_dill_test.dart
+++ b/tests/compiler/dart2js/kernel/run_from_dill_test.dart
@@ -6,14 +6,9 @@
 library dart2js.kernel.run_from_dill_test;
 
 import 'dart:async';
-import 'dart:io';
 
 import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
 import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/dart2js.dart' as dart2js;
-import 'package:compiler/src/filenames.dart';
-import 'package:sourcemap_testing/src/stacktrace_helper.dart';
 
 import 'compiler_helper.dart';
 import '../serialization/helper.dart';
@@ -104,28 +99,11 @@
     memorySourceFiles = SOURCE;
   }
 
-  Uri mainFile =
-      await createTemp(entryPoint, memorySourceFiles, printSteps: true);
-  String output = uriPathToNative(mainFile.resolve('out.js').path);
-  List<String> dart2jsArgs = [
-    mainFile.toString(),
-    '-o$output',
-    Flags.useKernel,
-    Flags.enableAssertMessage,
-    '--packages=${Platform.packageConfig}',
-  ];
-  print('Running: dart2js ${dart2jsArgs.join(' ')}');
-
-  await dart2js.internalMain(dart2jsArgs);
-
-  print('---- run from dill --------------------------------------------');
-  ProcessResult runResult = Process.runSync(d8executable,
-      ['sdk/lib/_internal/js_runtime/lib/preambles/d8.js', output]);
-  String out = '${runResult.stderr}\n${runResult.stdout}';
-  print('d8 output:');
-  print(out);
-  Expect.equals(0, runResult.exitCode);
-  Expect.equals(OUTPUT, runResult.stdout.replaceAll('\r\n', '\n'));
+  await runWithD8(
+      entryPoint: entryPoint,
+      memorySourceFiles: memorySourceFiles,
+      options: [Flags.useKernel, Flags.enableAssertMessage],
+      expectedOutput: OUTPUT);
 
   return ResultKind.success;
 }
diff --git a/tests/compiler/dart2js/rti/data/closure.dart b/tests/compiler/dart2js/rti/data/closure.dart
new file mode 100644
index 0000000..408d0ae
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/closure.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: A.:classNeedsRti*/
+class A<T> {
+  /*element: A.m:*/
+  m() {
+    return /*methodNeedsRti*/ (T t) {};
+  }
+}
+
+/*element: main:*/
+main() {
+  new A<int>().m() is void Function(int);
+}
diff --git a/tests/compiler/dart2js/rti/data/dependency.dart b/tests/compiler/dart2js/rti/data/dependency.dart
new file mode 100644
index 0000000..5c0a3e1
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/dependency.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: A.:*/
+class A<T> {
+  /*element: A.m:*/
+  m() => new B<T>();
+}
+
+/*element: B.:deps=[A]*/
+class B<T> {}
+
+/*element: main:*/
+main() {
+  new A<int>().m();
+}
diff --git a/tests/compiler/dart2js/rti/data/direct.dart b/tests/compiler/dart2js/rti/data/direct.dart
new file mode 100644
index 0000000..6b322cf
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/direct.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: A.:classNeedsRti,explicit=[A<int>]*/
+class A<T> {}
+
+/*element: main:*/
+main() {
+  new A<int>() is A<int>;
+}
diff --git a/tests/compiler/dart2js/rti/data/is_type_variable.dart b/tests/compiler/dart2js/rti/data/is_type_variable.dart
new file mode 100644
index 0000000..ba682ba
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/is_type_variable.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: A.:classNeedsRti,test,explicit=[A.T]*/
+class A<T> {
+  /*element: A.m:*/
+  m(T t) => t is T;
+}
+
+/*element: main:*/
+main() {
+  new A<int>().m(0);
+}
diff --git a/tests/compiler/dart2js/rti/data/is_type_variable_super.dart b/tests/compiler/dart2js/rti/data/is_type_variable_super.dart
new file mode 100644
index 0000000..a4569b8
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/is_type_variable_super.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: A.:*/
+class A<T> {}
+
+/*element: B.:classNeedsRti,test,explicit=[B.T],implicit=[B.T]*/
+class B<T> extends A<T> {
+  /*element: B.m:*/
+  m(T t) => t is T;
+}
+
+/*element: main:*/
+main() {
+  new B<int>().m(0);
+}
diff --git a/tests/compiler/dart2js/rti/data/is_type_variable_super_complex.dart b/tests/compiler/dart2js/rti/data/is_type_variable_super_complex.dart
new file mode 100644
index 0000000..c0d1f0a
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/is_type_variable_super_complex.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: A.:*/
+class A<T> {}
+
+/*element: B.:classNeedsRti,test,explicit=[B.T],implicit=[List<B.T>]*/
+class B<T> extends A<List<T>> {
+  /*element: B.m:*/
+  m(T t) => t is T;
+}
+
+/*element: main:*/
+main() {
+  new B<int>().m(0);
+}
diff --git a/tests/compiler/dart2js/rti/data/subclass.dart b/tests/compiler/dart2js/rti/data/subclass.dart
new file mode 100644
index 0000000..8bb50fb
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/subclass.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: A.:classNeedsRti,explicit=[A<int>]*/
+class A<T> {}
+
+/*element: B.:classNeedsRti*/
+class B<T> extends A<T> {}
+
+/*element: main:*/
+main() {
+  new B<int>() is A<int>;
+}
diff --git a/tests/compiler/dart2js/rti/data/subclass_fixed.dart b/tests/compiler/dart2js/rti/data/subclass_fixed.dart
new file mode 100644
index 0000000..b0c5b26
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/subclass_fixed.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: A.:classNeedsRti,explicit=[A<int>]*/
+class A<T> {}
+
+/*element: B.:*/
+class B extends A<int> {}
+
+/*element: main:*/
+main() {
+  new B() is A<int>;
+}
diff --git a/tests/compiler/dart2js/rti/data/superclass.dart b/tests/compiler/dart2js/rti/data/superclass.dart
new file mode 100644
index 0000000..49e1430
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/superclass.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: A.:*/
+class A<T> {}
+
+/*element: B.:classNeedsRti,explicit=[B<int>]*/
+class B<T> extends A<T> {}
+
+/*element: main:*/
+main() {
+  new B<int>() is B<int>;
+}
diff --git a/tests/compiler/dart2js/rti/data/tear_off.dart b/tests/compiler/dart2js/rti/data/tear_off.dart
new file mode 100644
index 0000000..d3175aa
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/tear_off.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: A.:classNeedsRti*/
+class A<T> {
+  /*element: A.m:methodNeedsRti*/
+  void m(T t) {}
+}
+
+/*element: main:*/
+main() {
+  new A<int>().m is void Function(int);
+}
diff --git a/tests/compiler/dart2js/rti/data/type_literal.dart b/tests/compiler/dart2js/rti/data/type_literal.dart
new file mode 100644
index 0000000..58cf810
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/type_literal.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: A.:classNeedsRti,exp*/
+class A<T> {
+  /*element: A.m:*/
+  m() => T;
+}
+
+/*element: main:*/
+main() {
+  new A<int>().m();
+}
diff --git a/tests/compiler/dart2js/rti/rti_need_test.dart b/tests/compiler/dart2js/rti/rti_need_test.dart
new file mode 100644
index 0000000..4586b74
--- /dev/null
+++ b/tests/compiler/dart2js/rti/rti_need_test.dart
@@ -0,0 +1,287 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/closure.dart';
+import 'package:compiler/src/common.dart';
+import 'package:compiler/src/common_elements.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
+import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/elements/types.dart';
+import 'package:compiler/src/tree/nodes.dart' as ast;
+import 'package:compiler/src/js_backend/runtime_types.dart';
+import 'package:compiler/src/kernel/element_map.dart';
+import 'package:compiler/src/kernel/kernel_backend_strategy.dart';
+import 'package:compiler/src/ssa/builder.dart' as ast;
+import 'package:compiler/src/universe/world_builder.dart';
+import 'package:kernel/ast.dart' as ir;
+import '../equivalence/id_equivalence.dart';
+import '../equivalence/id_equivalence_helper.dart';
+
+main(List<String> args) {
+  asyncTest(() async {
+    Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+    await checkTests(dataDir, computeAstRtiNeed, computeKernelRtiNeed,
+        args: args);
+  });
+}
+
+/// Compute RTI need data for [_member] as a [MemberElement].
+///
+/// Fills [actualMap] with the data.
+void computeAstRtiNeed(
+    Compiler compiler, MemberEntity _member, Map<Id, ActualData> actualMap,
+    {bool verbose: false, bool forBackend}) {
+  MemberElement member = _member;
+  ResolvedAst resolvedAst = member.resolvedAst;
+  compiler.reporter.withCurrentElement(member.implementation, () {
+    new RtiNeedAstComputer(compiler.reporter, actualMap, resolvedAst, compiler)
+        .run();
+  });
+}
+
+abstract class ComputeValueMixin<T> {
+  Compiler get compiler;
+
+  ResolutionWorldBuilder get resolutionWorldBuilder =>
+      compiler.resolutionWorldBuilder;
+  RuntimeTypesNeedBuilderImpl get rtiNeedBuilder =>
+      compiler.frontendStrategy.runtimeTypesNeedBuilderForTesting;
+  RuntimeTypesNeed get rtiNeed => compiler.backendClosedWorldForTesting.rtiNeed;
+
+  MemberEntity getFrontendMember(MemberEntity member);
+  Local getFrontendClosure(MemberEntity member);
+
+  String getMemberValue(MemberEntity backendMember) {
+    MemberEntity frontendMember = getFrontendMember(backendMember);
+    Local frontendClosure = getFrontendClosure(backendMember);
+
+    StringBuffer sb = new StringBuffer();
+    String comma = '';
+
+    void findChecks(String prefix, Entity entity, Set<DartType> checks) {
+      Set<DartType> types = new Set<DartType>();
+      FindTypeVisitor finder = new FindTypeVisitor(entity);
+      for (DartType type in checks) {
+        if (type.accept(finder, null)) {
+          types.add(type);
+        }
+      }
+      List<String> list = types.map((t) => t.toString()).toList()..sort();
+      if (list.isNotEmpty) {
+        sb.write('${comma}$prefix=[${list.join('')}]');
+        comma = ',';
+      }
+    }
+
+    if (backendMember is ConstructorEntity &&
+        backendMember.isGenerativeConstructor) {
+      ClassEntity backendClass = backendMember.enclosingClass;
+      if (rtiNeed.classNeedsRti(backendClass)) {
+        sb.write('${comma}classNeedsRti');
+        comma = ',';
+      }
+      ClassEntity frontendClass = frontendMember?.enclosingClass;
+      Iterable<String> dependencies;
+      if (rtiNeedBuilder.rtiDependencies.containsKey(frontendClass)) {
+        dependencies = rtiNeedBuilder.rtiDependencies[frontendClass]
+            .map((d) => d.name)
+            .toList()
+              ..sort();
+      }
+      if (dependencies != null && dependencies.isNotEmpty) {
+        sb.write('${comma}deps=[${dependencies.join(',')}]');
+        comma = ',';
+      }
+      if (rtiNeedBuilder.classesUsingTypeVariableExpression
+          .contains(frontendClass)) {
+        sb.write('${comma}exp');
+        comma = ',';
+      }
+      if (rtiNeedBuilder.classesUsingTypeVariableTests
+          .contains(frontendClass)) {
+        sb.write('${comma}test');
+        comma = ',';
+      }
+      findChecks('explicit', frontendClass, rtiNeedBuilder.isChecks);
+      findChecks('implicit', frontendClass, rtiNeedBuilder.implicitIsChecks);
+    }
+    if (backendMember is FunctionEntity) {
+      if (rtiNeed.methodNeedsRti(backendMember)) {
+        sb.write('${comma}methodNeedsRti');
+        comma = ',';
+      }
+      if (frontendClosure != null &&
+          rtiNeed.localFunctionNeedsRti(frontendClosure)) {
+        sb.write('${comma}methodNeedsRti');
+        comma = ',';
+      }
+      findChecks('explicit', frontendMember, rtiNeedBuilder.isChecks);
+      findChecks('implicit', frontendMember, rtiNeedBuilder.implicitIsChecks);
+    }
+    return sb.toString();
+  }
+}
+
+/// Visitor that determines whether a type refers to [entity].
+class FindTypeVisitor extends BaseDartTypeVisitor<bool, Null> {
+  final Entity entity;
+
+  FindTypeVisitor(this.entity);
+
+  bool visitTypes(List<DartType> types) {
+    for (DartType type in types) {
+      if (type.accept(this, null)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  bool visitType(DartType type, _) => false;
+
+  @override
+  bool visitInterfaceType(InterfaceType type, _) {
+    if (type.element == entity) return true;
+    return visitTypes(type.typeArguments);
+  }
+
+  @override
+  bool visitFunctionType(FunctionType type, _) {
+    if (type.returnType.accept(this, null)) return true;
+    if (visitTypes(type.typeVariables)) return true;
+    if (visitTypes(type.parameterTypes)) return true;
+    if (visitTypes(type.optionalParameterTypes)) return true;
+    if (visitTypes(type.namedParameterTypes)) return true;
+    return false;
+  }
+
+  @override
+  bool visitTypeVariableType(TypeVariableType type, _) {
+    return type.element.typeDeclaration == entity;
+  }
+}
+
+/// AST visitor for computing inlining data for a member.
+class RtiNeedAstComputer extends AstDataExtractor
+    with ComputeValueMixin<ast.Node> {
+  final Compiler compiler;
+
+  RtiNeedAstComputer(DiagnosticReporter reporter, Map<Id, ActualData> actualMap,
+      ResolvedAst resolvedAst, this.compiler)
+      : super(reporter, actualMap, resolvedAst);
+
+  @override
+  MemberEntity getFrontendMember(MemberEntity member) {
+    return member;
+  }
+
+  @override
+  Local getFrontendClosure(MemberEntity member) {
+    if (member is SynthesizedCallMethodElementX) return member.expression;
+    return null;
+  }
+
+  @override
+  String computeElementValue(Id id, AstElement element) {
+    if (element.isParameter) {
+      return null;
+    } else if (element.isLocal && element.isFunction) {
+      LocalFunctionElement localFunction = element;
+      return getMemberValue(localFunction.callMethod);
+    } else {
+      MemberElement member = element.declaration;
+      return getMemberValue(member);
+    }
+  }
+
+  @override
+  String computeNodeValue(Id id, ast.Node node, [AstElement element]) {
+    if (element != null && element.isLocal && element.isFunction) {
+      return computeElementValue(id, element);
+    }
+    return null;
+  }
+}
+
+/// Compute RTI need data for [member] from the new frontend.
+///
+/// Fills [actualMap] with the data.
+void computeKernelRtiNeed(
+    Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+    {bool verbose: false, bool forBackend}) {
+  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+  MemberDefinition definition = elementMap.getMemberDefinition(member);
+  new RtiNeedIrComputer(
+          compiler.reporter,
+          actualMap,
+          elementMap,
+          member,
+          compiler,
+          backendStrategy.closureDataLookup as ClosureDataLookup<ir.Node>)
+      .run(definition.node);
+}
+
+/// AST visitor for computing inference data for a member.
+class RtiNeedIrComputer extends IrDataExtractor
+    with ComputeValueMixin<ir.Node> {
+  final KernelToElementMapForBuilding _elementMap;
+  final ClosureDataLookup<ir.Node> _closureDataLookup;
+  final Compiler compiler;
+
+  RtiNeedIrComputer(
+      DiagnosticReporter reporter,
+      Map<Id, ActualData> actualMap,
+      this._elementMap,
+      MemberEntity member,
+      this.compiler,
+      this._closureDataLookup)
+      : super(reporter, actualMap);
+
+  @override
+  MemberEntity getFrontendMember(MemberEntity backendMember) {
+    ElementEnvironment elementEnvironment = compiler
+        .resolutionWorldBuilder.closedWorldForTesting.elementEnvironment;
+    LibraryEntity frontendLibrary =
+        elementEnvironment.lookupLibrary(backendMember.library.canonicalUri);
+    if (backendMember.enclosingClass != null) {
+      if (backendMember.enclosingClass.isClosure) return null;
+      ClassEntity frontendClass = elementEnvironment.lookupClass(
+          frontendLibrary, backendMember.enclosingClass.name);
+      if (backendMember is ConstructorEntity) {
+        return elementEnvironment.lookupConstructor(
+            frontendClass, backendMember.name);
+      } else {
+        return elementEnvironment.lookupClassMember(
+            frontendClass, backendMember.name,
+            setter: backendMember.isSetter);
+      }
+    }
+    return elementEnvironment.lookupLibraryMember(
+        frontendLibrary, backendMember.name,
+        setter: backendMember.isSetter);
+  }
+
+  @override
+  Local getFrontendClosure(MemberEntity member) => null;
+
+  @override
+  String computeMemberValue(Id id, ir.Member node) {
+    return getMemberValue(_elementMap.getMember(node));
+  }
+
+  @override
+  String computeNodeValue(Id id, ir.TreeNode node) {
+    if (node is ir.FunctionExpression || node is ir.FunctionDeclaration) {
+      ClosureRepresentationInfo info = _closureDataLookup.getClosureInfo(node);
+      return getMemberValue(info.callMethod);
+    }
+    return null;
+  }
+}
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index d77b085..eeb49d4 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -6,13 +6,20 @@
 recursive_import_test: Skip # Issue 27441
 
 [ $compiler == dart2js ]
+21579_test: Crash # Issue 31762
 class_test: Fail
 constant_javascript_semantics4_test: Fail, OK
+constant_javascript_semantics_test/01: Crash # Issue 31762
+constant_javascript_semantics_test/02: Crash # Issue 31762
+constant_javascript_semantics_test/03: Crash # Issue 31762
+constant_javascript_semantics_test/04: Crash # Issue 31762
+constant_javascript_semantics_test/none: Crash # Issue 31762
 dummy_compiler_test: Slow, Pass
 mirror_printer_test: Pass, Slow # Issue 25940, 16473
 mirrors_used_closure_test: Fail # Issue 17939
 no_such_method_test: Fail # Wrong Invocation.memberName.
 recursive_import_test: Slow, Pass
+round_constant_folding_test: Crash # Issue 31762
 statements_test: Fail
 typed_locals_test: Fail
 
@@ -125,8 +132,15 @@
 js_interop_test: RuntimeError # Issue 31082
 
 [ $compiler == dart2js && $dart2js_with_kernel ]
+21579_test: CompileTimeError # Large integer literal
+constant_javascript_semantics_test/01: Pass # Issue 31762
+constant_javascript_semantics_test/02: Pass # Issue 31762
+constant_javascript_semantics_test/03: CompileTimeError # Large integer literal
+constant_javascript_semantics_test/04: CompileTimeError # Large integer literal
+constant_javascript_semantics_test/none: CompileTimeError # Large integer literal
 dummy_compiler_test: Crash # Issue 31715
 recursive_import_test: Crash # Issue 31715
+round_constant_folding_test: CompileTimeError # Large integer literal
 
 [ $compiler == dart2js && $dart2js_with_kernel && $fast_startup ]
 23056_test: Pass
diff --git a/tests/compiler/dart2js_extra/deferred/shared_constant_a.dart b/tests/compiler/dart2js_extra/deferred/shared_constant_a.dart
new file mode 100644
index 0000000..388f0d3
--- /dev/null
+++ b/tests/compiler/dart2js_extra/deferred/shared_constant_a.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'shared_constant_shared.dart' deferred as d;
+
+doA() async {
+  await d.loadLibrary();
+  return d.constant;
+}
diff --git a/tests/compiler/dart2js_extra/deferred/shared_constant_b.dart b/tests/compiler/dart2js_extra/deferred/shared_constant_b.dart
new file mode 100644
index 0000000..177f50e
--- /dev/null
+++ b/tests/compiler/dart2js_extra/deferred/shared_constant_b.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'shared_constant_shared.dart' deferred as d;
+
+doB() async {
+  await d.loadLibrary();
+  return d.constant;
+}
diff --git a/tests/compiler/dart2js_extra/deferred/shared_constant_c.dart b/tests/compiler/dart2js_extra/deferred/shared_constant_c.dart
new file mode 100644
index 0000000..b64972e
--- /dev/null
+++ b/tests/compiler/dart2js_extra/deferred/shared_constant_c.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class C {
+  const C();
+  method() => print("1");
+}
diff --git a/tests/compiler/dart2js_extra/deferred/shared_constant_shared.dart b/tests/compiler/dart2js_extra/deferred/shared_constant_shared.dart
new file mode 100644
index 0000000..a801718
--- /dev/null
+++ b/tests/compiler/dart2js_extra/deferred/shared_constant_shared.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'shared_constant_c.dart';
+
+const constant = const C(); // using `var` eludes the problem.
diff --git a/tests/compiler/dart2js_extra/deferred/shared_constant_test.dart b/tests/compiler/dart2js_extra/deferred/shared_constant_test.dart
new file mode 100644
index 0000000..3614147
--- /dev/null
+++ b/tests/compiler/dart2js_extra/deferred/shared_constant_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Regression test for issue https://github.com/dart-lang/sdk/issues/31306.
+///
+/// When 1 constant was imported in two libraries by using the same exact
+/// deferred import URI, the deferred-constant initializer was incorrectly moved
+/// to the main output unit.
+
+import 'shared_constant_a.dart';
+import 'shared_constant_b.dart';
+
+main() async {
+  (await doA()).method();
+  await doB();
+}
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index cb88d10..e418d9e 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -12,7 +12,33 @@
 string_test: StaticWarning, OK # Test generates error on purpose.
 
 [ $compiler == dart2js ]
+bit_twiddling_bigint_test: Crash # Issue 31762
+bit_twiddling_test: Crash # Issue 31762
+double_ceil_test: Crash # Issue 31762
+double_floor_test: Crash # Issue 31762
+double_round_test: Crash # Issue 31762
+double_truncate_test: Crash # Issue 31762
+int_ceil_test: Crash # Issue 31762
+int_ceil_to_double_test: Crash # Issue 31762
+int_floor_test: Crash # Issue 31762
+int_floor_to_double_test: Crash # Issue 31762
+int_from_environment_test: Crash # Issue 31762
+int_modulo_arith_test/bignum: Crash # Issue 31762
+int_modulo_arith_test/modPow: Crash # Issue 31762
+int_modulo_arith_test/none: Crash # Issue 31762
+int_parse_radix_test/02: Crash # Issue 31762
+int_round_test: Crash # Issue 31762
+int_round_to_double_test: Crash # Issue 31762
+int_to_int_test: Crash # Issue 31762
+int_truncate_test: Crash # Issue 31762
+int_truncate_to_double_test: Crash # Issue 31762
+integer_to_radix_string_test: Crash # Issue 31762
+integer_to_string_test/01: Crash # Issue 31762
+num_parse_test/01: Crash # Issue 31762
+num_parse_test/none: Crash # Issue 31762
+num_sign_test: Crash # Issue 31762
 regexp/pcre_test: Pass, Slow # Issue 21593
+regress_r21715_test: Crash # Issue 31762
 
 [ $compiler == precompiler ]
 apply3_test: SkipByDesign # Imports dart:mirrors
@@ -378,10 +404,40 @@
 *: Skip
 
 [ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
+big_integer_parsed_arith_vm_test: RuntimeError # Large integers
+big_integer_parsed_div_rem_vm_test: RuntimeError # Large integers
+big_integer_parsed_mul_div_vm_test: RuntimeError # Large integers
 regexp/capture-3: Pass, Slow, Timeout # Issues 21593 and 22008
 regexp/global_test: Skip # Timeout. Issue 21709 and 21708
 regexp/pcre_test: Pass, Slow, Timeout # Issues 21593 and 22008
 
+[ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm || ($compiler == dart2js && $dart2js_with_kernel) ]
+big_integer_arith_vm_test: CompileTimeError # Large integer literal
+bit_twiddling_bigint_test: CompileTimeError # Large integer literal
+bit_twiddling_test: CompileTimeError # Large integer literal
+double_ceil_test: CompileTimeError # Large integer literal
+double_floor_test: CompileTimeError # Large integer literal
+double_round_test: CompileTimeError # Large integer literal
+double_truncate_test: CompileTimeError # Large integer literal
+int_ceil_test: CompileTimeError # Large integer literal
+int_ceil_to_double_test: CompileTimeError # Large integer literal
+int_floor_test: CompileTimeError # Large integer literal
+int_floor_to_double_test: CompileTimeError # Large integer literal
+int_from_environment_test: CompileTimeError # Large integer literal
+int_modulo_arith_test: CompileTimeError # Large integer literal
+int_parse_radix_test/02: CompileTimeError # Large integer literal
+int_round_test: CompileTimeError # Large integer literal
+int_round_to_double_test: CompileTimeError # Large integer literal
+int_to_int_test: CompileTimeError # Large integer literal
+int_truncate_test: CompileTimeError # Large integer literal
+int_truncate_to_double_test: CompileTimeError # Large integer literal
+integer_to_radix_string_test: CompileTimeError # Large integer literal
+integer_to_string_test/01: CompileTimeError # Large integer literal
+num_parse_test/01: CompileTimeError # Large integer literal
+num_parse_test/none: CompileTimeError # Large integer literal
+num_sign_test: CompileTimeError # Large integer literal
+regress_r21715_test: CompileTimeError # Large integer literal
+
 # Firefox takes advantage of the ECMAScript number parsing cop-out clause
 # (presumably added to allow Mozilla's existing behavior)
 # and only looks at the first 20 significant digits.
diff --git a/tests/corelib_2/cast_test.dart b/tests/corelib_2/cast_test.dart
new file mode 100644
index 0000000..b4e805c
--- /dev/null
+++ b/tests/corelib_2/cast_test.dart
@@ -0,0 +1,180 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:collection";
+import "dart:typed_data";
+import "package:expect/expect.dart";
+
+void main() {
+  testIterable();
+  testList();
+}
+
+final elements = <C>[c, d, e, f, null];
+
+void testIterable() {
+  var iterable = new Iterable<C>.generate(elements.length, (n) => elements[n]);
+  // Down-cast
+  {
+    // An iterable that (likely) can do direct access.
+    var dIterable = Iterable.castTo<C, D>(iterable);
+
+    Expect.throws(() => dIterable.first, null, "1.first");
+    Expect.equals(d, dIterable.elementAt(1));
+    Expect.throws(() => dIterable.elementAt(2), null, "1.2"); // E is not D.
+    Expect.equals(f, dIterable.skip(3).first); // Skip does not access element.
+    Expect.equals(null, dIterable.skip(3).elementAt(1));
+
+    Expect.throws(() => dIterable.toList(), null, "1.toList");
+  }
+
+  {
+    // An iterable that cannot do direct access.
+    var dIterable2 = Iterable.castTo<C, D>(iterable.where((_) => true));
+
+    Expect.throws(() => dIterable2.first, null, "2.first");
+    Expect.equals(d, dIterable2.elementAt(1));
+    Expect.throws(() => dIterable2.elementAt(2), null, "2.2"); // E is not D.
+    Expect.equals(f, dIterable2.skip(3).first); // Skip does not access element.
+    Expect.equals(null, dIterable2.skip(3).elementAt(1));
+
+    Expect.throws(() => dIterable2.toList(), null, "2.toList");
+  }
+
+  {
+    // Iterable that definitely won't survive accessing element 2.
+    var iterable3 = new Iterable<C>.generate(
+        elements.length, (n) => n == 3 ? throw "untouchable" : elements[n]);
+    var dIterable3 = Iterable.castTo<C, D>(iterable3);
+
+    Expect.throws(() => dIterable3.first, null, "3.first");
+    Expect.equals(d, dIterable3.elementAt(1));
+    Expect.throws(() => dIterable3.elementAt(3), null, "3.3");
+    // Skip does not access element.
+    Expect.equals(null, dIterable3.skip(4).first);
+    Expect.equals(null, dIterable3.skip(3).elementAt(1));
+
+    Expect.throws(() => dIterable3.toList(), null, "3.toList");
+  }
+
+  // Up-cast.
+  {
+    var oIterable4 = Iterable.castTo<C, Object>(iterable);
+    Expect.listEquals(elements, oIterable4.toList());
+  }
+}
+
+void testList() {
+  // Down-cast.
+  var list = new List<C>.from(elements);
+  var dList = List.castTo<C, D>(list);
+
+  Expect.throws(() => dList.first); // C is not D.
+  Expect.equals(d, dList[1]);
+  Expect.throws(() => dList[2]); // E is not D.
+  Expect.equals(f, dList[3]);
+  Expect.equals(null, dList.last);
+
+  Expect.throws(() => dList.toList());
+
+  dList[2] = d;
+  Expect.equals(d, dList[2]); // Setting works.
+
+  // Up-cast.
+  var list2 = new List<C>.from(elements);
+  var dList2 = List.castTo<C, Object>(list2);
+  Expect.listEquals(elements, dList2);
+  Expect.throws(() => dList2[2] = new Object()); // Cannot set non-C.
+  Expect.listEquals(elements, dList2);
+}
+
+void testSet() {
+  var set = new Set<C>.from(elements); // Linked HashSet.
+  Expect.listEquals(elements, set.toList()); // Preserves order.
+
+  var dSet = Set.castTo<C, D>(set);
+
+  // Preserves order.
+  Expect.throws(() => dSet.first); // C is not D.
+  Expect.equals(d, dSet.elementAt(1));
+  Expect.throws(() => dSet.elementAt(2)); // E is not D.
+
+  Expect.throws(() => dSet.toList());
+
+  // Contains is not typed.
+  var newC = new C();
+  Expect.isFalse(dSet.contains(newC));
+  dSet.add(newC);
+  Expect.isTrue(dSet.contains(newC));
+
+  Expect.equals(5, dSet.length);
+  dSet.remove(newC);
+  Expect.equals(5, dSet.length);
+  dSet.remove(c); // Success, no type checks.
+  Expect.equals(4, dSet.length);
+
+  // Up-cast
+  var set2 = new Set<C>.from(elements);
+  var dSet2 = Set.castTo<C, Object>(set2);
+
+  var newObject = new Object();
+  Expect.throws(() => dSet2.add(newObject));
+  Expect.isFalse(dSet.contains(newObject));
+
+  var toSet2 = dSet2.toSet();
+  Expect.isTrue(toSet2 is LinkedHashSet<Object>);
+  Expect.isTrue(toSet2 is! LinkedHashSet<C>);
+
+  // Custom emptySet.
+
+  var set3 = new Set<C>.from(elements);
+  var dSet3 = Set.castTo<C, Object>(set3, newSet: <T>() => new HashSet<T>());
+
+  var toSet3 = dSet3.toSet();
+  Expect.isTrue(toSet3 is HashSet<Object>);
+  Expect.isTrue(toSet3 is HashSet<C>);
+  Expect.isTrue(toSet3 is! LinkedHashSet<Object>);
+}
+
+void testMap() {
+  var map = new Map.fromIterables(elements, elements);
+
+  var dMap = Map.castTo<C, C, D, D>(map);
+
+  Expect.isTrue(dMap is Map<D, D>);
+
+  Expect.equals(null, dMap[new C()]);
+  Expect.throws(() => dMap[c]);
+  Expect.isTrue(dMap.containsKey(c));
+  Expect.equals(d, dMap[d]);
+  Expect.throws(() => dMap[e]);
+  Expect.equals(null, dMap[null]);
+
+  Expect.equals(5, dMap.length);
+  dMap.remove(c); // Success, no type checks along the way.
+  Expect.equals(4, dMap.length);
+  Expect.equals(null, dMap[c]);
+
+  Expect.throws(() => dMap[c] = d);
+  Expect.throws(() => dMap[d] = c);
+  Expect.equals(4, dMap.length);
+
+  Expect.isTrue(dMap.keys is Iterable<D>);
+  Expect.isTrue(dMap.values is Iterable<D>);
+  Expect.throws(() => dMap.keys.toList());
+  Expect.throws(() => dMap.values.toList());
+}
+
+class C {}
+
+class D extends C {}
+
+class E extends C {}
+
+class F implements D, E {}
+
+final c = new C();
+final d = new D();
+final e = new E();
+final f = new F();
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 1455b3e..cc9dfb9 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -5,10 +5,20 @@
 [ $compiler == dart2analyzer ]
 int_parse_radix_bad_handler_test: MissingCompileTimeError
 iterable_element_at_test/static: Pass
+num_sign_test: Crash, Pass # Issue 31768
 
 [ $compiler == dart2js ]
 date_time11_test: RuntimeError, Pass # Fails when US is on winter time, issue 31285.
+double_ceil_test/int64: Crash # Issue 31762
+double_floor_test/int64: Crash # Issue 31762
+double_round_test/int64: Crash # Issue 31762
+double_truncate_test/int64: Crash # Issue 31762
 hash_set_test/01: RuntimeError # Issue 11551
+int_from_environment_test: Crash # Issue 31762
+int_parse_radix_test/01: Crash # Issue 31762
+int_parse_radix_test/02: Crash # Issue 31762
+int_parse_radix_test/badTypes: Crash # Issue 31762
+int_parse_radix_test/none: Crash # Issue 31762
 integer_to_radix_string_test: RuntimeError # Issue 29921
 string_static_test: MissingCompileTimeError
 
@@ -106,6 +116,9 @@
 [ $runtime == vm ]
 string_case_test/01: RuntimeError
 
+[ !$strong ]
+cast_test: SkipByDesign # Uses generic method parameters.
+
 [ $arch == simarmv5te && ($runtime == dart_precompiled || $runtime == vm) ]
 int_parse_radix_test/*: Pass, Slow
 integer_parsed_mul_div_vm_test: Pass, Slow
@@ -235,6 +248,10 @@
 symbol_test/02: MissingCompileTimeError
 symbol_test/03: MissingCompileTimeError
 
+[ $compiler == dart2js && $dart2js_with_kernel ]
+int_from_environment_test: Pass # Issue 31762
+int_parse_radix_test/none: Pass # Issue 31762
+
 [ $compiler == dart2js && $dart2js_with_kernel && $fast_startup ]
 iterable_return_type_test/01: RuntimeError
 iterable_return_type_test/02: RuntimeError
@@ -314,9 +331,12 @@
 date_time10_test: RuntimeError # Issue 29921
 error_stack_trace_test/nullThrown: RuntimeError # .stackTrace not present for exception caught from 'throw null;'
 hash_set_test/01: RuntimeError # Issue 29921
+int_from_environment_test: RuntimeError # Issue 31763
 int_modulo_arith_test/none: RuntimeError # Issue 29921
 int_parse_radix_test/01: RuntimeError # Issue 29921
 int_parse_radix_test/02: RuntimeError # Issue 29921
+int_parse_radix_test/badTypes: RuntimeError # Issue 31763
+int_parse_radix_test/none: RuntimeError # Issue 31763
 int_parse_with_limited_ints_test: Skip # dartdevc doesn't know about --limit-ints-to-64-bits
 integer_arith_vm_test/modPow: RuntimeError # Issue 30170
 integer_parsed_arith_vm_test: RuntimeError # Issue 29921
diff --git a/tests/isolate/count_test.dart b/tests/isolate/count_test.dart
index e4f88e9..d2a203c 100644
--- a/tests/isolate/count_test.dart
+++ b/tests/isolate/count_test.dart
@@ -12,7 +12,7 @@
   int count = 0;
   var port = new ReceivePort();
   replyTo.send(["init", port.sendPort]);
-  port.listen((int message) {
+  port.listen((message) {
     if (message == -1) {
       expect(count, 10);
       replyTo.send(["done"]);
diff --git a/tests/isolate/function_send1_test.dart b/tests/isolate/function_send1_test.dart
index b1a9aea..d766656 100644
--- a/tests/isolate/function_send1_test.dart
+++ b/tests/isolate/function_send1_test.dart
@@ -97,7 +97,7 @@
 // Creates a new isolate and a pair of ports that expect a single message
 // to be sent to the other isolate and back to the callback function.
 Future<SendPort> echoPort(callback(value)) {
-  Completer completer = new Completer<SendPort>();
+  Completer<SendPort> completer = new Completer<SendPort>();
   SendPort replyPort = singleMessagePort(callback);
   RawReceivePort initPort;
   initPort = new RawReceivePort((p) {
@@ -121,7 +121,7 @@
 // Creates other isolate that waits for a single message, `msg`, on the returned
 // port, and executes it as `msg[0](msg[1],msg[2])` in the other isolate.
 Future<SendPort> callPort() {
-  Completer completer = new Completer<SendPort>();
+  Completer<SendPort> completer = new Completer<SendPort>();
   SendPort initPort = singleMessagePort(completer.complete);
   return Isolate.spawn(_call, initPort).then((_) => completer.future);
 }
diff --git a/tests/isolate/function_send_test.dart b/tests/isolate/function_send_test.dart
index 8e08da0..4fbe3a4 100644
--- a/tests/isolate/function_send_test.dart
+++ b/tests/isolate/function_send_test.dart
@@ -138,7 +138,7 @@
 // Creates a new isolate and a pair of ports that expect a single message
 // to be sent to the other isolate and back to the callback function.
 Future<SendPort> echoPort(callback(value)) {
-  Completer completer = new Completer<SendPort>();
+  Completer<SendPort> completer = new Completer<SendPort>();
   SendPort replyPort = singleMessagePort(callback);
   RawReceivePort initPort;
   initPort = new RawReceivePort((p) {
@@ -162,7 +162,7 @@
 // Creates other isolate that waits for a single message, `msg`, on the returned
 // port, and executes it as `msg[0](msg[1],msg[2])` in the other isolate.
 Future<SendPort> callPort() {
-  Completer completer = new Completer<SendPort>();
+  Completer<SendPort> completer = new Completer<SendPort>();
   SendPort initPort = singleMessagePort(completer.complete);
   return Isolate.spawn(_call, initPort).then((_) => completer.future);
 }
diff --git a/tests/isolate/handle_error2_test.dart b/tests/isolate/handle_error2_test.dart
index 508690b..5a9b908 100644
--- a/tests/isolate/handle_error2_test.dart
+++ b/tests/isolate/handle_error2_test.dart
@@ -33,7 +33,7 @@
 /// Returns a list of `[isolate, commandPort]` in a future.
 Future spawn(entry) {
   ReceivePort reply = new ReceivePort();
-  Future isolate = Isolate.spawn(entry, reply.sendPort, paused: true);
+  Future<Isolate> isolate = Isolate.spawn(entry, reply.sendPort, paused: true);
   return isolate.then((Isolate isolate) {
     isolate.setErrorsFatal(false);
     isolate.resume(isolate.pauseCapability);
diff --git a/tests/isolate/handle_error3_test.dart b/tests/isolate/handle_error3_test.dart
index eeac985..580f19c 100644
--- a/tests/isolate/handle_error3_test.dart
+++ b/tests/isolate/handle_error3_test.dart
@@ -33,7 +33,7 @@
 /// Returns a list of `[isolate, commandPort]` in a future.
 Future spawn(entry) {
   ReceivePort reply = new ReceivePort();
-  Future isolate = Isolate.spawn(entry, reply.sendPort, paused: true);
+  Future<Isolate> isolate = Isolate.spawn(entry, reply.sendPort, paused: true);
   return isolate.then((Isolate isolate) {
     isolate.setErrorsFatal(false);
     isolate.resume(isolate.pauseCapability);
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 2c49cf8..99e1c9f 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -4,7 +4,6 @@
 
 [ $compiler == dart2analyzer ]
 browser/typed_data_message_test: StaticWarning
-mint_maker_test: StaticWarning
 
 [ $compiler == dart2js ]
 browser/issue_12474_test: CompileTimeError # Issue 22529
@@ -105,53 +104,24 @@
 isolate_stress_test: Pass, Slow # Issue 10697
 
 [ $compiler == dartk && $strong ]
-checked_test: RuntimeError
-count_test: CompileTimeError
-cross_isolate_message_test: CompileTimeError
-error_at_spawnuri_test: RuntimeError
-error_exit_at_spawnuri_test: RuntimeError
-exit_at_spawnuri_test: RuntimeError
-function_send1_test: CompileTimeError
-function_send_test: CompileTimeError
-handle_error2_test: CompileTimeError
-handle_error3_test: CompileTimeError
-illegal_msg_function_test: CompileTimeError
-illegal_msg_mirror_test: CompileTimeError
-isolate_complex_messages_test: CompileTimeError
-isolate_current_test: CompileTimeError
+isolate_complex_messages_test: Crash
 issue_21398_parent_isolate1_test: RuntimeError
-issue_21398_parent_isolate_test: RuntimeError
 issue_22778_test: Crash
-issue_24243_parent_isolate_test: RuntimeError
-kill_self_synchronously_test: RuntimeError
-kill_test: CompileTimeError
-mandel_isolate_test: CompileTimeError
-message2_test: CompileTimeError
-message3_test/byteBuffer: CompileTimeError
-message3_test/constInstance: CompileTimeError
-message3_test/constList: CompileTimeError
-message3_test/constList_identical: CompileTimeError
-message3_test/constMap: CompileTimeError
-message3_test/fun: CompileTimeError
-message3_test/int32x4: CompileTimeError
-message3_test/none: CompileTimeError
+message3_test/byteBuffer: RuntimeError
+message3_test/constInstance: RuntimeError
+message3_test/constList: RuntimeError
+message3_test/constList_identical: RuntimeError
+message3_test/constMap: RuntimeError
+message3_test/fun: RuntimeError
+message3_test/int32x4: RuntimeError
+message3_test/none: RuntimeError
 message_test: CompileTimeError
 mint_maker_test: CompileTimeError
-nested_spawn2_test: CompileTimeError
-nested_spawn_test: CompileTimeError
-raw_port_test: CompileTimeError
-request_reply_test: CompileTimeError
 spawn_function_custom_class_test: CompileTimeError
-spawn_function_test: CompileTimeError
-spawn_uri_exported_main_test: RuntimeError
-spawn_uri_multi_test/none: CompileTimeError
 spawn_uri_nested_vm_test: CompileTimeError
-spawn_uri_test: CompileTimeError
-spawn_uri_vm_test: CompileTimeError
 static_function_test: CompileTimeError
-timer_isolate_test: CompileTimeError
 typed_message_test: CompileTimeError
-unresolved_ports_test: CompileTimeError
+unresolved_ports_test: Pass, Timeout
 
 # Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
diff --git a/tests/isolate/isolate_current_test.dart b/tests/isolate/isolate_current_test.dart
index e2e2d99..a277897 100644
--- a/tests/isolate/isolate_current_test.dart
+++ b/tests/isolate/isolate_current_test.dart
@@ -51,7 +51,7 @@
 void testSpawnReturnVsCurrent(bool asList) {
   asyncStart();
   Function transform = asList ? l2i : id;
-  Completer response = new Completer();
+  Completer<Isolate> response = new Completer<Isolate>();
   var p = new RawReceivePort();
   p.handler = (v) {
     response.complete(transform(v));
@@ -81,7 +81,7 @@
   asyncStart();
   Function transform = asList ? i2l : id;
 
-  Completer response = new Completer();
+  Completer<SendPort> response = new Completer<SendPort>();
   var p = new RawReceivePort();
   int state = 0;
   p.handler = (v) {
diff --git a/tests/isolate/kill_self_synchronously_test.dart b/tests/isolate/kill_self_synchronously_test.dart
index 9b91d4b..cf60fa4 100644
--- a/tests/isolate/kill_self_synchronously_test.dart
+++ b/tests/isolate/kill_self_synchronously_test.dart
@@ -13,7 +13,7 @@
     throw "QQQ Should not be reached";
   } else {
     var exec = Platform.resolvedExecutable;
-    var args = new List();
+    var args = new List<String>();
     args.addAll(Platform.executableArguments);
     args.add(Platform.script.toFilePath());
     args.add("--child");
diff --git a/tests/isolate/kill_test.dart b/tests/isolate/kill_test.dart
index 01ebf71..44d55ad 100644
--- a/tests/isolate/kill_test.dart
+++ b/tests/isolate/kill_test.dart
@@ -18,7 +18,8 @@
 
 void main() {
   asyncStart();
-  var completer = new Completer(); // Completed by first reply from isolate.
+  // Completed by first reply from isolate.
+  var completer = new Completer<SendPort>();
   RawReceivePort reply = new RawReceivePort(completer.complete);
   Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
     completer.future.then((SendPort echoPort) {
diff --git a/tests/isolate/mandel_isolate_test.dart b/tests/isolate/mandel_isolate_test.dart
index 16db3c0..ee21f1e 100644
--- a/tests/isolate/mandel_isolate_test.dart
+++ b/tests/isolate/mandel_isolate_test.dart
@@ -107,8 +107,8 @@
   void processLine(int y) {
     ReceivePort reply = new ReceivePort();
     _port.send([y, reply.sendPort]);
-    reply.first.then((List<int> message) {
-      _state.notifyProcessedLine(this, y, message);
+    reply.first.then((message) {
+      _state.notifyProcessedLine(this, y, message as List<int>);
     });
   }
 
diff --git a/tests/isolate/message3_test.dart b/tests/isolate/message3_test.dart
index 74028c8..7d10afc 100644
--- a/tests/isolate/message3_test.dart
+++ b/tests/isolate/message3_test.dart
@@ -42,7 +42,7 @@
 }
 
 class C extends B {
-  var field = 33;
+  dynamic field = 33;
 
   get superField => super.field;
   get superField2 => super.field2;
@@ -459,7 +459,8 @@
   Isolate
       .spawn(echoMain, [initialReplyPort.sendPort, testPort.sendPort])
       .then((_) => initialReplyPort.first)
-      .then((SendPort ping) {
+      .then((arg) {
+        SendPort ping = arg as SendPort;
         runTests(ping, checks);
         Expect.isTrue(checks.length > 0);
         completer.future.then((_) => ping.send("halt")).then((_) => asyncEnd());
diff --git a/tests/isolate/mint_maker_test.dart b/tests/isolate/mint_maker_test.dart
index d9346d0..f906beb 100644
--- a/tests/isolate/mint_maker_test.dart
+++ b/tests/isolate/mint_maker_test.dart
@@ -44,8 +44,8 @@
 
   void createPurse(int balance, handlePurse(PurseWrapper purse)) {
     ReceivePort reply = new ReceivePort();
-    reply.first.then((SendPort purse) {
-      handlePurse(new PurseWrapper(purse));
+    reply.first.then((purse) {
+      handlePurse(new PurseWrapper(purse as SendPort));
     });
     _mint.send([balance, reply.sendPort]);
   }
@@ -77,7 +77,7 @@
         replyTo.send(result.port);
       } else {
         // TODO: Send an exception back.
-        throw UnsupportedError("Unsupported commend: $command");
+        throw new UnsupportedError("Unsupported commend: $command");
       }
     });
   }
@@ -114,8 +114,8 @@
   }
 
   void sproutPurse(handleSprouted(PurseWrapper sprouted)) {
-    _sendReceive("sprout", (SendPort sprouted) {
-      handleSprouted(new PurseWrapper(sprouted));
+    _sendReceive("sprout", (sprouted) {
+      handleSprouted(new PurseWrapper(sprouted as SendPort));
     });
   }
 
@@ -127,9 +127,9 @@
 mintMakerWrapper(SendPort replyPort) {
   ReceivePort receiver = new ReceivePort();
   replyPort.send(receiver.sendPort);
-  receiver.listen((SendPort replyTo) {
+  receiver.listen((replyTo) {
     Mint mint = new Mint();
-    replyTo.send(mint.port);
+    (replyTo as SendPort).send(mint.port);
   });
 }
 
@@ -147,8 +147,8 @@
 
   void makeMint(handleMint(MintWrapper mint)) {
     ReceivePort reply = new ReceivePort();
-    reply.first.then((SendPort mint) {
-      handleMint(new MintWrapper(mint));
+    reply.first.then((mint) {
+      handleMint(new MintWrapper(mint as SendPort));
     });
     _port.send(reply.sendPort);
   }
diff --git a/tests/kernel/kernel.status b/tests/kernel/kernel.status
index 3f36f5d..095c6fa 100644
--- a/tests/kernel/kernel.status
+++ b/tests/kernel/kernel.status
@@ -7,6 +7,7 @@
 unsorted/invocation_errors_test: Pass
 unsorted/loop_test: Skip
 unsorted/nsm_dispatcher_test: Skip # The test uses Symbol without MirrorsUsed
+unsorted/simple_literal_test: Crash # Issue 31762
 unsorted/super_initializer_test: Skip
 unsorted/super_mixin_test: CompileTimeError
 
@@ -24,3 +25,8 @@
 
 [ $runtime == dart_precompiled && $minified ]
 unsorted/symbol_literal_test: Skip # Expects unobfuscated Symbol.toString.
+
+[ $runtime == dart_precompiled || $runtime == vm || ($compiler == dart2js && $dart2js_with_kernel) ]
+unsorted/loop_test: CompileTimeError # Large integer literal
+unsorted/simple_literal_test: CompileTimeError # Large integer literal
+
diff --git a/tests/language/language.status b/tests/language/language.status
index fcc41e1..dfa920b 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -459,7 +459,19 @@
 vm/causal_async_exception_stack_test: SkipByDesign # Causal async stacks are not supported in product mode
 
 [ $runtime == dart_precompiled || $runtime == vm ]
+arithmetic_test: CompileTimeError # Large integer literal
+bit_operations_test: CompileTimeError # Large integer literal
+deopt_inlined_function_lazy_test: CompileTimeError # Large integer literal
+guess_cid_test: CompileTimeError # Large integer literal
+identical_closure2_test: CompileTimeError # Large integer literal
+int2_test: CompileTimeError # Large integer literal
+mint_compares_test: CompileTimeError # Large integer literal
+number_identity_test: CompileTimeError # Large integer literal
+regress_24283_test: RuntimeError # Large integers
 vm/load_to_load_unaligned_forwarding_vm_test: Pass, Crash # Unaligned offset. Issue 22151
+vm/regress_14903_test: CompileTimeError # Large integer literal
+vm/regress_23117_vm_test: RuntimeError # Large integers
+vm/regress_23238_test: RuntimeError # Large integers
 vm/unaligned_float_access_literal_index_test: Pass, Crash # Unaligned offset. Issue 22151
 
 [ $hot_reload || $hot_reload_rollback ]
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index b6b3e96..a2d26dd 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -7,8 +7,21 @@
 
 # VM specific tests that should not be run by dart2js.
 [ $compiler == dart2js ]
+arithmetic_test: Crash # Issue 31762
 assertion_initializer_test: Crash
+bit_operations_test/01: Crash # Issue 31762
+bit_operations_test/02: Crash # Issue 31762
+bit_operations_test/03: Crash # Issue 31762
+bit_operations_test/04: Crash # Issue 31762
+bit_operations_test/none: Crash # Issue 31762
+deopt_inlined_function_lazy_test: Crash # Issue 31762
+deopt_smi_op_test: RuntimeError # Issue 31762
 generalized_void_syntax_test: CompileTimeError
+guess_cid_test: Crash # Issue 31762
+identical_closure2_test: Crash # Issue 31762
+int2_test: Crash # Issue 31762
+mint_compares_test: Crash # Issue 31762
+number_identity_test: Crash # Issue 31762
 vm/*: Skip # Issue 12699
 
 [ $arch == ia32 && $compiler == dart2js && $runtime == d8 ]
@@ -486,6 +499,17 @@
 [ $compiler == dart2js && !$checked && $enable_asserts ]
 bool_check_test: RuntimeError # Issue 29647
 
+[ $compiler == dart2js && $dart2js_with_kernel ]
+arithmetic_test: CompileTimeError # Large integer literal
+bit_operations_test: CompileTimeError # Large integer literal
+deopt_inlined_function_lazy_test: CompileTimeError # Large integer literal
+guess_cid_test: CompileTimeError # Large integer literal
+identical_closure2_test: CompileTimeError # Large integer literal
+int2_test: CompileTimeError # Large integer literal
+mint_compares_test: CompileTimeError # Large integer literal
+number_identity_test: CompileTimeError # Large integer literal
+vm/regress_14903_test: CompileTimeError # Large integer literal
+
 [ $compiler == dart2js && $dart2js_with_kernel && $fast_startup ]
 arithmetic_canonicalization_test: RuntimeError
 assertion_initializer_const_error2_test/none: CompileTimeError
diff --git a/tests/language_2/hello_dart_test.dart b/tests/language_2/hello_dart_test.dart
index be260af..0af0005 100644
--- a/tests/language_2/hello_dart_test.dart
+++ b/tests/language_2/hello_dart_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Simple test program invoked with an option to eagerly
 // compile all code that is loaded in the isolate.
-// VMOptions=--compile_all --error-on-bad-type --error-on-bad-override
+// VMOptions=--compile_all --error-on-bad-type
 
 class HelloDartTest {
   static testMain() {
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index e93ae0d..1c6d1db 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -9,8 +9,6 @@
 abstract_override_adds_optional_args_supercall_test: MissingCompileTimeError # Issue #30568
 assertion_initializer_const_function_test/01: MissingCompileTimeError
 async_return_types_test/nestedFuture: MissingCompileTimeError
-await_test: Crash # Issue 31540
-bad_initializer1_negative_test: CompileTimeError # Issue 14529
 bad_initializer2_negative_test: Fail # Issue 14880
 black_listed_test/none: Fail # Issue 14228
 built_in_identifier_prefix_test: CompileTimeError
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index ec5c30a..3268b3d 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -20,6 +20,7 @@
 argument_assignability_function_typed_test/03: RuntimeError
 argument_assignability_function_typed_test/04: RuntimeError
 argument_assignability_function_typed_test/05: RuntimeError
+arithmetic_test: Crash # Issue 31762
 assign_static_type_test/01: MissingCompileTimeError
 assign_static_type_test/02: MissingCompileTimeError
 assign_static_type_test/03: MissingCompileTimeError
@@ -133,6 +134,7 @@
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
 deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
+deopt_smi_op_test: RuntimeError # Issue 31762
 dynamic_field_test/01: MissingCompileTimeError
 dynamic_field_test/02: MissingCompileTimeError
 dynamic_prefix_core_test/01: MissingCompileTimeError
@@ -254,6 +256,7 @@
 getter_no_setter_test/03: MissingCompileTimeError
 getter_override_test/03: MissingCompileTimeError
 getters_setters2_test/02: MissingCompileTimeError
+guess_cid_test: RuntimeError # Issue 31762
 identical_const_test/01: MissingCompileTimeError
 identical_const_test/02: MissingCompileTimeError
 identical_const_test/03: MissingCompileTimeError
@@ -415,6 +418,7 @@
 method_override7_test/03: MissingCompileTimeError
 method_override8_test/03: MissingCompileTimeError
 method_override_test: RuntimeError
+mint_compares_test: Crash # Issue 31762
 mixin_illegal_constructor_test/13: MissingCompileTimeError
 mixin_illegal_constructor_test/14: MissingCompileTimeError
 mixin_illegal_constructor_test/15: MissingCompileTimeError
@@ -1582,6 +1586,7 @@
 function_subtype_inline2_test: RuntimeError
 
 [ $compiler == dart2js && $dart2js_with_kernel ]
+arithmetic_test: Pass # Issue 31762
 bug31436_test: RuntimeError
 built_in_identifier_type_annotation_test/22: Crash # Issue 28815
 built_in_identifier_type_annotation_test/52: MissingCompileTimeError # Issue 28815
@@ -1629,6 +1634,7 @@
 invalid_cast_test/10: MissingCompileTimeError
 invalid_cast_test/11: MissingCompileTimeError
 library_env_test/has_no_mirror_support: Pass
+mint_compares_test: Pass # Issue 31762
 object_has_no_call_method_test/02: MissingCompileTimeError
 object_has_no_call_method_test/05: MissingCompileTimeError
 object_has_no_call_method_test/08: MissingCompileTimeError
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index 8845ee6..db124f7 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -11,13 +11,13 @@
 accessor_conflict_import_prefixed_test: CompileTimeError # Issue 25626
 accessor_conflict_import_test: CompileTimeError # Issue 25626
 additional_interface_adds_optional_args_test: CompileTimeError # Issue #30568
+arithmetic_test: RuntimeError # Issue 31763
 assertion_initializer_const_error2_test/*: Crash # Issue #27809
 assertion_initializer_const_error2_test/cc10: Pass # Issue #31319
 assertion_initializer_const_error2_test/cc11: Pass # Issue #31319
 assertion_initializer_const_error2_test/none: Pass
 assertion_initializer_const_function_test/01: Crash
 assertion_initializer_test: CompileTimeError
-await_test: Crash # Issue 31540
 black_listed_test/none: Fail # Issue 14228
 bug31436_test: CompileTimeError
 built_in_identifier_prefix_test: CompileTimeError
@@ -65,6 +65,7 @@
 interface_test/00: MissingCompileTimeError
 internal_library_test/01: MissingCompileTimeError # Issue 29920
 method_override_test: CompileTimeError # Negative test
+mint_compares_test: RuntimeError # Issue 31763
 mixin_super_2_test/01: MissingCompileTimeError
 mixin_super_2_test/03: MissingCompileTimeError
 mixin_supertype_subclass_test/02: MissingCompileTimeError
@@ -130,6 +131,7 @@
 additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
 additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
 additional_interface_adds_optional_args_supercall_test: MissingCompileTimeError
+arithmetic_test: RuntimeError # Issue 31763
 assert_message_test: CompileTimeError
 assertion_initializer_const_error2_test/cc01: MissingCompileTimeError
 assertion_initializer_const_error2_test/cc02: MissingCompileTimeError
@@ -253,7 +255,8 @@
 cyclic_type_variable_test/02: MissingCompileTimeError
 cyclic_type_variable_test/03: MissingCompileTimeError
 cyclic_type_variable_test/04: MissingCompileTimeError
-cyclic_typedef_test/13: MissingCompileTimeError
+cyclic_typedef_test/10: Crash
+cyclic_typedef_test/11: Crash
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
 deferred_constraints_constants_test/default_argument2: MissingCompileTimeError
@@ -305,7 +308,6 @@
 final_attempt_reinitialization_test/02: Crash
 final_syntax_test/09: Crash
 function_propagation_test: CompileTimeError
-function_subtype_bound_closure7_test: Crash
 function_type/function_type10_test: CompileTimeError
 function_type/function_type11_test: CompileTimeError
 function_type/function_type14_test: CompileTimeError
@@ -376,12 +378,9 @@
 function_type_parameter_negative_test: Fail
 generalized_void_syntax_test: CompileTimeError
 generic_function_bounds_test: CompileTimeError
-generic_function_dcall_test: Crash
 generic_methods_bounds_test/01: MissingCompileTimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
-generic_methods_tearoff_specialization_test: Crash
-generic_methods_unused_parameter_test: Crash
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Warning: Superclass has no method named 'foo'.
 generic_no_such_method_dispatcher_test: CompileTimeError # Issue 31533
 getter_override2_test/02: MissingCompileTimeError
@@ -398,9 +397,7 @@
 initializing_formal_type_annotation_test/01: MissingCompileTimeError
 initializing_formal_type_annotation_test/02: MissingCompileTimeError
 instance_call_wrong_argument_count_negative_test: Fail
-instantiate_tearoff_after_contravariance_check_test: Crash
-instantiate_tearoff_of_call_test: Crash
-instantiate_tearoff_test: Crash
+instantiate_tearoff_of_call_test: CompileTimeError
 invocation_mirror_test: CompileTimeError # Issue 31402 Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Invocation'.
 issue13179_test: CompileTimeError # Issue 31537
 issue18628_2_test/01: MissingCompileTimeError
@@ -433,6 +430,8 @@
 method_override8_test/00: MissingCompileTimeError
 method_override8_test/01: MissingCompileTimeError
 method_override8_test/03: MissingCompileTimeError
+method_override_test: CompileTimeError # Issue 31616
+mint_compares_test: RuntimeError # Issue 31763
 mixin_black_listed_test/02: MissingCompileTimeError
 mixin_forwarding_constructor4_test/01: MissingCompileTimeError
 mixin_forwarding_constructor4_test/02: MissingCompileTimeError
@@ -586,19 +585,11 @@
 override_inheritance_field_test/48: MissingCompileTimeError
 override_inheritance_field_test/53: MissingCompileTimeError
 override_inheritance_field_test/54: MissingCompileTimeError
-override_inheritance_generic_test/04: MissingCompileTimeError
-override_inheritance_generic_test/06: MissingCompileTimeError
-override_inheritance_generic_test/07: MissingCompileTimeError
-override_inheritance_generic_test/08: MissingCompileTimeError
-override_inheritance_generic_test/09: MissingCompileTimeError
-override_inheritance_generic_test/10: MissingCompileTimeError
+override_inheritance_generic_test/02: CompileTimeError # Issue 31616
 override_inheritance_method_test/17: CompileTimeError
 override_inheritance_method_test/18: CompileTimeError
-override_inheritance_method_test/27: MissingCompileTimeError
-override_inheritance_method_test/30: MissingCompileTimeError
-override_inheritance_method_test/31: MissingCompileTimeError
-override_inheritance_method_test/32: MissingCompileTimeError
-override_inheritance_method_test/33: MissingCompileTimeError
+override_inheritance_method_test/28: CompileTimeError # Issue 31616
+override_inheritance_method_test/29: CompileTimeError # Issue 31616
 override_inheritance_mixed_test/01: MissingCompileTimeError
 override_inheritance_mixed_test/02: MissingCompileTimeError
 override_inheritance_mixed_test/03: MissingCompileTimeError
@@ -621,7 +612,7 @@
 redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
 redirecting_factory_malbounded_test/01: MissingCompileTimeError
 regress_22976_test/01: CompileTimeError
-regress_23089_test: MissingCompileTimeError
+regress_23089_test: Crash
 regress_23408_test: CompileTimeError # Issue 31533
 regress_25550_test: CompileTimeError
 regress_29025_test: CompileTimeError
@@ -636,6 +627,8 @@
 setter_override_test/02: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
 string_interpolate_test: CompileTimeError # Issue 31533
+string_split_test: CompileTimeError # Issue 31616
+string_supertype_checked_test: CompileTimeError # Issue 31616
 super_bound_closure_test/none: CompileTimeError # Issue 31533
 super_call4_test: CompileTimeError
 super_from_constructor_test: Crash
@@ -712,6 +705,7 @@
 first_class_types_test: RuntimeError, OK # Strong mode reifies inferred type argument.
 forwarding_stub_tearoff_generic_test: RuntimeError
 fuzzy_arrows_test/03: RuntimeError # Issue 29630
+generic_methods_overriding_test/03: MissingCompileTimeError # Issue 29920
 getter_closure_execution_order_test: RuntimeError # Issue 29920
 implicit_downcast_during_compound_assignment_test: RuntimeError
 implicit_downcast_during_indexed_compound_assignment_test: RuntimeError
@@ -787,9 +781,13 @@
 function_type_alias_test: RuntimeError # Expect.isTrue(false) fails.
 generic_closure_test/01: RuntimeError # ReferenceError: TToT is not defined
 generic_closure_test/none: RuntimeError # ReferenceError: TToT is not defined
+generic_function_dcall_test: RuntimeError
 generic_list_checked_test: RuntimeError # Expect.throws fails: Did not throw
+generic_methods_tearoff_specialization_test: RuntimeError
 generic_methods_unused_parameter_test: RuntimeError # Expect.isTrue(false) fails.
 generic_test: RuntimeError # ReferenceError: BOfT is not defined
+instantiate_tearoff_after_contravariance_check_test: RuntimeError
+instantiate_tearoff_test: RuntimeError
 library_env_test/has_io_support: RuntimeError # Unsupported operation: bool.fromEnvironment can only be used as a const constructor
 library_env_test/has_mirror_support: RuntimeError # Unsupported operation: bool.fromEnvironment can only be used as a const constructor
 library_env_test/has_no_html_support: RuntimeError # Unsupported operation: bool.fromEnvironment can only be used as a const constructor
@@ -947,7 +945,6 @@
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError # Issue 29920
 generic_list_checked_test: CompileTimeError
 generic_methods_overriding_test/01: MissingCompileTimeError # Issue 29920
-generic_methods_overriding_test/03: MissingCompileTimeError # Issue 29920
 generic_tearoff_test: CompileTimeError
 int64_literal_test/*: Skip # This is testing Dart 2.0 int64 semantics.
 internal_library_test/02: Crash
diff --git a/tests/language_2/language_2_flutter.status b/tests/language_2/language_2_flutter.status
index 70037b4..2953d2c 100644
--- a/tests/language_2/language_2_flutter.status
+++ b/tests/language_2/language_2_flutter.status
@@ -4,8 +4,9 @@
 # Sections in this file should contain "$runtime == flutter".
 # What tests does this comment apply to?  Please add it to each test's line
 # or file an issue an put it there, and add the issue to the relevant tests:
-# flutter uses --error_on_bad_type, --error_on_bad_override
-# and --await_is_keyword so the following tests fail with a Compilation Error
+# flutter uses --error_on_bad_type and --await_is_keyword so the following tests
+# fail with a Compilation Error.
+# Note that --error_on_bad_override is ignored in strong mode.
 
 [ $runtime == flutter ]
 async_await_syntax_test/a05c: CompileTimeError
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index f6b4071..ab95ff9 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -366,7 +366,8 @@
 cyclic_type_variable_test/02: MissingCompileTimeError
 cyclic_type_variable_test/03: MissingCompileTimeError
 cyclic_type_variable_test/04: MissingCompileTimeError
-cyclic_typedef_test/13: MissingCompileTimeError
+cyclic_typedef_test/10: Crash
+cyclic_typedef_test/11: Crash
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
 deferred_call_empty_before_load_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
@@ -647,7 +648,6 @@
 generic_list_checked_test: CompileTimeError # Issue 31402 (Variable declaration)
 generic_methods_bounds_test/01: MissingCompileTimeError
 generic_methods_overriding_test/01: MissingCompileTimeError
-generic_methods_overriding_test/03: MissingCompileTimeError
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
 generic_methods_tearoff_specialization_test: CompileTimeError # Issue 31402 (Variable declaration)
 generic_methods_tearoff_specialization_test: RuntimeError
@@ -683,8 +683,6 @@
 instantiate_tearoff_after_contravariance_check_test: CompileTimeError
 instantiate_tearoff_of_call_test: CompileTimeError
 instantiate_tearoff_test: CompileTimeError
-int64_literal_test/03: MissingCompileTimeError # http://dartbug.com/31479
-int64_literal_test/30: MissingCompileTimeError # http://dartbug.com/31479
 interface_test/00: MissingCompileTimeError
 invocation_mirror_test: CompileTimeError # Issue 31402 (Invocation arguments)
 is_malformed_type_test/95: MissingCompileTimeError
@@ -817,6 +815,7 @@
 method_override6_test/03: MissingCompileTimeError
 method_override7_test/03: MissingCompileTimeError
 method_override8_test/03: MissingCompileTimeError
+method_override_test: CompileTimeError # Issue 31616
 mixin_illegal_constructor_test/13: MissingCompileTimeError
 mixin_illegal_constructor_test/14: MissingCompileTimeError
 mixin_illegal_constructor_test/15: MissingCompileTimeError
@@ -955,12 +954,7 @@
 override_inheritance_field_test/48: MissingCompileTimeError
 override_inheritance_field_test/53: MissingCompileTimeError
 override_inheritance_field_test/54: MissingCompileTimeError
-override_inheritance_generic_test/04: MissingCompileTimeError
-override_inheritance_generic_test/06: MissingCompileTimeError
-override_inheritance_generic_test/07: MissingCompileTimeError
-override_inheritance_generic_test/08: MissingCompileTimeError
-override_inheritance_generic_test/09: MissingCompileTimeError
-override_inheritance_generic_test/10: MissingCompileTimeError
+override_inheritance_generic_test/02: CompileTimeError # Issue 31616
 override_inheritance_method_test/04: MissingCompileTimeError
 override_inheritance_method_test/05: MissingCompileTimeError
 override_inheritance_method_test/06: MissingCompileTimeError
@@ -971,11 +965,8 @@
 override_inheritance_method_test/19: MissingCompileTimeError
 override_inheritance_method_test/20: MissingCompileTimeError
 override_inheritance_method_test/21: MissingCompileTimeError
-override_inheritance_method_test/27: MissingCompileTimeError
-override_inheritance_method_test/30: MissingCompileTimeError
-override_inheritance_method_test/31: MissingCompileTimeError
-override_inheritance_method_test/32: MissingCompileTimeError
-override_inheritance_method_test/33: MissingCompileTimeError
+override_inheritance_method_test/28: CompileTimeError # Issue 31616
+override_inheritance_method_test/29: CompileTimeError # Issue 31616
 override_inheritance_mixed_test/06: MissingCompileTimeError
 override_inheritance_mixed_test/07: MissingCompileTimeError
 override_inheritance_mixed_test/09: MissingCompileTimeError
@@ -1016,7 +1007,7 @@
 regress_22443_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
 regress_22936_test: MissingCompileTimeError
 regress_22976_test/01: CompileTimeError # Issue 31402 (Variable declaration)
-regress_23089_test: MissingCompileTimeError
+regress_23089_test: Crash
 regress_23408_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
 regress_23408_test: RuntimeError
 regress_25550_test: CompileTimeError # Issue 31402 (Variable declaration)
@@ -1043,6 +1034,8 @@
 static_setter_get_test/01: MissingCompileTimeError
 string_interpolate_test: CompileTimeError # Issue 31533
 string_interpolation_and_buffer_test: RuntimeError # Issue 31402 (Return and yield statements)
+string_split_test: CompileTimeError # Issue 31616
+string_supertype_checked_test: CompileTimeError # Issue 31616
 super_bound_closure_test/none: CompileTimeError # Issue 31533
 super_call4_test/01: MissingCompileTimeError
 super_call4_test/02: MissingCompileTimeError
@@ -1194,8 +1187,6 @@
 duplicate_implements_test/03: MissingCompileTimeError # Please triage.
 duplicate_implements_test/04: MissingCompileTimeError # Please triage.
 generic_methods_generic_function_result_test/01: MissingCompileTimeError # Please triage.
-int64_literal_test/03: Pass
-int64_literal_test/30: Pass
 issue23244_test: RuntimeError # Please triage.
 least_upper_bound_expansive_test/none: RuntimeError # Please triage.
 mixin_black_listed_test/02: MissingCompileTimeError # Please triage.
@@ -1583,7 +1574,8 @@
 cyclic_type_variable_test/02: MissingCompileTimeError
 cyclic_type_variable_test/03: MissingCompileTimeError
 cyclic_type_variable_test/04: MissingCompileTimeError
-cyclic_typedef_test/13: MissingCompileTimeError
+cyclic_typedef_test/10: Crash
+cyclic_typedef_test/11: Crash
 deep_nesting1_negative_test: Skip # Issue 31158
 deep_nesting2_negative_test: Skip # Issue 31158
 default_factory2_test/01: MissingCompileTimeError
@@ -1881,7 +1873,6 @@
 generic_methods_optional_parameters_test: Pass
 generic_methods_optional_parameters_test: RuntimeError
 generic_methods_overriding_test/01: MissingCompileTimeError
-generic_methods_overriding_test/03: MissingCompileTimeError
 generic_methods_recursive_bound_test/02: Crash
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
 generic_methods_recursive_bound_test/03: Pass
@@ -2102,6 +2093,7 @@
 method_override6_test/none: Pass
 method_override7_test/03: MissingCompileTimeError
 method_override8_test/03: MissingCompileTimeError
+method_override_test: CompileTimeError # Issue 31616
 mixin_black_listed_test/02: MissingCompileTimeError
 mixin_illegal_constructor_test/13: MissingCompileTimeError
 mixin_illegal_constructor_test/14: MissingCompileTimeError
@@ -2253,12 +2245,7 @@
 override_inheritance_field_test/48: MissingCompileTimeError
 override_inheritance_field_test/53: MissingCompileTimeError
 override_inheritance_field_test/54: MissingCompileTimeError
-override_inheritance_generic_test/04: MissingCompileTimeError
-override_inheritance_generic_test/06: MissingCompileTimeError
-override_inheritance_generic_test/07: MissingCompileTimeError
-override_inheritance_generic_test/08: MissingCompileTimeError
-override_inheritance_generic_test/09: MissingCompileTimeError
-override_inheritance_generic_test/10: MissingCompileTimeError
+override_inheritance_generic_test/02: CompileTimeError # Issue 31616
 override_inheritance_method_test/04: MissingCompileTimeError
 override_inheritance_method_test/05: MissingCompileTimeError
 override_inheritance_method_test/06: MissingCompileTimeError
@@ -2269,11 +2256,8 @@
 override_inheritance_method_test/19: MissingCompileTimeError
 override_inheritance_method_test/20: MissingCompileTimeError
 override_inheritance_method_test/21: MissingCompileTimeError
-override_inheritance_method_test/27: MissingCompileTimeError
-override_inheritance_method_test/30: MissingCompileTimeError
-override_inheritance_method_test/31: MissingCompileTimeError
-override_inheritance_method_test/32: MissingCompileTimeError
-override_inheritance_method_test/33: MissingCompileTimeError
+override_inheritance_method_test/28: CompileTimeError # Issue 31616
+override_inheritance_method_test/29: CompileTimeError # Issue 31616
 override_inheritance_mixed_test/06: MissingCompileTimeError
 override_inheritance_mixed_test/07: MissingCompileTimeError
 override_inheritance_mixed_test/08: MissingCompileTimeError
@@ -2319,7 +2303,7 @@
 regress_22443_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
 regress_22936_test: MissingCompileTimeError
 regress_22976_test/01: CompileTimeError # Issue 31402 (Variable declaration)
-regress_23089_test: MissingCompileTimeError
+regress_23089_test: Crash
 regress_23408_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
 regress_23408_test: RuntimeError
 regress_25550_test: CompileTimeError # Issue 31402 (Variable declaration)
@@ -2351,6 +2335,8 @@
 static_setter_get_test/01: MissingCompileTimeError
 string_interpolate_test: CompileTimeError # Issue 31533
 string_interpolation_and_buffer_test: RuntimeError # Issue 31402 (Return and yield statements)
+string_split_test: CompileTimeError # Issue 31616
+string_supertype_checked_test: CompileTimeError # Issue 31616
 super_bound_closure_test/none: CompileTimeError # Issue 31533
 super_call4_test: CompileTimeError
 super_call4_test: RuntimeError
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index ffdb31d..627c0be 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -27,9 +27,12 @@
 [ $compiler == dart2js ]
 async/schedule_microtask6_test: RuntimeError # global error handling is not supported. Issue 5958
 convert/base64_test/01: Fail, OK # Uses bit-wise operations to detect invalid values. Some large invalid values accepted by dart2js.
+convert/base64_test/01: Crash # Issue 31762
 convert/chunked_conversion_utf88_test: Slow, Pass
+convert/utf82_test: Crash # Issue 31762
 convert/utf85_test: Slow, Pass
 developer/timeline_test: Skip # Not supported
+math/double_pow_test: Crash # Issue 31762
 math/double_pow_test: RuntimeError
 math/low_test: RuntimeError
 mirrors/class_declarations_test/none: RuntimeError # Issue 13440
@@ -121,6 +124,7 @@
 mirrors/typevariable_mirror_metadata_test: RuntimeError # Issue 10905
 mirrors/variable_is_const_test/none: RuntimeError # Issue 14671
 profiler/metrics_num_test: Skip # Because of a int / double type test.
+typed_data/int32x4_bigint_test: Crash # Issue 31762
 typed_data/int32x4_bigint_test: RuntimeError # Issue 1533
 typed_data/int64_list_load_store_test: RuntimeError # Issue 10275
 typed_data/typed_data_hierarchy_int64_test: RuntimeError # Issue 10275
@@ -471,10 +475,17 @@
 
 [ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
 async/timer_not_available_test: Fail, OK
+convert/json_utf8_chunk_test: RuntimeError # Large integers
 js/*: Skip
 mirrors/deferred_type_test: CompileTimeError, OK # Don't have a multitest marker for dynamic compile time errors.
 mirrors/native_class_test: Fail, OK # This test is meant to run in a browser.
 
+[ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm || ($compiler == dart2js && $dart2js_with_kernel) ]
+convert/base64_test/01: CompileTimeError # Large integer literal
+convert/utf82_test: CompileTimeError # Large integer literal
+math/double_pow_test: CompileTimeError # Large integer literal
+typed_data/int32x4_bigint_test: CompileTimeError # Large integer literal
+
 [ $runtime == safari || $runtime == safarimobilesim ]
 convert/json_test: Fail # https://bugs.webkit.org/show_bug.cgi?id=134920
 typed_data/float32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index 7b6db9d..c9203ed 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -35,6 +35,7 @@
 async/async_await_sync_completer_test: RuntimeError
 async/future_or_only_in_async_test/00: MissingCompileTimeError
 async/future_or_strong_test: RuntimeError
+async/future_value_chain4_test: CompileTimeError # Issue 31616
 async/slow_consumer2_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/slow_consumer3_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/slow_consumer_test: CompileTimeError # Issue 31402 (Invocation arguments)
@@ -52,12 +53,8 @@
 html/*: SkipByDesign # dart:html not supported on VM.
 isolate/compile_time_error_test/01: MissingCompileTimeError
 isolate/count_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/cross_isolate_message_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/deferred_in_isolate2_test: Skip # Times out. Deferred loading kernel issue 28335.
 isolate/deferred_in_isolate_test: Skip # Times out. Deferred loading kernel issue 28335.
-isolate/error_at_spawnuri_test: RuntimeError # Issue 31402 (Return and yield statements)
-isolate/error_exit_at_spawnuri_test: RuntimeError # Issue 31402 (Return and yield statements)
-isolate/exit_at_spawnuri_test: RuntimeError # Issue 31402 (Return and yield statements)
 isolate/handle_error2_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/handle_error3_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/illegal_msg_function_test: CompileTimeError # Issue 31402 (Invocation arguments)
@@ -65,10 +62,8 @@
 isolate/isolate_current_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/issue_21398_parent_isolate1_test: RuntimeError # Issue 31402 (List literal)
 isolate/issue_21398_parent_isolate2_test/01: Skip # Times out. Deferred loading kernel issue 28335.
-isolate/issue_21398_parent_isolate_test: RuntimeError # Issue 31402 (Return and yield statements)
 isolate/kill_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/mandel_isolate_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/message2_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/message3_test/byteBuffer: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/message3_test/constInstance: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/message3_test/constList: CompileTimeError # Issue 31402 (Invocation arguments)
@@ -79,21 +74,11 @@
 isolate/message3_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/message_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/mint_maker_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/nested_spawn2_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/nested_spawn_test: RuntimeError # Issue 31402 (Invocation arguments)
 isolate/ping_pause_test: Pass, Timeout
-isolate/raw_port_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/request_reply_test: RuntimeError # Issue 31402 (Invocation arguments)
-isolate/spawn_function_custom_class_test: RuntimeError # Issue 31402 (Invocation arguments)
-isolate/spawn_function_test: RuntimeError # Issue 31402 (Invocation arguments)
-isolate/spawn_uri_exported_main_test: RuntimeError # Issue 31402 (Return and yield statements)
-isolate/spawn_uri_multi_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/spawn_uri_nested_vm_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/spawn_uri_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/spawn_uri_vm_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/static_function_test: RuntimeError # Issue 31402 (Invocation arguments)
+isolate/spawn_function_custom_class_test: Pass, Timeout
+isolate/spawn_uri_nested_vm_test: Pass, Timeout
+isolate/static_function_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/typed_message_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/unresolved_ports_test: CompileTimeError # Issue 31402 (Invocation arguments)
 js/datetime_roundtrip_test: CompileTimeError
 js/null_test: CompileTimeError
 js/prototype_access_test: CompileTimeError
@@ -283,17 +268,14 @@
 async/zone_run_unary_test: RuntimeError
 convert/json_toEncodable_reviver_test: CompileTimeError
 isolate/count_test: Timeout
-isolate/cross_isolate_message_test: RuntimeError
 isolate/illegal_msg_function_test: RuntimeError
 isolate/illegal_msg_mirror_test: RuntimeError
 isolate/isolate_current_test: RuntimeError
 isolate/isolate_import_test/01: MissingCompileTimeError
 isolate/issue_22778_test: Crash
-isolate/issue_24243_parent_isolate_test: RuntimeError
 isolate/kill_self_synchronously_test: RuntimeError
 isolate/kill_test: RuntimeError
 isolate/mandel_isolate_test: RuntimeError
-isolate/message2_test: RuntimeError
 isolate/message3_test/byteBuffer: RuntimeError
 isolate/message3_test/constInstance: RuntimeError
 isolate/message3_test/constList: RuntimeError
@@ -304,20 +286,11 @@
 isolate/message3_test/none: RuntimeError
 isolate/message_test: RuntimeError
 isolate/mint_maker_test: RuntimeError
-isolate/nested_spawn2_test: RuntimeError
-isolate/nested_spawn_test: Timeout
 isolate/ping_pause_test: RuntimeError
-isolate/raw_port_test: RuntimeError
-isolate/request_reply_test: Timeout
-isolate/spawn_function_test: Timeout
-isolate/spawn_uri_multi_test/none: RuntimeError
-isolate/spawn_uri_nested_vm_test: RuntimeError
-isolate/spawn_uri_test: RuntimeError
-isolate/spawn_uri_vm_test: RuntimeError
+isolate/request_reply_test: Pass, Timeout
 isolate/stacktrace_message_test: RuntimeError
-isolate/static_function_test: Timeout
 isolate/typed_message_test: RuntimeError
-isolate/unresolved_ports_test: RuntimeError
+isolate/unresolved_ports_test: Pass, Timeout
 mirrors/class_mirror_type_variables_test: RuntimeError
 mirrors/closures_test: RuntimeError
 mirrors/constructors_test: RuntimeError
@@ -396,6 +369,7 @@
 async/future_or_strong_test: RuntimeError
 async/future_test/01: RuntimeError
 async/future_test/none: RuntimeError
+async/future_value_chain4_test: CompileTimeError # Issue 31616
 async/slow_consumer2_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/slow_consumer3_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/slow_consumer_test: CompileTimeError # Issue 31402 (Invocation arguments)
diff --git a/tools/VERSION b/tools/VERSION
index 18ad238..d5d15b0 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 15
+PRERELEASE 16
 PRERELEASE_PATCH 0
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 3b03d8c..b55c6ef 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -217,7 +217,6 @@
     },
     {
       "builders": [
-        "vm-asan-linux-release-ia32",
         "vm-asan-linux-release-x64"
       ],
       "meta": {
@@ -350,7 +349,7 @@
           "exclude_tests": ["language_2","corelib_2","lib_2","standalone_2"]
         },
         {
-          "name": "checked vm tests",
+          "name": "strong vm tests",
           "arguments": ["--runtime=vm","--compiler=dartk","--strong"],
           "tests": ["language_2","corelib_2","lib_2","standalone_2"]
         }
diff --git a/tools/buildtools/update.py b/tools/buildtools/update.py
index 43560c0..8658059 100755
--- a/tools/buildtools/update.py
+++ b/tools/buildtools/update.py
@@ -14,7 +14,6 @@
 DART_ROOT = os.path.abspath(os.path.join(THIS_DIR, '..', '..'))
 BUILDTOOLS = os.path.join(DART_ROOT, 'buildtools')
 TOOLS_BUILDTOOLS = os.path.join(DART_ROOT, 'tools', 'buildtools')
-TOOLCHAIN = os.path.join(BUILDTOOLS, 'toolchain')
 
 sys.path.insert(0, os.path.join(DART_ROOT, 'tools'))
 import find_depot_tools
@@ -24,7 +23,7 @@
 
 def Update():
   path = os.path.join(BUILDTOOLS, 'update.sh')
-  command = ['/bin/bash', path, '--toolchain', '--gn']
+  command = ['/bin/bash', path, '--clang', '--gn']
   return subprocess.call(command, cwd=DART_ROOT)
 
 
@@ -74,17 +73,19 @@
 def CopyClangFormat():
   if sys.platform == 'darwin':
     platform = 'darwin'
-    subdir = 'mac'
+    tools = 'mac'
+    toolchain = 'mac-x64'
   elif sys.platform.startswith('linux'):
     platform = 'linux'
-    subdir = 'linux64'
+    tools = 'linux64'
+    toolchain = 'linux-x64'
   else:
     print 'Unknown platform: ' + sys.platform
     return 1
 
   clang_format = os.path.join(
-      TOOLCHAIN, 'clang+llvm-x86_64-' + platform, 'bin', 'clang-format')
-  dest = os.path.join(BUILDTOOLS, subdir, 'clang-format')
+      BUILDTOOLS, toolchain, 'clang', 'bin', 'clang-format')
+  dest = os.path.join(BUILDTOOLS, tools, 'clang-format')
   shutil.copy2(clang_format, dest)
   return 0
 
diff --git a/tools/run_dart.py b/tools/run_dart.py
old mode 100644
new mode 100755
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 73470e5..aa61803 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -124,7 +124,10 @@
   }
 
   List<String> computeCompilerArguments(
-      List<String> vmOptions, List<String> sharedOptions, List<String> args) {
+      List<String> vmOptions,
+      List<String> sharedOptions,
+      List<String> dart2jsOptions,
+      List<String> args) {
     return sharedOptions.toList()..addAll(args);
   }
 
@@ -341,7 +344,8 @@
         allCommands, artifact.filename, artifact.mimeType);
   }
 
-  List<String> computeCompilerArguments(vmOptions, sharedOptions, args) {
+  List<String> computeCompilerArguments(
+      vmOptions, sharedOptions, dart2jsOptions, args) {
     // The result will be passed as an input to [extractArguments]
     // (i.e. the arguments to the [PipelineCommand]).
     return <String>[]..addAll(vmOptions)..addAll(sharedOptions)..addAll(args);
@@ -433,6 +437,17 @@
     return multiplier;
   }
 
+  List<String> computeCompilerArguments(
+      List<String> vmOptions,
+      List<String> sharedOptions,
+      List<String> dart2jsOptions,
+      List<String> args) {
+    return <String>[]
+      ..addAll(sharedOptions)
+      ..addAll(dart2jsOptions)
+      ..addAll(args);
+  }
+
   CommandArtifact computeCompilationArtifact(String tempDir,
       List<String> arguments, Map<String, String> environmentOverrides) {
     var compilerArguments = arguments.toList()
@@ -470,7 +485,10 @@
   }
 
   List<String> computeCompilerArguments(
-      List<String> vmOptions, List<String> sharedOptions, List<String> args) {
+      List<String> vmOptions,
+      List<String> sharedOptions,
+      List<String> dart2jsOptions,
+      List<String> args) {
     var result = sharedOptions.toList();
 
     // The file being compiled is the last argument.
@@ -554,7 +572,10 @@
   }
 
   List<String> computeCompilerArguments(
-      List<String> vmOptions, List<String> sharedOptions, List<String> args) {
+      List<String> vmOptions,
+      List<String> sharedOptions,
+      List<String> dart2jsOptions,
+      List<String> args) {
     var result = sharedOptions.toList();
 
     // The file being compiled is the last argument.
@@ -571,12 +592,18 @@
         .absolute
         .toNativePath();
 
+    var summaryInputDir = new Path(_configuration.buildDirectory)
+        .append("/gen/utils/dartdevc/pkg")
+        .absolute
+        .toNativePath();
+
     args.addAll([
       "--dart-sdk-summary",
       sdkSummary,
       "-o",
       outputFile,
       inputFile,
+      "--summary-input-dir=$summaryInputDir",
     ]);
 
     // Link to the summaries for the available packages, so that they don't
@@ -822,7 +849,7 @@
   }
 
   List<String> computeCompilerArguments(
-      vmOptions, sharedOptions, originalArguments) {
+      vmOptions, sharedOptions, dart2jsOptions, originalArguments) {
     List<String> args = [];
     if (_isChecked) {
       args.add('--enable_asserts');
@@ -898,7 +925,7 @@
   }
 
   List<String> computeCompilerArguments(
-      vmOptions, sharedOptions, originalArguments) {
+      vmOptions, sharedOptions, dart2jsOptions, originalArguments) {
     var args = <String>[];
     if (_isChecked) {
       args.add('--enable_asserts');
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 6d71dc0..cca9e4e 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -851,12 +851,13 @@
     var commands = <Command>[];
     var compilerConfiguration = configuration.compilerConfiguration;
     var sharedOptions = info.optionsFromFile['sharedOptions'] as List<String>;
+    var dart2jsOptions = info.optionsFromFile['dart2jsOptions'] as List<String>;
 
     var compileTimeArguments = <String>[];
     String tempDir;
     if (compilerConfiguration.hasCompiler) {
       compileTimeArguments = compilerConfiguration.computeCompilerArguments(
-          vmOptions, sharedOptions, args);
+          vmOptions, sharedOptions, dart2jsOptions, args);
       // Avoid doing this for analyzer.
       var path = info.filePath;
       if (vmOptionsVariant != 0) {
@@ -1236,6 +1237,9 @@
 
     var options = optionsFromFile['sharedOptions'] as List<String>;
     if (options != null) args.addAll(options);
+    options = optionsFromFile['dart2jsOptions'] as List<String>;
+    if (options != null) args.addAll(options);
+    print('options = ${args}');
 
     return Command.compilation(Compiler.dart2js.name, outputFile,
         dart2JsBootstrapDependencies, compilerPath, args, environmentOverrides,
@@ -1309,11 +1313,15 @@
    *
    *     // VMOptions=--flag1 --flag2
    *
-   *   - Flags can be passed to dart2js or vm by adding a comment
-   *   to the test file:
+   *   - Flags can be passed to dart2js, vm or dartdevc by adding a comment to
+   *   the test file:
    *
    *     // SharedOptions=--flag1 --flag2
    *
+   *   - Flags can be passed to dart2js by adding a comment to the test file:
+   *
+   *     // dart2jsOptions=--flag1 --flag2
+   *
    *   - Flags can be passed to the dart script that contains the test also
    *   using comments, as follows:
    *
@@ -1376,8 +1384,6 @@
       return readOptionsFromCo19File(filePath);
     }
     RegExp testOptionsRegExp = new RegExp(r"// VMOptions=(.*)");
-    RegExp sharedOptionsRegExp = new RegExp(r"// SharedOptions=(.*)");
-    RegExp dartOptionsRegExp = new RegExp(r"// DartOptions=(.*)");
     RegExp environmentRegExp = new RegExp(r"// Environment=(.*)");
     RegExp otherScriptsRegExp = new RegExp(r"// OtherScripts=(.*)");
     RegExp otherResourcesRegExp = new RegExp(r"// OtherResources=(.*)");
@@ -1397,33 +1403,36 @@
     var result = <List<String>>[];
     List<String> dartOptions;
     List<String> sharedOptions;
+    List<String> dart2jsOptions;
     Map<String, String> environment;
     String packageRoot;
     String packages;
 
+    List<String> wordSplit(String s) =>
+        s.split(' ').where((e) => e != '').toList();
+
+    List<String> singleListOfOptions(String name) {
+      var matches = new RegExp('// $name=(.*)').allMatches(contents);
+      var options;
+      for (var match in matches) {
+        if (options != null) {
+          throw new Exception(
+              'More than one "// $name=" line in test $filePath');
+        }
+        options = wordSplit(match[1]);
+      }
+      return options;
+    }
+
     var matches = testOptionsRegExp.allMatches(contents);
     for (var match in matches) {
-      result.add(match[1].split(' ').where((e) => e != '').toList());
+      result.add(wordSplit(match[1]));
     }
     if (result.isEmpty) result.add([]);
 
-    matches = dartOptionsRegExp.allMatches(contents);
-    for (var match in matches) {
-      if (dartOptions != null) {
-        throw new Exception(
-            'More than one "// DartOptions=" line in test $filePath');
-      }
-      dartOptions = match[1].split(' ').where((e) => e != '').toList();
-    }
-
-    matches = sharedOptionsRegExp.allMatches(contents);
-    for (var match in matches) {
-      if (sharedOptions != null) {
-        throw new Exception(
-            'More than one "// SharedOptions=" line in test $filePath');
-      }
-      sharedOptions = match[1].split(' ').where((e) => e != '').toList();
-    }
+    dartOptions = singleListOfOptions('DartOptions');
+    sharedOptions = singleListOfOptions('SharedOptions');
+    dart2jsOptions = singleListOfOptions('dart2jsOptions');
 
     matches = environmentRegExp.allMatches(contents);
     for (var match in matches) {
@@ -1468,13 +1477,13 @@
     var otherScripts = <String>[];
     matches = otherScriptsRegExp.allMatches(contents);
     for (var match in matches) {
-      otherScripts.addAll(match[1].split(' ').where((e) => e != '').toList());
+      otherScripts.addAll(wordSplit(match[1]));
     }
 
     var otherResources = <String>[];
     matches = otherResourcesRegExp.allMatches(contents);
     for (var match in matches) {
-      otherResources.addAll(match[1].split(' ').where((e) => e != '').toList());
+      otherResources.addAll(wordSplit(match[1]));
     }
 
     var isMultitest = multiTestRegExp.hasMatch(contents);
@@ -1519,7 +1528,8 @@
 
     return {
       "vmOptions": result,
-      "sharedOptions": sharedOptions ?? [],
+      "sharedOptions": sharedOptions ?? <String>[],
+      "dart2jsOptions": dart2jsOptions ?? <String>[],
       "dartOptions": dartOptions,
       "environment": environment,
       "packageRoot": packageRoot,
@@ -1540,8 +1550,9 @@
 
   Map<String, dynamic> optionsFromKernelFile() {
     return const {
-      "vmOptions": const [const []],
-      "sharedOptions": const [],
+      "vmOptions": const [const <String>[]],
+      "sharedOptions": const <String>[],
+      "dart2jsOptions": const <String>[],
       "dartOptions": null,
       "packageRoot": null,
       "packages": null,
@@ -1609,6 +1620,7 @@
     return {
       "vmOptions": <List>[[]],
       "sharedOptions": <String>[],
+      "dart2jsOptions": <String>[],
       "dartOptions": null,
       "packageRoot": null,
       "hasSyntaxError": hasSyntaxError,
diff --git a/tools/testing/dart/utils.dart b/tools/testing/dart/utils.dart
index b2ca746..0e458ba 100644
--- a/tools/testing/dart/utils.dart
+++ b/tools/testing/dart/utils.dart
@@ -387,13 +387,17 @@
   }
 
   /**
+   * Keep a map of files copied to avoid race conditions.
+   */
+  static Map<String, Future> _copyFilesMap = {};
+
+  /**
    * Copy a [source] file to a new place.
    * Assumes that the directory for [dest] already exists.
    */
   static Future copyFile(Path source, Path dest) {
-    return new File(source.toNativePath())
-        .openRead()
-        .pipe(new File(dest.toNativePath()).openWrite());
+    return _copyFilesMap.putIfAbsent(dest.toNativePath(),
+        () => new File(source.toNativePath()).copy(dest.toNativePath()));
   }
 
   static Future copyDirectory(String source, String dest) {
diff --git a/utils/bazel/kernel_summary_worker.dart b/utils/bazel/kernel_summary_worker.dart
index 7935027..55589f9 100644
--- a/utils/bazel/kernel_summary_worker.dart
+++ b/utils/bazel/kernel_summary_worker.dart
@@ -16,6 +16,7 @@
 import 'package:bazel_worker/bazel_worker.dart';
 import 'package:front_end/src/api_unstable/summary_worker.dart' as fe;
 import 'package:front_end/src/multi_root_file_system.dart';
+import 'package:kernel/ast.dart' show Program, Library;
 import 'package:kernel/target/targets.dart';
 
 main(List<String> args) async {
@@ -82,6 +83,10 @@
 /// An [ArgParser] for generating kernel summaries.
 final summaryArgsParser = new ArgParser()
   ..addFlag('help', negatable: false)
+  ..addFlag('exclude-non-sources',
+      negatable: false,
+      help: 'Whether source files loaded implicitly should be included as '
+          'part of the summary.')
   ..addOption('dart-sdk-summary')
   ..addOption('input-summary', allowMultiple: true)
   ..addOption('multi-root', allowMultiple: true)
@@ -115,14 +120,15 @@
   if (multiRoots.isEmpty) multiRoots.add(Uri.base);
   var fileSystem = new MultiRootFileSystem(parsedArgs['multi-root-scheme'],
       multiRoots, fe.PhysicalFileSystem.instance);
-
+  var sources = parsedArgs['source'].map(Uri.parse).toList();
   var state = await fe.initializeCompiler(
       // TODO(sigmund): pass an old state once we can make use of it.
       null,
       Uri.base.resolve(parsedArgs['dart-sdk-summary']),
       Uri.base.resolve(parsedArgs['packages-file']),
       parsedArgs['input-summary'].map(Uri.base.resolve).toList(),
-      new NoneTarget(new TargetFlags()),
+      new SummaryTarget(sources, parsedArgs['exclude-non-sources'],
+          new TargetFlags(strongMode: true)),
       fileSystem);
 
   void onProblem(problem, severity, String formatted, line, column) {
@@ -136,7 +142,6 @@
     }
   }
 
-  var sources = parsedArgs['source'].map(Uri.parse).toList();
   var summary = await fe.compile(state, sources, onProblem);
 
   if (summary != null) {
@@ -149,3 +154,44 @@
 
   return succeeded;
 }
+
+/// A target that transforms outlines to meet the requirements of summaries in
+/// bazel and package-build.
+///
+/// Build systems like package-build may provide the same input file twice to
+/// the summary worker, but only intends to have it in one output summary.  The
+/// convention is that if it is listed as a source, it is intended to be part of
+/// the output, if the source file was loaded as a dependency, then it was
+/// already included in a different summary.  The transformation below ensures
+/// that the output summary doesn't include those implicit inputs.
+///
+/// Note: this transformation is destructive and is only intended to be used
+/// when generating summaries.
+class SummaryTarget extends NoneTarget {
+  final List<Uri> sources;
+  final bool excludeNonSources;
+
+  SummaryTarget(this.sources, this.excludeNonSources, TargetFlags flags)
+      : super(flags);
+
+  @override
+  void performOutlineTransformations(Program program) {
+    if (!excludeNonSources) return;
+
+    List<Library> libraries = new List.from(program.libraries);
+    program.libraries.clear();
+    Set<Uri> include = sources.toSet();
+    for (var lib in libraries) {
+      if (include.contains(lib.importUri)) {
+        program.libraries.add(lib);
+      } else {
+        // Excluding the library also means that their canonical names will not
+        // be computed as part of serialization, so we need to do that
+        // preemtively here to avoid errors when serializing references to
+        // elements of these libraries.
+        program.root.getChildFromUri(lib.importUri).bindTo(lib.reference);
+        lib.computeCanonicalNames();
+      }
+    }
+  }
+}