Version 2.0.0-dev.54.0

Merge commit 'a0d3bef5fbe599a06fde34c79500b42a4eab265b' into dev
diff --git a/BUILD.gn b/BUILD.gn
index 6d24c82..fe6513a 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -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.
 
-import("build/dart_host_sdk_toolchain.gni")
+import("build/dart/dart_host_sdk_toolchain.gni")
 
 targetting_fuchsia = target_os == "fuchsia"
 
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1ef9bfb..0269232 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 2.0.0-dev.54.0
+
+### Tool Changes
+
+#### Pub
+
+* Retry on 500 errors from the pub server.
+
 ## 2.0.0-dev.53.0
 
 ## 2.0.0-dev.52.0
diff --git a/DEPS b/DEPS
index dc79768..6564eee 100644
--- a/DEPS
+++ b/DEPS
@@ -114,8 +114,8 @@
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "1.3.4",
   "protobuf_tag": "0.7.1",
-  "pub_rev": "2e821bff00c00889afe5200e3a33f280ce942336",
-  "pub_semver_tag": "1.3.7",
+  "pub_rev": "c61b8a3a24a7b1f931bad24b1f663e2c9a4c4354",
+  "pub_semver_tag": "1.4.1",
   "quiver_tag": "5aaa3f58c48608af5b027444d561270b53f15dbf",
   "resource_rev":"af5a5bf65511943398146cf146e466e5f0b95cb9",
   "root_certificates_rev": "16ef64be64c7dfdff2b9f4b910726e635ccc519e",
diff --git a/build/compiled_action.gni b/build/compiled_action.gni
deleted file mode 100644
index 5b5afa7..0000000
--- a/build/compiled_action.gni
+++ /dev/null
@@ -1,191 +0,0 @@
-# Copyright 2014 The Chromium Authors. 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 introduces two related templates that act like action and
-# action_foreach but instead of running a Python script, it will compile a
-# given tool in the host toolchain and run that (either once or over the list
-# of inputs, depending on the variant).
-#
-# Parameters
-#
-#   tool (required)
-#       [label] Label of the tool to run. This should be an executable, and
-#       this label should not include a toolchain (anything in parens). The
-#       host compile of this tool will be used.
-#
-#   outputs (required)
-#       [list of files] Like the outputs of action (if using "compiled_action",
-#       this would be just the list of outputs), or action_foreach (if using
-#       "compiled_action_foreach", this would contain source expansions mapping
-#       input to output files).
-#
-#   args (required)
-#       [list of strings] Same meaning as action/action_foreach.
-#
-#   inputs (optional)
-#       Files the binary takes as input. The step will be re-run whenever any
-#       of these change. If inputs is empty, the step will run only when the
-#       binary itself changes.
-#
-#   visibility
-#   deps
-#   args   (all optional)
-#       Same meaning as action/action_foreach.
-#
-#
-# Example of usage:
-#
-#   compiled_action("run_my_tool") {
-#     tool = "//tools/something:mytool"
-#     outputs = [
-#       "$target_gen_dir/mysource.cc",
-#       "$target_gen_dir/mysource.h",
-#     ]
-#
-#     # The tool takes this input.
-#     inputs = [ "my_input_file.idl" ]
-#
-#     # In this case, the tool takes as arguments the input file and the output
-#     # build dir (both relative to the "cd" that the script will be run in)
-#     # and will produce the output files listed above.
-#     args = [
-#       rebase_path("my_input_file.idl", root_build_dir),
-#       "--output-dir", rebase_path(target_gen_dir, root_build_dir),
-#     ]
-#   }
-#
-# You would typically declare your tool like this:
-#   if (host_toolchain == current_toolchain) {
-#     executable("mytool") {
-#       ...
-#     }
-#   }
-# The if statement around the executable is optional. That says "I only care
-# about this target in the host toolchain". Usually this is what you want, and
-# saves unnecessarily compiling your tool for the target platform. But if you
-# need a target build of your tool as well, just leave off the if statement.
-
-import("dart_host_sdk_toolchain.gni")
-
-if (host_os == "win") {
-  _host_executable_suffix = ".exe"
-} else {
-  _host_executable_suffix = ""
-}
-
-_dart_root = get_path_info("..", "abspath")
-
-template("compiled_action") {
-  assert(defined(invoker.tool), "tool must be defined for $target_name")
-  assert(defined(invoker.outputs), "outputs must be defined for $target_name")
-  assert(defined(invoker.args), "args must be defined for $target_name")
-
-  assert(!defined(invoker.sources),
-         "compiled_action doesn't take a sources arg. Use inputs instead.")
-
-  action(target_name) {
-    if (defined(invoker.visibility)) {
-      visibility = invoker.visibility
-    }
-
-    script = "$_dart_root/build/gn_run_binary.py"
-
-    if (defined(invoker.inputs)) {
-      inputs = invoker.inputs
-    } else {
-      inputs = []
-    }
-    outputs = invoker.outputs
-
-    # Constuct the host toolchain version of the tool.
-    host_tool = invoker.tool + "($dart_host_toolchain)"
-
-    # Get the path to the executable. Currently, this assumes that the tool
-    # does not specify output_name so that the target name is the name to use.
-    # If that's not the case, we'll need another argument to the script to
-    # specify this, since we can't know what the output name is (it might be in
-    # another file not processed yet).
-    host_executable =
-        get_label_info(host_tool, "root_out_dir") + "/" +
-        get_label_info(host_tool, "name") + _host_executable_suffix
-
-    # Add the executable itself as an input.
-    inputs += [ host_executable ]
-
-    deps = [
-      host_tool,
-    ]
-    if (defined(invoker.deps)) {
-      deps += invoker.deps
-    }
-
-    if (defined(invoker.depfile)) {
-      depfile = invoker.depfile
-    }
-
-    # The script takes as arguments the binary to run, and then the arguments
-    # to pass it.
-    args = [
-             "compiled_action",
-             rebase_path(host_executable, root_build_dir),
-           ] + invoker.args
-  }
-}
-
-template("compiled_action_foreach") {
-  assert(defined(invoker.sources), "sources must be defined for $target_name")
-  assert(defined(invoker.tool), "tool must be defined for $target_name")
-  assert(defined(invoker.outputs), "outputs must be defined for $target_name")
-  assert(defined(invoker.args), "args must be defined for $target_name")
-
-  action_foreach(target_name) {
-    # Otherwise this is a standalone action, define visibility if requested.
-    if (defined(invoker.visibility)) {
-      visibility = invoker.visibility
-    }
-
-    script = "$_dart_root/build/gn_run_binary.py"
-    sources = invoker.sources
-
-    if (defined(invoker.inputs)) {
-      inputs = invoker.inputs
-    } else {
-      inputs = []
-    }
-    outputs = invoker.outputs
-
-    # Constuct the host toolchain version of the tool.
-    host_tool = invoker.tool + "($dart_host_toolchain)"
-
-    # Get the path to the executable. Currently, this assumes that the tool
-    # does not specify output_name so that the target name is the name to use.
-    # If that's not the case, we'll need another argument to the script to
-    # specify this, since we can't know what the output name is (it might be in
-    # another file not processed yet).
-    host_executable =
-        get_label_info(host_tool, "root_out_dir") + "/" +
-        get_label_info(host_tool, "name") + _host_executable_suffix
-
-    # Add the executable itself as an input.
-    inputs += [ host_executable ]
-
-    deps = [
-      host_tool,
-    ]
-    if (defined(invoker.deps)) {
-      deps += invoker.deps
-    }
-
-    if (defined(invoker.depfile)) {
-      depfile = invoker.depfile
-    }
-
-    # The script takes as arguments the binary to run, and then the arguments
-    # to pass it.
-    args = [
-             "compiled_action",
-             rebase_path(host_executable, root_build_dir),
-           ] + invoker.args
-  }
-}
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index bdddd97..eeece1c 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -501,6 +501,7 @@
   default_warning_flags += [
     # Permanent.
     "/wd4091",  # typedef warning from dbghelp.h
+    "/wd4722",  # destructor never returns
 
     # Investigate.
     "/wd4312",  # int to pointer of greater size conversion.
diff --git a/build/dart/dart_action.gni b/build/dart/dart_action.gni
new file mode 100644
index 0000000..f5bf967
--- /dev/null
+++ b/build/dart/dart_action.gni
@@ -0,0 +1,367 @@
+# 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("../executable_suffix.gni")
+import("dart_host_sdk_toolchain.gni")
+import("prebuilt_dart_sdk.gni")
+
+# This file defines templates for running and compiling Dart code during
+# Dart's build.
+#
+# - prebuilt_dart_action()
+#   Runs Dart scripts using the downloaded prebuilt Dart SDK if there is one,
+#   and a built dart_bootstrap otherwise. This is the preferred method of
+#   running Dart code during the build as it is much faster than using
+#   dart_action() in debug and cross builds. However, prebuilt_dart_action()
+#   should *not* be used to generate snapshots.
+#
+# - dart_action()
+#   Runs Dart scripts using the binary built for runtime/bin:dart using the
+#   host toolchain. It should only be used when an artifact agreeing exactly
+#   with the version of the Dart VM being built must be produced, for example
+#   an App-JIT snapshot. This will be slow in Debug builds, and very slow in
+#   cross builds.
+#
+# - dart_bootstrap_action()
+#   Ditto, but uses runtime/bin:dart_bootstrap.
+#
+# - gen_snapshot_action()
+#   Runs the binary built for runtime/bin:gen_snapshot using the host
+#   toolchain. It should only be used when an artifact agreeing exactly
+#   with the version of the Dart VM being built must be produced.
+
+# This assigns _dart_root the GN absolute path of the Dart repo. For example,
+# in a Dart checkout, this will be "//". In a client repo it might be
+# "//third_party/dart".
+_dart_root = get_path_info("../..", "abspath")
+
+template("_compiled_action") {
+  assert(defined(invoker.tool), "tool must be defined for $target_name")
+  assert(defined(invoker.outputs), "outputs must be defined for $target_name")
+  assert(defined(invoker.args), "args must be defined for $target_name")
+
+  action(target_name) {
+    if (defined(invoker.visibility)) {
+      visibility = invoker.visibility
+    }
+
+    script = "$_dart_root/build/gn_run_binary.py"
+
+    if (defined(invoker.inputs)) {
+      inputs = invoker.inputs
+    } else {
+      inputs = []
+    }
+    outputs = invoker.outputs
+
+    # Construct the host toolchain version of the tool.
+    host_tool = invoker.tool + "($dart_host_toolchain)"
+
+    # Get the path to the executable. Currently, this assumes that the tool
+    # does not specify output_name so that the target name is the name to use.
+    # If that's not the case, we'll need another argument to the script to
+    # specify this, since we can't know what the output name is (it might be in
+    # another file not processed yet).
+    host_executable =
+        get_label_info(host_tool, "root_out_dir") + "/" +
+        get_label_info(host_tool, "name") + executable_suffix
+
+    # Add the executable itself as an input.
+    inputs += [ host_executable ]
+
+    deps = [
+      host_tool,
+    ]
+    if (defined(invoker.deps)) {
+      deps += invoker.deps
+    }
+
+    if (defined(invoker.depfile)) {
+      depfile = invoker.depfile
+    }
+
+    # The "compiled_action" argument to gn_run_binary.py indicates that
+    # it will exit with a non-zero status when the target program does.
+    args = [
+             "compiled_action",
+             rebase_path(host_executable, root_build_dir),
+           ] + invoker.args
+  }
+}
+
+# A template for running Dart scripts during the build using the prebuilt Dart
+# SDK. This should *not* be used for generating snapshots. It uses the dart
+# binary from the prebuilt Dart SDK if one is available, and dart_bootstrap
+# otherwise.
+#
+# Parameters:
+#  script:
+#    The un-rebased path to the Dart script.
+#
+# vm_args (optional):
+#    Arguments to pass to the Dart VM.
+#
+#  args (optional):
+#    The arguments to pass to the Dart script.
+#
+#  packages (optional):
+#    The un-rebased path to the .packages file.
+#
+#  Forwarded to action() with the usual meaning:
+#    depfile
+#    deps
+#    inputs
+#    outputs
+#    visibility
+template("prebuilt_dart_action") {
+  assert(defined(invoker.script), "script must be defined for $target_name")
+  assert(defined(invoker.outputs), "outputs must be defined for $target_name")
+  assert(defined(invoker.args), "args must be defined for $target_name")
+  assert(!defined(invoker.sources),
+         "prebuilt_dart_action doesn't take a sources arg. Use inputs instead.")
+
+  vm_args = []
+  if (defined(invoker.vm_args)) {
+    vm_args += invoker.vm_args
+  }
+
+  if (prebuilt_dart_exe_works) {
+    action(target_name) {
+      forward_variables_from(invoker, [
+          "inputs",
+          "outputs",
+          "deps",
+          "visibility",
+          "depfile",
+      ])
+      script = "$_dart_root/build/gn_run_binary.py"
+      prebuilt_dart_binary =
+          "$_dart_root/tools/sdks/$host_os/dart-sdk/bin/dart$executable_suffix"
+
+      inputs += [ invoker.script ]
+      if (defined(invoker.packages)) {
+        inputs += [ invoker.packages ]
+      }
+
+      args = [
+        "compiled_action",
+        rebase_path(prebuilt_dart_binary),
+      ] + vm_args
+      if (defined(invoker.packages)) {
+        args += [
+          "--packages=" + rebase_path(invoker.packages),
+        ]
+      }
+      args += [ rebase_path(invoker.script) ] + invoker.args
+    }
+  } else {
+    _compiled_action(target_name) {
+      forward_variables_from(invoker, [
+          "inputs",
+          "outputs",
+          "deps",
+          "visibility",
+          "depfile",
+      ])
+
+      inputs += [ invoker.script ]
+      if (defined(invoker.packages)) {
+        inputs += [ invoker.packages ]
+      }
+
+      tool = "$_dart_root/runtime/bin:dart_bootstrap"
+      args = vm_args
+      if (defined(invoker.packages)) {
+        args += [
+          "--packages=" + rebase_path(invoker.packages),
+        ]
+      }
+      args += [ rebase_path(invoker.script) ] + invoker.args
+    }
+  }
+}
+
+# This template runs the specified tool produced by the in-progress build.
+#
+# Parameters:
+#  tool:
+#    The target of the tool to run.
+#
+#  script (optional):
+#    The un-rebased path to the Dart script.
+#
+#  vm_args (optional):
+#    Arguments to pass to the Dart VM.
+#
+#  args (optional):
+#    The arguments to pass to the Dart script.
+#
+#  packages (optional):
+#    The un-rebased path to the .packages file.
+#
+#  Forwarded to action() with the usual meaning:
+#    depfile
+#    deps
+#    inputs
+#    outputs
+#    visibility
+template("_built_tool_action") {
+  assert(defined(invoker.tool), "tool must be defined for $target_name")
+  assert(defined(invoker.outputs), "outputs must be defined for $target_name")
+  assert(defined(invoker.args), "args must be defined for $target_name")
+  assert(!defined(invoker.sources),
+         "sources arg not supported for $target_name. Use inputs instead.")
+
+  vm_args = []
+  if (defined(invoker.vm_args)) {
+    vm_args += invoker.vm_args
+  }
+
+  _compiled_action(target_name) {
+    forward_variables_from(invoker, [
+        "depfile",
+        "deps",
+        "inputs",
+        "outputs",
+        "tool",
+        "visibility",
+    ])
+
+    if (!defined(invoker.inputs)) {
+      inputs = []
+    }
+    if (defined(invoker.script)) {
+      inputs += [ invoker.script ]
+    }
+    if (defined(invoker.packages)) {
+      inputs += [ invoker.packages ]
+    }
+
+    args = vm_args
+    if (defined(invoker.packages)) {
+      args += [ "--packages=" + rebase_path(invoker.packages) ]
+    }
+    if (defined(invoker.script)) {
+      args += [ rebase_path(invoker.script) ]
+    }
+    args += invoker.args
+  }
+}
+
+# This template runs the Dart VM produced by the in-progress build.
+#
+# Parameters:
+#  script:
+#    The un-rebased path to the Dart script.
+#
+#  vm_args (optional):
+#    Arguments to pass to the Dart VM.
+#
+#  args (optional):
+#    The arguments to pass to the Dart script.
+#
+#  packages (optional):
+#    The un-rebased path to the .packages file.
+#
+#  Forwarded to action() with the usual meaning:
+#    depfile
+#    deps
+#    inputs
+#    outputs
+#    visibility
+template("dart_action") {
+  assert(defined(invoker.script), "script must be defined for $target_name")
+  _built_tool_action(target_name) {
+    tool = "$_dart_root/runtime/bin:dart"
+    forward_variables_from(invoker, [
+      "args",
+      "depfile",
+      "deps",
+      "inputs",
+      "outputs",
+      "packages",
+      "script",
+      "tool",
+      "visibility",
+      "vm_args",
+    ])
+  }
+}
+
+# This template runs the dart_bootstrap produced by the in-progress build.
+#
+# Parameters:
+#  script:
+#    The un-rebased path to the Dart script.
+#
+#  vm_args (optional):
+#    Arguments to pass to the Dart VM.
+#
+#  args (optional):
+#    The arguments to pass to the Dart script.
+#
+#  packages (optional):
+#    The un-rebased path to the .packages file.
+#
+#  Forwarded to action() with the usual meaning:
+#    depfile
+#    deps
+#    inputs
+#    outputs
+#    visibility
+template("dart_bootstrap_action") {
+  assert(defined(invoker.script), "script must be defined for $target_name")
+  _built_tool_action(target_name) {
+    tool = "$_dart_root/runtime/bin:dart_bootstrap"
+    forward_variables_from(invoker, [
+      "args",
+      "depfile",
+      "deps",
+      "inputs",
+      "outputs",
+      "packages",
+      "script",
+      "tool",
+      "visibility",
+      "vm_args",
+    ])
+  }
+}
+
+# This template runs the gen_snapshot produced by the in-progress build.
+#
+# Parameters:
+#  vm_args (optional):
+#    Arguments to pass to the Dart VM.
+#
+#  args (optional):
+#    The arguments to pass to the Dart script.
+#
+#  packages (optional):
+#    The un-rebased path to the .packages file.
+#
+#  Forwarded to action() with the usual meaning:
+#    depfile
+#    deps
+#    inputs
+#    outputs
+#    visibility
+template("gen_snapshot_action") {
+  assert(!defined(invoker.script),
+      "script must not be defined for $target_name. If there is a script use args instead.")
+  _built_tool_action(target_name) {
+    tool = "$_dart_root/runtime/bin:gen_snapshot"
+    forward_variables_from(invoker, [
+      "args",
+      "depfile",
+      "deps",
+      "inputs",
+      "outputs",
+      "packages",
+      "tool",
+      "visibility",
+      "vm_args",
+    ])
+  }
+}
diff --git a/build/dart_host_sdk_toolchain.gni b/build/dart/dart_host_sdk_toolchain.gni
similarity index 100%
rename from build/dart_host_sdk_toolchain.gni
rename to build/dart/dart_host_sdk_toolchain.gni
diff --git a/build/prebuilt_dart_sdk.gni b/build/dart/prebuilt_dart_sdk.gni
similarity index 63%
rename from build/prebuilt_dart_sdk.gni
rename to build/dart/prebuilt_dart_sdk.gni
index ca4261e..59e519c 100644
--- a/build/prebuilt_dart_sdk.gni
+++ b/build/dart/prebuilt_dart_sdk.gni
@@ -2,14 +2,15 @@
 # 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("executable_suffix.gni")
+import("../executable_suffix.gni")
 
-_dart_root = rebase_path("..")
+_dart_root = rebase_path("../..")
 
 _prebuilt_dart_exe = "$_dart_root/tools/sdks/$host_os/dart-sdk/bin/dart$executable_suffix"
 
-# Our gn_run_binary swallows output unless there is an error.
-_prebuilt_dart_exe_trial = exec_script("gn_run_binary.py",
+# When the first argument is "exec_script", gn_run_binary.py always exits with
+# status 0, but gives non-empty output when the command it is given fails.
+_prebuilt_dart_exe_trial = exec_script("../gn_run_binary.py",
     ["exec_script", _prebuilt_dart_exe, "--version"], "string")
 if (_prebuilt_dart_exe_trial == "") {
   prebuilt_dart_exe_works = true
diff --git a/build/dart_action.gni b/build/dart_action.gni
deleted file mode 100644
index 81c147f..0000000
--- a/build/dart_action.gni
+++ /dev/null
@@ -1,92 +0,0 @@
-# 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("compiled_action.gni")
-import("executable_suffix.gni")
-import("prebuilt_dart_sdk.gni")
-
-_dart_root = get_path_info("..", "abspath")
-
-# A template for running Dart scripts during the build. This should *not* be
-# used for generating snapshots. It uses the dart binary from the prebuilt
-# Dart SDK if one is available, and dart_bootstrap otherwise.
-#
-# Parameters:
-#  script:
-#    The un-rebased path to the Dart script.
-#
-#  args:
-#    The arguments to pass to the Dart script.
-
-#  packages (optional):
-#    The un-rebased path to the .packages file.
-#
-#  Forwarded to action() with the usual meaning:
-#    depfile
-#    deps
-#    inputs
-#    outputs
-#    visibility
-template("dart_action") {
-  assert(defined(invoker.script), "script must be defined for $target_name")
-  assert(defined(invoker.outputs), "outputs must be defined for $target_name")
-  assert(defined(invoker.args), "args must be defined for $target_name")
-  assert(!defined(invoker.sources),
-         "dart_action doesn't take a sources arg. Use inputs instead.")
-
-  if (prebuilt_dart_exe_works) {
-    action(target_name) {
-      forward_variables_from(invoker, [
-          "inputs",
-          "outputs",
-          "deps",
-          "visibility",
-          "depfile",
-      ])
-      script = "$_dart_root/build/gn_run_binary.py"
-      prebuilt_dart_binary =
-          "$_dart_root/tools/sdks/$host_os/dart-sdk/bin/dart$executable_suffix"
-
-      inputs += [ invoker.script ]
-      if (defined(invoker.packages)) {
-        inputs += [ invoker.packages ]
-      }
-
-      args = [
-        "compiled_action",
-        rebase_path(prebuilt_dart_binary),
-      ]
-      if (defined(invoker.packages)) {
-        args += [
-          "--packages=" + rebase_path(invoker.packages),
-        ]
-      }
-      args += [ rebase_path(invoker.script) ] + invoker.args
-    }
-  } else {
-    compiled_action(target_name) {
-      forward_variables_from(invoker, [
-          "inputs",
-          "outputs",
-          "deps",
-          "visibility",
-          "depfile",
-      ])
-
-      inputs += [ invoker.script ]
-      if (defined(invoker.packages)) {
-        inputs += [ invoker.packages ]
-      }
-
-      tool = "runtime/bin:dart_bootstrap"
-      args = []
-      if (defined(invoker.packages)) {
-        args += [
-          "--packages=" + rebase_path(invoker.packages),
-        ]
-      }
-      args += [ rebase_path(invoker.script) ] + invoker.args
-    }
-  }
-}
diff --git a/build/vs_toolchain.py b/build/vs_toolchain.py
index 7c6a772..bfb8215 100644
--- a/build/vs_toolchain.py
+++ b/build/vs_toolchain.py
@@ -86,8 +86,9 @@
     bitness = platform.architecture()[0]
     # When running 64-bit python the x64 DLLs will be in System32
     x64_path = 'System32' if bitness == '64bit' else 'Sysnative'
-    x64_path = os.path.join(r'C:\Windows', x64_path)
-    vs_runtime_dll_dirs = [x64_path, r'C:\Windows\SysWOW64']
+    system_root = os.environ['SystemRoot']
+    x64_path = os.path.join(system_root, x64_path)
+    vs_runtime_dll_dirs = [x64_path, os.path.join(system_root, r'SysWOW64')]
 
   return vs_runtime_dll_dirs
 
diff --git a/docs/language/.gitignore b/docs/language/.gitignore
index 01da07f..13c7614 100644
--- a/docs/language/.gitignore
+++ b/docs/language/.gitignore
@@ -1,5 +1,7 @@
-dartLangSpec.aux
-dartLangSpec.log
-dartLangSpec.out
-dartLangSpec.pdf
-dartLangSpec.toc
+dartLangSpec*.aux
+dartLangSpec*.log
+dartLangSpec*.out
+dartLangSpec*.pdf
+dartLangSpec*.toc
+*-hash.tex
+*-list.txt
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 2e76f4c..30d92e1 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -43,6 +43,8 @@
 % - Update mixin application forwarding constructors to correctly handle
 %   optional parameters and const constructors.
 % - Specify `call` for Dart 2 (no function type given to enclosing class).
+% - Clarify that an identifier reference denoting a top-level, static, or
+%   local function evaluates to the closurization of that declaration.
 %
 % 1.15
 % - Change how language specification describes control flow.
@@ -1128,11 +1130,11 @@
 }
 
 \rationale{
-It is up to the implementation to choose an appropriate representation for functions.
-For example, consider that a closure produced via property extraction treats equality different from ordinary closures, and is therefore likely a different class.
-Implementations may also use different classes for functions based on arity and or type.
+It is up to the implementation to choose an appropriate representation for function objects.
+For example, consider that a function object produced via property extraction treats equality differently from other function objects, and is therefore likely a different class.
+Implementations may also use different classes for function objects based on arity and or type.
 Arity may be implicitly affected by whether a function is an instance method (with an implicit receiver parameter) or not.
-The variations are manifold, and so this specification only guarantees that function objects are instances of some class that is considered to implement \FUNCTION{}.
+The variations are manifold, and so this specification only guarantees that function objects are instances of some class that implements \FUNCTION{}.
 }
 
 
@@ -3871,6 +3873,8 @@
 \LMLabel{functionExpressions}
 
 \LMHash{}
+%% TODO(eernst): A function literal is a syntactic construct, and we may use
+%% function closurization to obtain a corresponding function object.
 A {\em function literal} is an object that encapsulates an executable unit of code.
 
 \begin{grammar}
@@ -4915,6 +4919,45 @@
 $[A_1/X_1, \ldots, A_r/X_s]T_0$ of $F$.
 
 
+\subsection{Function Closurization}
+\LMLabel{functionClosurization}
+
+\LMHash{}
+Let $f$ be an expression denoting
+a declaration of a local function, a static method, or a top-level function
+(\ref{identifierReference})
+or let $f$ be a function literal
+(\ref{functionExpressions}).
+Evaluation of $f$ yields a function object
+which is the outcome of a {\em function closurization}
+applied to the declaration denoted by $f$
+respectively to the function literal $f$ considered as a function declaration.
+% Note that we do not promise that this will be a fresh function object,
+% such that constant expressions are covered as well, and others may be
+% identical even if not required, e.g., local functions with no free variables.
+{\em Closurization} denotes instance method closurization
+(\ref{ordinaryMemberClosurization})
+as well as function closurization,
+and it is also used as a shorthand for either of them when there is no ambiguity.
+
+\LMHash{}
+Function closurization applied to a function declaration $f$
+amounts to the creation of a function object $o$
+which is an instance of a class whose interface is a subtype of the actual type
+(\ref{actualTypeOfADeclaration})
+corresponding to the signature in the function declaration $f$,
+using the current bindings of type variables, if any.
+%
+An invocation of $o$ with a given argument list will bind actuals to formals
+in the same way as an invocation of $f$
+(\ref{bindingActualsToFormals}),
+and then execute the body of $f$
+in the captured scope amended with the bound parameter scope,
+yielding the same completion
+(\ref{completion})
+as the invocation of $f$ would have yielded.
+
+
 \subsection{Lookup}
 \LMLabel{lookup}
 
@@ -5380,16 +5423,19 @@
 \LMLabel{propertyExtraction}
 
 \LMHash{}
-{\em Property extraction} allows for a member or constructor to be accessed as a property rather than a function.
+{\em Property extraction} allows for a member to be accessed as a property rather than a function.
 A property extraction can be either:
 \begin{enumerate}
-\item A {\em closurization} which converts a method or constructor into a closure.
+\item An instance method closurization,
+which converts a method into a function object
+(\ref{ordinaryMemberClosurization}).
 Or
-\item A {\em getter invocation} which returns the result of invoking of a getter method.
+\item A getter invocation, which returns the result of invoking of a getter method
+(\ref{getterAccessAndMethodExtraction}).
 \end{enumerate}
 
 \commentary{
-Closures derived from members via closurization are colloquially known as tear-offs.
+Function objects derived via closurization are colloquially known as tear-offs.
 }
 
 Property extraction can be either {\em conditional} or {\em unconditional}.
@@ -5561,8 +5607,14 @@
 }
 
 \LMHash{}
+An {\em instance method closurization}
+is a closurization of some method on some object, defined below,
+or a super closurization (\ref{superClosurization}).
+
+\LMHash{}
 Let $o$ be an object, and let $u$ be a fresh final variable bound to $o$.
-The {\em closurization of method $f$ on object $o$} is defined to be equivalent to:
+The {\em closurization of method $f$ on object $o$} is defined to be equivalent
+(\commentary{except for equality, as noted below}) to:
 \begin{itemize}
 %\item $(a) \{\RETURN{}$ $u$ $op$ $a;$\} if $f$ is named $op$ and $op$ is one of \code{<, >, <=, >=, ==, -, +, /, \~{}/, *, \%, $|$, \^{}, \&, $<<$, $>>$} (this precludes closurization of unary -).
 %\item $() \{\RETURN{}$ \~{} $u;$\} if $f$ is named \~{}.
@@ -5638,8 +5690,13 @@
 If that parameter declaration has no type annotation then $T_j$ is \DYNAMIC{}.
 
 \LMHash{}
-There is one way in which the closurization differs from the function literal:
-\code{$o_1.m$ == $o_2.m$} is equal to \code{identical($o_1, o_2$)}.
+There is one way in which
+the function object yielded by the instance method closurization differs from
+the function object obtained by function closurization on the above mentioned function literal:
+Assume that $o_1$ and $o_2$ are objects, $m$ is an identifier,
+and $c_1$ and $c_2$ are function objects
+obtained by closurization of $m$ on $o_1$ respectively $o_2$.
+Then \code{$c_1$ == $c_2$} evaluates to true if and only if $o_1$ and $o_2$ is the same object.
 
 %\item The static type of the property extraction is the static type of function $T.m$, where $T$ is the static type of $e$, if $T.m$ is defined. Otherwise the static type of $e.m$ is \DYNAMIC{}.
 
@@ -5648,12 +5705,12 @@
 % and for the closurizations.
 In particular, two closurizations of a method $m$ from the same object are equal,
 and two closurizations of a method $m$ from non-identical objects are not equal.
-It also follows that \code{identical($o_1.m, o_2.m$)} must be false when $o_1$ and $o_2$ are not identical.
-However, Dart implementations are not required to canonicalize closures,
-which means that \code{identical($o_1.m, o_2.m$)} is not guaranteed to be true,
-even when it is known that $o_1$ and $o_2$ are identical.
+Assuming that $v_i$ is a fresh variable bound to an object, $i \in 1 .. 2$,
+it also follows that \code{identical($v_1.m, v_2.m$)} must be false when $v_1$ and $v_2$ are not bound to the same object.
+However, Dart implementations are not required to canonicalize function objects,
+which means that \code{identical($v_1.m, v_2.m$)} is not guaranteed to be true,
+even when it is known that $v_1$ and $v_2$ are bound to the same object.
 }
-% local functions that have a closure extracted are always different
 
 \rationale{
 The special treatment of equality in this case facilitates the use of extracted property functions in APIs where callbacks such as event listeners must often be registered and later unregistered.
@@ -5679,7 +5736,11 @@
 }
 
 \LMHash{}
-The {\em closurization of method $f$ with respect to $S$} is defined to be equivalent to:
+A {\em super closurization}
+is a closurization of a method with respect to a class, as defined next.
+The {\em closurization of the method $f$ with respect to the class $S$}
+is defined to be equivalent
+(\commentary{except for equality, as noted below}) to:
 
 \LMHash{}
 \begin{itemize}
@@ -5711,6 +5772,11 @@
 and optional positional parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
 \end{itemize}
 
+\commentary{
+Note that a super closurization is an {\em instance method closurization},
+as defined in (\ref{ordinaryMemberClosurization}).
+}
+
 \LMHash{}
 $B'_j, j \in 1 .. s$, are determined as follows:
 If $S$ is a non-generic class then $B'_j = B_j, j \in 1 .. s$.
@@ -5752,10 +5818,13 @@
 If that parameter declaration has no type annotation then $T_j$ is \DYNAMIC{}.
 
 \LMHash{}
-There is one way in which the closurization differs from the function literal:
-Assume that an occurrence of the expression \SUPER{}.$m$ in a given class is evaluated on two occasions where \THIS{} is $o_1$ respectively $o_2$,
-and the resulting closurization is $c_1$ respectively $c_2$:
-\code{$c_1$ == $c_2$} is then equal to \code{identical($o_1, o_2$)}.
+There is one way in which
+the function object yielded by the super closurization differs from
+the function object obtained by function closurization on the above mentioned function literal:
+Assume that an occurrence of the expression \SUPER{}.$m$ in a given class
+is evaluated on two occasions where \THIS{} is bound to $o_1$ respectively $o_2$,
+and the resulting function objects are $c_1$ respectively $c_2$:
+\code{$c_1$ == $c_2$} is then true if and only if $o_1$ and $o_2$ is the same object.
 
 
 \subsection{Assignment}
@@ -6121,8 +6190,8 @@
 If all of the following hold:
 \begin{itemize}
 \item $e_1$ shows that a variable $v$ has type $T$.
-\item $v$ is not potentially mutated in $e_2$ or within a closure.
-\item If the variable $v$ is accessed by a closure in $e_2$ then the variable $v$ is not potentially mutated anywhere in the scope of $v$.
+\item $v$ is not potentially mutated in $e_2$ or within a function.
+\item If the variable $v$ is accessed by a function in $e_2$ then the variable $v$ is not potentially mutated anywhere in the scope of $v$.
 \end{itemize}
 
 then the type of $v$ is known to be $T$ in $e_2$.
@@ -6186,15 +6255,15 @@
 \begin{itemize}
 \item Either $e_1$ shows that $v$ has type $T$ or $e_2$ shows that $v$ has type $T$.
 \item $v$ is a local variable or formal parameter.
-\item The variable $v$ is not mutated in $e_2$ or within a closure.
+\item The variable $v$ is not mutated in $e_2$ or within a function.
 \end{itemize}
 
 \LMHash{}
 Furthermore, if all of the following hold:
 \begin{itemize}
 \item $e_1$ shows that $v$ has type $T$.
-\item $v$ is not mutated in either $e_1$, $e_2$ or within a closure.
-\item If the variable $v$ is accessed by a closure in $e_2$ then the variable $v$ is not potentially mutated anywhere in the scope of $v$.
+\item $v$ is not mutated in either $e_1$, $e_2$ or within a function.
+\item If the variable $v$ is accessed by a function in $e_2$ then the variable $v$ is not potentially mutated anywhere in the scope of $v$.
 \end{itemize}
 then the type of $v$ is known to be $T$ in $e_2$.
 
@@ -6849,7 +6918,7 @@
 %  \end{itemize}
 \item If $d$ is a local variable or formal parameter then $e$ evaluates to the current binding of $id$.
 %\item If $d$ is a library variable, local variable, or formal parameter, then $e$ evaluates to the current binding of $id$. \commentary{This case also applies if d is a library or local function declaration, as these are equivalent to function-valued variable declarations.}
-\item If $d$ is a static method, top-level function or local function then $e$ evaluates to the function defined by $d$.
+\item If $d$ is a static method, top-level function or local function then $e$ evaluates to the function object obtained by closurization (\ref{functionClosurization}) of the declaration denoted by $d$.
 \item If $d$ is the declaration of a static variable, static getter or static setter declared in class $C$, then evaluation of $e$ is equivalent to evaluation of the property extraction (\ref{propertyExtraction}) $C.id$.
 \item If $d$ is the declaration of a library variable, top-level getter or top-level setter, then evaluation of $e$ is equivalent to evaluation of the top level getter invocation (\ref{topLevelGetterInvocation}) $id$.
 \item Otherwise, if $e$ occurs inside a top level or static function (be it function, method, getter, or setter) or variable initializer, evaluation of $e$ causes a \code{NoSuchMethod} to be thrown.
@@ -7155,7 +7224,7 @@
 
 \commentary{
 There is no way to write a pair of mutually recursive local functions, because one always has to come before the other is declared.
-These cases are quite rare, and can always be managed by defining a pair of variables first, then assigning them appropriate closures:
+These cases are quite rare, and can always be managed by defining a pair of variables first, then assigning them appropriate function literals:
 }
 
 \begin{dartCode}
@@ -7172,8 +7241,6 @@
 It therefore makes sense to harmonize the rules for local functions with those for functions in general rather than with the rules for local variables.
 }
 
-% elaborate on function identity and equality, run-time type. Likewsie in function expressions (closures) and declarations
-
 
 \subsection{If}
 \LMLabel{if}
@@ -7225,8 +7292,8 @@
 If:
 \begin{itemize}
 \item $b$ shows that a variable $v$ has type $T$.
-\item $v$ is not potentially mutated in $s_1$ or within a closure.
-\item If the variable $v$ is accessed by a closure in $s_1$ then the variable $v$ is not potentially mutated anywhere in the scope of $v$.
+\item $v$ is not potentially mutated in $s_1$ or within a function.
+\item If the variable $v$ is accessed by a function in $s_1$ then the variable $v$ is not potentially mutated anywhere in the scope of $v$.
 \end{itemize}
 then the type of $v$ is known to be $T$ in $s_1$.
 
@@ -7295,7 +7362,9 @@
 \end{enumerate}
 
 \rationale{
-The definition above is intended to prevent the common error where users create a closure inside a for loop, intending to close over the current binding of the loop variable, and find (usually after a painful process of debugging and learning) that all the created closures have captured the same value - the one current in the last iteration executed.
+The definition above is intended to prevent the common error where users create a function object inside a for loop,
+intending to close over the current binding of the loop variable,
+and find (usually after a painful process of debugging and learning) that all the created function objects have captured the same value---the one current in the last iteration executed.
 
 Instead, each iteration has its own distinct variable.
 The first iteration uses the variable created by the initial declaration.
diff --git a/docs/language/informal/nosuchmethod-forwarding.md b/docs/language/informal/nosuchmethod-forwarding.md
index 8feaf68..7365f8b 100644
--- a/docs/language/informal/nosuchmethod-forwarding.md
+++ b/docs/language/informal/nosuchmethod-forwarding.md
@@ -4,7 +4,7 @@
 
 **Status**: Under implementation.
 
-**Version**: 0.5 (2017-11-27)
+**Version**: 0.6 (2018-03-22)
 
 **This document** is an informal specification of the support in Dart 2 for
 invoking `noSuchMethod` in situations where an attempt is made to invoke a
@@ -294,9 +294,34 @@
 statically checked and dynamic invocations: Whenever an instance method is
 invoked, and no such method exists, `noSuchMethod` will be invoked.*
 
+*One special case to be aware of is where a forwarder is torn off and then
+invoked with an actual argument list which does not match the formal
+parameter list. In that situation we will get an invocation of
+`Object.noSuchMethod` rather than the `noSuchMethod` in the original
+receiver, because this is an invocation of a function object (and they do
+not override `noSuchMethod`):*
+
+```dart
+class A {
+  dynamic noSuchMethod(Invocation i) => null;
+  void foo();
+}
+
+main() {
+  A a = new A();
+  dynamic f = a.foo;
+  // Invokes `Object.noSuchMethod`, not `A.noSuchMethod`, so it throws.
+  f(42);
+}
+```
+
 
 ## Updates
 
+*   Mar 22nd 2018, version 0.6: Added example to illustrate the case where a
+    torn-off method invokes `Object.noSuchMethod`, not the one in the
+    receiver, because of a non-matching actual argument list.
+
 *   Nov 27th 2017, version 0.5: Changed terminology to use 'implicitly
     induced method implementations'. Helped achieving a major simplifaction
     of the dynamic semantics.
diff --git a/pkg/analysis_server/benchmark/perf/memory_tests.dart b/pkg/analysis_server/benchmark/perf/memory_tests.dart
index ea4b3ba..2d9e01e 100644
--- a/pkg/analysis_server/benchmark/perf/memory_tests.dart
+++ b/pkg/analysis_server/benchmark/perf/memory_tests.dart
@@ -77,6 +77,7 @@
     return startServer(
       servicesPort: vmServicePort,
       cfe: useCFE,
+      checked: false,
     ).then((_) {
       server.listenToOutput(dispatchNotification);
       server.exitCode.then((_) {
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index 23bda67..453a520 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -109,7 +109,7 @@
 <body>
 <h1>Analysis Server API Specification</h1>
 <h1 style="color:#999999">Version
-  1.20.1
+  1.20.2
 </h1>
 <p>
   This document contains a specification of the API provided by the
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 1e6b8d0..b838056 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -108,7 +108,7 @@
    * The version of the analysis server. The value should be replaced
    * automatically during the build.
    */
-  static final String VERSION = '1.20.1';
+  static final String VERSION = '1.20.2';
 
   /**
    * The options of this server instance.
@@ -1275,6 +1275,15 @@
                 analysisServer, path, result.lineInfo, unit);
           });
         }
+        // TODO:(dantup) Uncomment this and equivilent in
+        // test/analysis/notification_folding_test.dart once the
+        // implementation is complete.
+        // if (analysisServer._hasAnalysisServiceSubscription(
+        //     AnalysisService.FOLDING, path)) {
+        //   _runDelayed(() {
+        //     sendAnalysisNotificationFolding(analysisServer, path, unit);
+        //   });
+        // }
         if (analysisServer._hasAnalysisServiceSubscription(
             AnalysisService.OUTLINE, path)) {
           _runDelayed(() {
diff --git a/pkg/analysis_server/lib/src/computer/computer_folding.dart b/pkg/analysis_server/lib/src/computer/computer_folding.dart
new file mode 100644
index 0000000..19b0c0d
--- /dev/null
+++ b/pkg/analysis_server/lib/src/computer/computer_folding.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+
+/**
+ * A computer for [CompilationUnit] folding.
+ */
+class DartUnitFoldingComputer {
+  final CompilationUnit _unit;
+
+  Directive _firstDirective, _lastDirective;
+  final List<FoldingRegion> _foldingRegions = [];
+
+  DartUnitFoldingComputer(this._unit);
+
+  /**
+   * Returns a list of folding regions, not `null`.
+   */
+  List<FoldingRegion> compute() {
+    _unit.accept(new _DartUnitFoldingComputerVisitor(this));
+
+    if (_firstDirective != null &&
+        _lastDirective != null &&
+        _firstDirective != _lastDirective) {
+      _foldingRegions.add(new FoldingRegion(FoldingKind.DIRECTIVES,
+          _firstDirective.offset, _lastDirective.end - _firstDirective.offset));
+    }
+
+    return _foldingRegions;
+  }
+}
+
+/**
+ * An AST visitor for [DartUnitFoldingComputer].
+ */
+class _DartUnitFoldingComputerVisitor extends RecursiveAstVisitor<Object> {
+  final DartUnitFoldingComputer _computer;
+  _DartUnitFoldingComputerVisitor(this._computer);
+
+  @override
+  visitImportDirective(ImportDirective node) {
+    if (_computer._firstDirective == null) {
+      _computer._firstDirective = node;
+    }
+    _computer._lastDirective = node;
+    return super.visitImportDirective(node);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index 3516bbe..96432aa 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -365,6 +365,9 @@
    * test package.
    */
   bool isGroup(engine.ExecutableElement element) {
+    if (element != null && element.hasIsTestGroup) {
+      return true;
+    }
     return element is engine.FunctionElement &&
         element.name == 'group' &&
         _isInsideTestPackage(element);
@@ -375,6 +378,9 @@
    * test package.
    */
   bool isTest(engine.ExecutableElement element) {
+    if (element != null && element.hasIsTest) {
+      return true;
+    }
     return element is engine.FunctionElement &&
         element.name == 'test' &&
         _isInsideTestPackage(element);
@@ -424,9 +430,9 @@
     }
 
     void addOutlineNode(ElementKind kind, [List<Outline> children]) {
-      String kindName = kind == ElementKind.UNIT_TEST_GROUP ? 'group' : 'test';
-      String name = '$kindName("${extractString(
-          node.argumentList?.arguments)}")';
+      String executableName = nameNode.name;
+      String description = extractString(node.argumentList?.arguments);
+      String name = '$executableName("$description")';
       Element element = new Element(kind, name, 0,
           location: outlineComputer._getLocationNode(nameNode));
       contents.add(new Outline(
diff --git a/pkg/analysis_server/lib/src/computer/computer_overrides.dart b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
index 5d53fd7..aeefe45 100644
--- a/pkg/analysis_server/lib/src/computer/computer_overrides.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
@@ -160,7 +160,7 @@
    */
   OverriddenElements find() {
     _visited.clear();
-    _addSuperOverrides(_class.supertype);
+    _addSuperOverrides(_class.type, withThisType: false);
     _visited.clear();
     _addInterfaceOverrides(_class.type, false);
     _superElements.forEach(_interfaceElements.remove);
@@ -189,20 +189,23 @@
     _addInterfaceOverrides(type.superclass, checkType);
   }
 
-  void _addSuperOverrides(InterfaceType type) {
+  void _addSuperOverrides(InterfaceType type, {bool withThisType: true}) {
     if (type == null) {
       return;
     }
     if (!_visited.add(type)) {
       return;
     }
-    // this type
-    Element element = _lookupMember(type.element);
-    if (element != null && !_superElements.contains(element)) {
-      _superElements.add(element);
+
+    if (withThisType) {
+      Element element = _lookupMember(type.element);
+      if (element != null && !_superElements.contains(element)) {
+        _superElements.add(element);
+      }
     }
-    // super
+
     _addSuperOverrides(type.superclass);
+    type.mixins.forEach(_addSuperOverrides);
   }
 
   Element _lookupMember(ClassElement classElement) {
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index 3a9fbc2..c08b148 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -6,6 +6,7 @@
 
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/computer/computer_closingLabels.dart';
+import 'package:analysis_server/src/computer/computer_folding.dart';
 import 'package:analysis_server/src/computer/computer_highlights.dart';
 import 'package:analysis_server/src/computer/computer_highlights2.dart';
 import 'package:analysis_server/src/computer/computer_outline.dart';
@@ -80,6 +81,15 @@
   });
 }
 
+void sendAnalysisNotificationFolding(
+    AnalysisServer server, String file, CompilationUnit dartUnit) {
+  _sendNotification(server, () {
+    var regions = new DartUnitFoldingComputer(dartUnit).compute();
+    var params = new protocol.AnalysisFoldingParams(file, regions);
+    server.sendNotification(params.toNotification());
+  });
+}
+
 void sendAnalysisNotificationFlushResults(
     AnalysisServer server, List<String> files) {
   _sendNotification(server, () {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
index 4d30f30..2914658 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
@@ -32,7 +32,9 @@
         LibraryElementSuggestionBuilder builder =
             new LibraryElementSuggestionBuilder(request.libraryElement,
                 CompletionSuggestionKind.IDENTIFIER, false, false);
-        library.visitChildren(builder);
+        for (var element in library.exportNamespace.definedNames.values) {
+          element.accept(builder);
+        }
         return builder.suggestions;
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
index 078959a..b7afbbe 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
@@ -57,7 +57,9 @@
           LibraryElementSuggestionBuilder builder =
               new LibraryElementSuggestionBuilder(containingLibrary,
                   CompletionSuggestionKind.INVOCATION, typesOnly, instCreation);
-          library.visitChildren(builder);
+          for (var element in importElem.namespace.definedNames.values) {
+            element.accept(builder);
+          }
           suggestions.addAll(builder.suggestions);
 
           // If the import is 'deferred' then suggest 'loadLibrary'
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index 909345c..7c88a82 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -211,21 +211,15 @@
 }
 
 /**
- * This class visits elements in a library and provides suggestions based upon
- * the visible members in that library.
+ * This class creates suggestions based upon top-level elements.
  */
-class LibraryElementSuggestionBuilder extends GeneralizingElementVisitor
+class LibraryElementSuggestionBuilder extends SimpleElementVisitor
     with ElementSuggestionBuilder {
   final LibraryElement containingLibrary;
   final CompletionSuggestionKind kind;
   final bool typesOnly;
   final bool instCreation;
 
-  /**
-   * The set of libraries that have been, or are currently being, visited.
-   */
-  final Set<LibraryElement> visitedLibraries = new Set<LibraryElement>();
-
   LibraryElementSuggestionBuilder(
       this.containingLibrary, this.kind, this.typesOnly, this.instCreation);
 
@@ -239,17 +233,6 @@
   }
 
   @override
-  visitCompilationUnitElement(CompilationUnitElement element) {
-    element.visitChildren(this);
-    LibraryElement containingLibrary = element.library;
-    if (containingLibrary != null) {
-      for (var lib in containingLibrary.exportedLibraries) {
-        lib.accept(this);
-      }
-    }
-  }
-
-  @override
   visitConstructorElement(ConstructorElement element) {
     if (instCreation) {
       ClassElement classElem = element.enclosingElement;
@@ -263,11 +246,6 @@
   }
 
   @override
-  visitElement(Element element) {
-    // ignored
-  }
-
-  @override
   visitFunctionElement(FunctionElement element) {
     if (!typesOnly) {
       int relevance = element.library == containingLibrary
@@ -285,19 +263,13 @@
   }
 
   @override
-  visitLibraryElement(LibraryElement element) {
-    if (visitedLibraries.add(element)) {
-      element.visitChildren(this);
-    }
-  }
-
-  @override
-  visitTopLevelVariableElement(TopLevelVariableElement element) {
+  visitPropertyAccessorElement(PropertyAccessorElement element) {
     if (!typesOnly) {
-      int relevance = element.library == containingLibrary
+      PropertyInducingElement variable = element.variable;
+      int relevance = variable.library == containingLibrary
           ? DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE
           : DART_RELEVANCE_DEFAULT;
-      addSuggestion(element, relevance: relevance);
+      addSuggestion(variable, relevance: relevance);
     }
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
index 2277f99..3c7bdd83 100644
--- a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
@@ -804,6 +804,9 @@
       if (_isSyntheticExpression(statement.condition)) {
         exitPosition = _newPosition(statement.leftParenthesis.offset + 1);
         sb = new SourceBuilder(file, statement.rightParenthesis.offset + 1);
+      } else if (statement.rightParenthesis.isSynthetic) {
+        sb = new SourceBuilder(file, statement.condition.end);
+        sb.append(')');
       } else {
         int afterParen = statement.rightParenthesis.offset + 1;
         if (utils
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 3ba57d8..cdcdc36 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -98,6 +98,8 @@
       'ADD_MISSING_PARAMETER_POSITIONAL',
       31,
       "Add optional positional parameter");
+  static const ADD_MISSING_PARAMETER_NAMED = const FixKind(
+      'ADD_MISSING_PARAMETER_NAMED', 30, "Add named parameter '{0}'");
   static const ADD_MISSING_PARAMETER_REQUIRED = const FixKind(
       'ADD_MISSING_PARAMETER_REQUIRED', 30, "Add required parameter");
   static const ADD_MISSING_REQUIRED_ARGUMENT = const FixKind(
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 580e541..79b6f55 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -361,6 +361,9 @@
       await _addFix_importLibrary_withTopLevelVariable();
       await _addFix_createLocalVariable();
     }
+    if (errorCode == StaticWarningCode.UNDEFINED_NAMED_PARAMETER) {
+      await _addFix_addMissingNamedArgument();
+    }
     if (errorCode == StaticTypeWarningCode.UNDEFINED_METHOD_WITH_CONSTRUCTOR) {
       await _addFix_undefinedMethodWithContructor();
     }
@@ -608,6 +611,60 @@
     }
   }
 
+  Future<Null> _addFix_addMissingNamedArgument() async {
+    // Prepare the name of the missing parameter.
+    if (this.node is! SimpleIdentifier) {
+      return;
+    }
+    SimpleIdentifier node = this.node;
+    String name = node.name;
+
+    // We expect that the node is part of a NamedExpression.
+    if (node.parent?.parent is! NamedExpression) {
+      return;
+    }
+    NamedExpression namedExpression = node.parent.parent;
+
+    // We should be in an ArgumentList.
+    if (namedExpression.parent is! ArgumentList) {
+      return;
+    }
+    AstNode argumentList = namedExpression.parent;
+
+    // Prepare the invoked element.
+    var context =
+        new _ExecutableParameters(session, astProvider, argumentList.parent);
+    if (context == null) {
+      return;
+    }
+
+    // We cannot add named parameters when there are positional positional.
+    if (context.optionalPositional.isNotEmpty) {
+      return;
+    }
+
+    Future<void> addParameter(int offset, String prefix, String suffix) async {
+      if (offset != null) {
+        DartChangeBuilder changeBuilder = await context.addParameter(
+            offset, prefix, namedExpression.staticType, name, suffix);
+        _addFixFromBuilder(
+            changeBuilder, DartFixKind.ADD_MISSING_PARAMETER_NAMED,
+            args: [name]);
+      }
+    }
+
+    if (context.named.isNotEmpty) {
+      var prevNode = await context.getParameterNode(context.named.last);
+      await addParameter(prevNode?.end, ', ', '');
+    } else if (context.required.isNotEmpty) {
+      var prevNode = await context.getParameterNode(context.required.last);
+      await addParameter(prevNode?.end, ', {', '}');
+    } else {
+      var parameterList = await context.getParameterList();
+      await addParameter(parameterList?.leftParenthesis?.end, '{', '}');
+    }
+  }
+
   Future<Null> _addFix_addMissingParameter() async {
     if (node is ArgumentList && node.parent is MethodInvocation) {
       ArgumentList argumentList = node;
@@ -2198,10 +2255,10 @@
       if (list.variables.length == 1) {
         DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-          if (list.type == null && list.keyword.keyword == Keyword.VAR) {
+          if (list.keyword == null) {
+            builder.addSimpleInsertion(list.offset, 'final ');
+          } else if (list.keyword.keyword == Keyword.VAR) {
             builder.addSimpleReplacement(range.token(list.keyword), 'final');
-          } else if (list.type != null && list.keyword == null) {
-            builder.addSimpleInsertion(list.type.offset, 'final ');
           }
         });
         _addFixFromBuilder(changeBuilder, DartFixKind.MAKE_FINAL);
@@ -3729,3 +3786,91 @@
     }
   }
 }
+
+/**
+ * [ExecutableElement], its parameters, and operations on them.
+ */
+class _ExecutableParameters {
+  final AnalysisSession session;
+  final AstProvider astProvider;
+  final ExecutableElement executable;
+
+  final List<ParameterElement> required = [];
+  final List<ParameterElement> optionalPositional = [];
+  final List<ParameterElement> named = [];
+
+  factory _ExecutableParameters(
+      AnalysisSession session, AstProvider astProvider, AstNode invocation) {
+    Element element;
+    if (invocation is InstanceCreationExpression) {
+      element = invocation.staticElement;
+    }
+    if (invocation is MethodInvocation) {
+      element = invocation.methodName.staticElement;
+    }
+    if (element is ExecutableElement) {
+      return new _ExecutableParameters._(session, astProvider, element);
+    } else {
+      return null;
+    }
+  }
+
+  _ExecutableParameters._(this.session, this.astProvider, this.executable) {
+    for (var parameter in executable.parameters) {
+      if (parameter.isNotOptional) {
+        required.add(parameter);
+      } else if (parameter.isOptionalPositional) {
+        optionalPositional.add(parameter);
+      } else if (parameter.isNamed) {
+        named.add(parameter);
+      }
+    }
+  }
+
+  /**
+   * Write the code for a new parameter with the given [type] and [name].
+   */
+  Future<DartChangeBuilder> addParameter(int offset, String prefix,
+      DartType type, String name, String suffix) async {
+    String targetFile = executable.source.fullName;
+    var changeBuilder = new DartChangeBuilder(session);
+    await changeBuilder.addFileEdit(targetFile, (builder) {
+      builder.addInsertion(offset, (builder) {
+        builder.write(prefix);
+        builder.writeParameter(name, type: type);
+        builder.write(suffix);
+      });
+    });
+    return changeBuilder;
+  }
+
+  /**
+   * Return the [FormalParameterList] of the [executable], or `null` is cannot
+   * be found.
+   */
+  Future<FormalParameterList> getParameterList() async {
+    var name = await astProvider.getParsedNameForElement(executable);
+    AstNode targetDeclaration = name?.parent;
+    if (targetDeclaration is FunctionDeclaration) {
+      FunctionExpression function = targetDeclaration.functionExpression;
+      return function.parameters;
+    } else if (targetDeclaration is MethodDeclaration) {
+      return targetDeclaration.parameters;
+    }
+    return null;
+  }
+
+  /**
+   * Return the [FormalParameter] of the [element] in [FormalParameterList],
+   * or `null` is cannot be found.
+   */
+  Future<FormalParameter> getParameterNode(ParameterElement element) async {
+    var name = await astProvider.getParsedNameForElement(element);
+    for (AstNode node = name; node != null; node = node.parent) {
+      if (node is FormalParameter && node.parent is FormalParameterList) {
+        return node;
+      }
+    }
+    return null;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/namespace.dart b/pkg/analysis_server/lib/src/services/correction/namespace.dart
index fc0d748..1419922 100644
--- a/pkg/analysis_server/lib/src/services/correction/namespace.dart
+++ b/pkg/analysis_server/lib/src/services/correction/namespace.dart
@@ -114,8 +114,7 @@
     if (importElementsMap.containsKey(importElement)) {
       continue;
     }
-    Namespace namespace =
-        new NamespaceBuilder().createImportNamespaceForDirective(importElement);
+    Namespace namespace = importElement.namespace;
     Set<Element> elements = new Set.from(namespace.definedNames.values);
     importElementsMap[importElement] = elements;
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index 5281867..5878f8c 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -16,7 +16,6 @@
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     show SourceChange, SourceEdit;
@@ -342,9 +341,7 @@
  * Returns the namespace of the given [ImportElement].
  */
 Map<String, Element> getImportNamespace(ImportElement imp) {
-  NamespaceBuilder builder = new NamespaceBuilder();
-  Namespace namespace = builder.createImportNamespaceForDirective(imp);
-  return namespace.definedNames;
+  return imp.namespace.definedNames;
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
index 9d52193..d304a1c 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
@@ -41,6 +41,7 @@
   ClassElement classStatefulWidget;
   ClassElement classStatelessWidget;
   ClassElement classWidget;
+  PropertyAccessorElement accessorRequired;
 
   @override
   String name;
@@ -200,12 +201,22 @@
       return element;
     }
 
+    Future<PropertyAccessorElement> getAccessor(String uri, String name) async {
+      var element = await sessionHelper.getTopLevelPropertyAccessor(uri, name);
+      if (element == null) {
+        result.addFatalError("Unable to find 'required' in $uri");
+      }
+      return element;
+    }
+
     classBuildContext = await getClass('BuildContext');
     classKey = await getClass('Key');
     classStatelessWidget = await getClass('StatelessWidget');
     classStatefulWidget = await getClass('StatefulWidget');
     classWidget = await getClass('Widget');
 
+    accessorRequired = await getAccessor('package:meta/meta.dart', 'required');
+
     return result;
   }
 
@@ -309,6 +320,38 @@
         name,
         superclass: classStatelessWidget.type,
         membersWriter: () {
+          // Add the constructor.
+          builder.write('  ');
+          builder.writeConstructorDeclaration(
+            name,
+            isConst: true,
+            parameterWriter: () {
+              builder.writeln('{');
+
+              // Add the required `key` parameter.
+              builder.write('    ');
+              builder.writeParameter('key', type: classKey.type);
+              builder.writeln(',');
+
+              // Add parameters for fields, local, and method parameters.
+              for (int i = 0; i < _parameters.length; i++) {
+                builder.write('    ');
+                builder.write('@');
+                builder.writeReference(accessorRequired);
+                builder.write(' this.');
+                builder.write(_parameters[i].name);
+                builder.writeln(',');
+              }
+
+              builder.write('  }');
+            },
+            initializerWriter: () {
+              builder.write('super(key: key)');
+            },
+          );
+          builder.writeln();
+          builder.writeln();
+
           // Add the fields for the parameters.
           if (_parameters.isNotEmpty) {
             for (var parameter in _parameters) {
@@ -320,32 +363,6 @@
             builder.writeln();
           }
 
-          // Add the constructor.
-          builder.write('  ');
-          builder.writeConstructorDeclaration(
-            name,
-            parameterWriter: () {
-              builder.write('{');
-
-              // Add the required `key` parameter.
-              builder.writeParameter('key', type: classKey.type);
-
-              // Add parameters for fields, local, and method parameters.
-              for (int i = 0; i < _parameters.length; i++) {
-                builder.write(', ');
-                builder.write('this.');
-                builder.write(_parameters[i].name);
-              }
-
-              builder.write('}');
-            },
-            initializerWriter: () {
-              builder.write('super(key: key)');
-            },
-          );
-          builder.writeln();
-          builder.writeln();
-
           // Widget build(BuildContext context) { ... }
           builder.writeln('  @override');
           builder.write('  ');
diff --git a/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
index 7691fbb..0e5e556 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
@@ -27,7 +27,7 @@
   if (name != null && name.isEmpty) {
     return new RefactoringStatus();
   }
-  return _validateLowerCamelCase(name, "Constructor");
+  return _validateLowerCamelCase(name, "Constructor", allowBuiltIn: true);
 }
 
 /**
@@ -37,7 +37,7 @@
  *   FATAL if the name is illegal.
  */
 RefactoringStatus validateFieldName(String name) {
-  return _validateLowerCamelCase(name, "Field");
+  return _validateLowerCamelCase(name, "Field", allowBuiltIn: true);
 }
 
 /**
@@ -47,7 +47,7 @@
  *   FATAL if the name is illegal.
  */
 RefactoringStatus validateFunctionName(String name) {
-  return _validateLowerCamelCase(name, "Function");
+  return _validateLowerCamelCase(name, "Function", allowBuiltIn: true);
 }
 
 /**
@@ -80,7 +80,7 @@
  *   FATAL if the name is illegal.
  */
 RefactoringStatus validateLabelName(String name) {
-  return _validateLowerCamelCase(name, "Label");
+  return _validateLowerCamelCase(name, "Label", allowBuiltIn: true);
 }
 
 /**
@@ -127,7 +127,7 @@
  *   FATAL if the name is illegal.
  */
 RefactoringStatus validateMethodName(String name) {
-  return _validateLowerCamelCase(name, "Method");
+  return _validateLowerCamelCase(name, "Method", allowBuiltIn: true);
 }
 
 /**
@@ -137,7 +137,7 @@
  *   FATAL if the name is illegal.
  */
 RefactoringStatus validateParameterName(String name) {
-  return _validateLowerCamelCase(name, "Parameter");
+  return _validateLowerCamelCase(name, "Parameter", allowBuiltIn: true);
 }
 
 /**
@@ -147,11 +147,12 @@
  *   FATAL if the name is illegal.
  */
 RefactoringStatus validateVariableName(String name) {
-  return _validateLowerCamelCase(name, "Variable");
+  return _validateLowerCamelCase(name, "Variable", allowBuiltIn: true);
 }
 
 RefactoringStatus _validateIdentifier(
-    String identifier, String desc, String beginDesc) {
+    String identifier, String desc, String beginDesc,
+    {bool allowBuiltIn: false}) {
   // has leading/trailing spaces
   String trimmed = identifier.trim();
   if (identifier != trimmed) {
@@ -168,8 +169,13 @@
   {
     Keyword keyword = Keyword.keywords[identifier];
     if (keyword != null) {
-      String message = "$desc must not be a keyword.";
-      return new RefactoringStatus.fatal(message);
+      if (keyword.isBuiltInOrPseudo && allowBuiltIn) {
+        String message = "Avoid using built-in identifiers as names.";
+        return new RefactoringStatus.warning(message);
+      } else {
+        String message = "$desc must not be a keyword.";
+        return new RefactoringStatus.fatal(message);
+      }
     }
   }
   // first character
@@ -198,7 +204,8 @@
 /**
  * Validates [identifier], should be lower camel case.
  */
-RefactoringStatus _validateLowerCamelCase(String identifier, String desc) {
+RefactoringStatus _validateLowerCamelCase(String identifier, String desc,
+    {bool allowBuiltIn: false}) {
   desc += ' name';
   // null
   if (identifier == null) {
@@ -206,8 +213,9 @@
     return new RefactoringStatus.fatal(message);
   }
   // is not identifier
-  RefactoringStatus status =
-      _validateIdentifier(identifier, desc, "a lowercase letter or underscore");
+  RefactoringStatus status = _validateIdentifier(
+      identifier, desc, "a lowercase letter or underscore",
+      allowBuiltIn: allowBuiltIn);
   if (!status.isOK) {
     return status;
   }
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index dccf6a6..3ee2c09 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -61,6 +61,7 @@
   bool get previewDart2 => driver.analysisOptions.previewDart2;
 
   void addFlutterPackage() {
+    addMetaPackageSource();
     Folder libFolder = configureFlutterPackage(resourceProvider);
     packageMap['flutter'] = [libFolder];
   }
@@ -68,12 +69,24 @@
   Source addMetaPackageSource() => addPackageSource('meta', 'meta.dart', r'''
 library meta;
 
+const _IsTest isTest = const _IsTest();
+
+const _IsTestGroup isTestGroup = const _IsTestGroup();
+
 const Required required = const Required();
 
 class Required {
   final String reason;
   const Required([this.reason]);
 }
+
+class _IsTest {
+  const _IsTest();
+}
+
+class _IsTestGroup {
+  const _IsTestGroup();
+}
 ''');
 
   Source addPackageSource(String packageName, String filePath, String content) {
diff --git a/pkg/analysis_server/test/analysis/notification_folding_test.dart b/pkg/analysis_server/test/analysis/notification_folding_test.dart
new file mode 100644
index 0000000..51a400b
--- /dev/null
+++ b/pkg/analysis_server/test/analysis/notification_folding_test.dart
@@ -0,0 +1,100 @@
+// 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:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_constants.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../analysis_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    // TODO(dantup): Uncomment once implementation is complete.
+    // Cannot just mark the tests as @failingTest as they time out
+    // (no FOLDING notification ever) and failingTest doesn't seem
+    // to cover that.
+    // defineReflectiveTests(_AnalysisNotificationFoldingTest);
+  });
+}
+
+@reflectiveTest
+class _AnalysisNotificationFoldingTest extends AbstractAnalysisTest {
+  static const sampleCode = '''
+import 'dart:async';
+import 'dart:core';
+
+main async() {}
+''';
+
+  static final expectedResults = [
+    new FoldingRegion(FoldingKind.DIRECTIVES, 0, 40)
+  ];
+
+  List<FoldingRegion> lastRegions;
+
+  Completer _regionsReceived;
+
+  void processNotification(Notification notification) {
+    if (notification.event == ANALYSIS_NOTIFICATION_FOLDING) {
+      var params = new AnalysisFoldingParams.fromNotification(notification);
+      if (params.file == testFile) {
+        lastRegions = params.regions;
+        _regionsReceived.complete(null);
+      }
+    } else if (notification.event == SERVER_NOTIFICATION_ERROR) {
+      var params = new ServerErrorParams.fromNotification(notification);
+      throw "${params.message}\n${params.stackTrace}";
+    }
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    createProject();
+  }
+
+  void subscribeForFolding() {
+    addAnalysisSubscription(AnalysisService.FOLDING, testFile);
+  }
+
+  test_afterAnalysis() async {
+    addTestFile(sampleCode);
+    await waitForTasksFinished();
+    expect(lastRegions, isNull);
+
+    await waitForFolding(() => subscribeForFolding());
+
+    expect(lastRegions, expectedResults);
+  }
+
+  test_afterUpdate() async {
+    addTestFile('');
+    // Currently required to get notifications on updates
+    setPriorityFiles([testFile]);
+
+    // Before subscribing, we shouldn't have had any folding regions.
+    await waitForTasksFinished();
+    expect(lastRegions, isNull);
+
+    // With no content, there should be zero regions.
+    await waitForFolding(() => subscribeForFolding());
+    expect(lastRegions, hasLength(0));
+
+    // With sample code there will be folding regions.
+    await waitForFolding(() => modifyTestFile(sampleCode));
+
+    expect(lastRegions, expectedResults);
+  }
+
+  Future waitForFolding(action()) {
+    _regionsReceived = new Completer();
+    action();
+    return _regionsReceived.future;
+  }
+}
diff --git a/pkg/analysis_server/test/analysis/notification_overrides_test.dart b/pkg/analysis_server/test/analysis/notification_overrides_test.dart
index 774062e..5acb1d5 100644
--- a/pkg/analysis_server/test/analysis/notification_overrides_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_overrides_test.dart
@@ -405,6 +405,55 @@
     expect(override.interfaceMembers, isNull);
   }
 
+  test_mixin_method_direct() async {
+    addTestFile('''
+class A {
+  m() {} // in A
+}
+class B extends Object with A {
+  m() {} // in B
+}
+''');
+    await prepareOverrides();
+    assertHasOverride('m() {} // in B');
+    assertHasSuperElement('m() {} // in A');
+    assertNoInterfaceMembers();
+  }
+
+  test_mixin_method_indirect() async {
+    addTestFile('''
+class A {
+  m() {} // in A
+}
+class B extends A {
+}
+class C extends Object with B {
+  m() {} // in C
+}
+''');
+    await prepareOverrides();
+    assertHasOverride('m() {} // in C');
+    assertHasSuperElement('m() {} // in A');
+    assertNoInterfaceMembers();
+  }
+
+  test_mixin_method_indirect2() async {
+    addTestFile('''
+class A {
+  m() {} // in A
+}
+class B extends Object with A {
+}
+class C extends B {
+  m() {} // in C
+}
+''');
+    await prepareOverrides();
+    assertHasOverride('m() {} // in C');
+    assertHasSuperElement('m() {} // in A');
+    assertNoInterfaceMembers();
+  }
+
   test_staticMembers() async {
     addTestFile('''
 class A {
diff --git a/pkg/analysis_server/test/analysis/test_all.dart b/pkg/analysis_server/test/analysis/test_all.dart
index 76e1f5b..fa72b86 100644
--- a/pkg/analysis_server/test/analysis/test_all.dart
+++ b/pkg/analysis_server/test/analysis/test_all.dart
@@ -13,6 +13,7 @@
     as notification_analyzedFiles_test;
 import 'notification_closingLabels_test.dart'
     as notification_closingLabels_test;
+import 'notification_folding_test.dart' as notification_folding_test;
 import 'notification_errors_test.dart' as notification_errors_test;
 import 'notification_highlights_test.dart' as notification_highlights_test;
 import 'notification_highlights_test2.dart' as notification_highlights_test2;
@@ -36,6 +37,7 @@
     notification_analysis_options_test.main();
     notification_analyzedFiles_test.main();
     notification_closingLabels_test.main();
+    notification_folding_test.main();
     notification_errors_test.main();
     notification_highlights_test.main();
     notification_highlights_test2.main();
diff --git a/pkg/analysis_server/test/completion_test.dart b/pkg/analysis_server/test/completion_test.dart
index 4a2270c..1e1aec8 100644
--- a/pkg/analysis_server/test/completion_test.dart
+++ b/pkg/analysis_server/test/completion_test.dart
@@ -1606,25 +1606,17 @@
         extraFiles: sources,
         failingTests: '1');
 
-    buildTests(
-        'test_importPrefix_hideCombinator',
-        '''
+    buildTests('test_importPrefix_hideCombinator', '''
 import 'dart:math' as math hide PI;
 main() {
   math.!1
-}''',
-        <String>["1-PI", "1+LN10"],
-        failingTests: '1');
+}''', <String>["1-PI", "1+LN10"]);
 
-    buildTests(
-        'test_importPrefix_showCombinator',
-        '''
+    buildTests('test_importPrefix_showCombinator', '''
 import 'dart:math' as math show PI;
 main() {
   math.!1
-}''',
-        <String>["1+PI", "1-LN10"],
-        failingTests: '1');
+}''', <String>["1+PI", "1-LN10"]);
 
     sources.clear();
     sources["/lib.dart"] = '''
diff --git a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
index 2aa2825..ac4c454 100644
--- a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
@@ -123,6 +123,24 @@
     assertNotSuggested('Object');
   }
 
+  test_Combinator_show_export_withShow() async {
+    addSource('/a.dart', r'''
+class A {}
+class B {}
+''');
+    addSource('/b.dart', r'''
+export 'a.dart' show A;
+''');
+    addTestSource(r'''
+import 'b.dart' show ^;
+''');
+    await computeSuggestions();
+    assertSuggestClass('A',
+        relevance: DART_RELEVANCE_DEFAULT,
+        kind: CompletionSuggestionKind.IDENTIFIER);
+    assertNotSuggested('B');
+  }
+
   test_Combinator_show_PI() async {
     addTestSource('import "dart:math" show ^;');
     await computeSuggestions();
diff --git a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
index 9679580..3f3f9fc 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
@@ -142,6 +142,41 @@
     assertNotSuggested('==');
   }
 
+  test_PrefixedIdentifier_library_export_withShow() async {
+    addSource('/a.dart', r'''
+class A {}
+class B {}
+''');
+    addSource('/b.dart', r'''
+export 'a.dart' show A;
+''');
+    addTestSource(r'''
+import 'b.dart' as p;
+main() {
+  p.^
+}
+''');
+    await computeSuggestions();
+    assertSuggestClass('A');
+    assertNotSuggested('B');
+  }
+
+  test_PrefixedIdentifier_library_import_withShow() async {
+    addSource('/a.dart', r'''
+class A {}
+class B {}
+''');
+    addTestSource(r'''
+import 'a.dart' as p show A;
+main() {
+  p.^
+}
+''');
+    await computeSuggestions();
+    assertSuggestClass('A');
+    assertNotSuggested('B');
+  }
+
   test_PrefixedIdentifier_library_inPart() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
     var libFile = '${testFile.substring(0, testFile.length - 5)}A.dart';
diff --git a/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart b/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
index c3ddced..07a231e 100644
--- a/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
+++ b/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
@@ -1235,6 +1235,27 @@
         (s) => _after(s, '    '));
   }
 
+  test_withCondition_noRightParenthesis() async {
+    await _prepareCompletion(
+        'if (true',
+        '''
+main() {
+  if (true
+}
+''',
+        atEnd: true);
+    _assertHasChange(
+        'Complete if-statement',
+        '''
+main() {
+  if (true) {
+    ////
+  }
+}
+''',
+        (s) => _after(s, '    '));
+  }
+
   test_withElse() async {
     await _prepareCompletion(
         'else',
diff --git a/pkg/analysis_server/test/services/correction/assist_test.dart b/pkg/analysis_server/test/services/correction/assist_test.dart
index 72e36b6..0cc4f57 100644
--- a/pkg/analysis_server/test/services/correction/assist_test.dart
+++ b/pkg/analysis_server/test/services/correction/assist_test.dart
@@ -3880,7 +3880,7 @@
   main() {
   var obj;
 // start
-    return new Row(children: [/*caret*/ new Transform()]);
+    return new Row(children: [/*caret*/ new Container()]);
 // end
   }
 }
@@ -3898,9 +3898,9 @@
     child: new Row(
 // start
       children: [/*caret*/
-        new Transform(),
-        new Transform(),
-        new AspectRatio(),
+        new Text('111'),
+        new Text('222'),
+        new Container(),
       ],
 // end
     ),
@@ -3917,9 +3917,9 @@
       children: [
         new widget(
           children: [/*caret*/
-            new Transform(),
-            new Transform(),
-            new AspectRatio(),
+            new Text('111'),
+            new Text('222'),
+            new Container(),
           ],
         ),
       ],
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index 426ff09..0f0bb9c 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -825,6 +825,120 @@
 ''');
   }
 
+  test_addMissingParameterNamed_function_hasNamed() async {
+    await resolveTestUnit('''
+test(int a, {int b: 0}) {}
+
+main() {
+  test(1, b: 2, named: 3.0);
+}
+''');
+    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
+test(int a, {int b: 0, double named}) {}
+
+main() {
+  test(1, b: 2, named: 3.0);
+}
+''');
+  }
+
+  test_addMissingParameterNamed_function_hasRequired() async {
+    await resolveTestUnit('''
+test(int a) {}
+
+main() {
+  test(1, named: 2.0);
+}
+''');
+    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
+test(int a, {double named}) {}
+
+main() {
+  test(1, named: 2.0);
+}
+''');
+  }
+
+  test_addMissingParameterNamed_function_noParameters() async {
+    await resolveTestUnit('''
+test() {}
+
+main() {
+  test(named: 42);
+}
+''');
+    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
+test({int named}) {}
+
+main() {
+  test(named: 42);
+}
+''');
+  }
+
+  test_addMissingParameterNamed_method_hasNamed() async {
+    await resolveTestUnit('''
+class A {
+  test(int a, {int b: 0}) {}
+
+  main() {
+    test(1, b: 2, named: 3.0);
+  }
+}
+''');
+    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
+class A {
+  test(int a, {int b: 0, double named}) {}
+
+  main() {
+    test(1, b: 2, named: 3.0);
+  }
+}
+''');
+  }
+
+  test_addMissingParameterNamed_method_hasRequired() async {
+    await resolveTestUnit('''
+class A {
+  test(int a) {}
+
+  main() {
+    test(1, named: 2.0);
+  }
+}
+''');
+    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
+class A {
+  test(int a, {double named}) {}
+
+  main() {
+    test(1, named: 2.0);
+  }
+}
+''');
+  }
+
+  test_addMissingParameterNamed_method_noParameters() async {
+    await resolveTestUnit('''
+class A {
+  test() {}
+
+  main() {
+    test(named: 42);
+  }
+}
+''');
+    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
+class A {
+  test({int named}) {}
+
+  main() {
+    test(named: 42);
+  }
+}
+''');
+  }
+
   test_addMissingRequiredArg_cons_flutter_children() async {
     addFlutterPackage();
     _addMetaPackageSource();
@@ -4139,6 +4253,27 @@
 ''');
   }
 
+  test_importLibraryProject_withClass_instanceCreation_const_namedConstructor() async {
+    testFile = '/project/lib/test.dart';
+    addSource('/project/lib/lib.dart', '''
+class Test {
+  const Test.named();
+}
+''');
+    await resolveTestUnit('''
+main() {
+  const Test.named();
+}
+''');
+    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
+import 'lib.dart';
+
+main() {
+  const Test.named();
+}
+''');
+  }
+
   test_importLibraryProject_withClass_instanceCreation_implicit() async {
     testFile = '/project/lib/test.dart';
     addSource('/project/lib/lib.dart', '''
@@ -4181,6 +4316,27 @@
 ''');
   }
 
+  test_importLibraryProject_withClass_instanceCreation_new_namedConstructor() async {
+    testFile = '/project/lib/test.dart';
+    addSource('/project/lib/lib.dart', '''
+class Test {
+  Test.named();
+}
+''');
+    await resolveTestUnit('''
+main() {
+  new Test.named();
+}
+''');
+    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
+import 'lib.dart';
+
+main() {
+  new Test.named();
+}
+''');
+  }
+
   test_importLibraryProject_withFunction() async {
     testFile = '/project/lib/test.dart';
     addSource('/project/lib/lib.dart', '''
@@ -5893,9 +6049,8 @@
   return new Container(
     child: new Row(
       child: <Widget>[
-        new Transform(),
+        new Container(),
         null,
-        new AspectRatio(),
       ],
     ),
   );
@@ -5912,9 +6067,8 @@
   return new Container(
     child: new Row(
       child: [
-        new Transform(),
-        new ClipRect.rect(),
-        new AspectRatio(),
+        new Text('111'),
+        new Text('222'),
       ],
     ),
   );
@@ -5926,9 +6080,8 @@
   return new Container(
     child: new Row(
       children: <Widget>[
-        new Transform(),
-        new ClipRect.rect(),
-        new AspectRatio(),
+        new Text('111'),
+        new Text('222'),
       ],
     ),
   );
@@ -5944,9 +6097,8 @@
   return new Container(
     child: new Row(
       child: <Widget>[
-        new Transform(),
-        new ClipRect.rect(),
-        new AspectRatio(),
+        new Text('111'),
+        new Text('222'),
       ],
     ),
   );
@@ -5958,9 +6110,8 @@
   return new Container(
     child: new Row(
       children: <Widget>[
-        new Transform(),
-        new ClipRect.rect(),
-        new AspectRatio(),
+        new Text('111'),
+        new Text('222'),
       ],
     ),
   );
@@ -6493,6 +6644,23 @@
 ''');
   }
 
+  test_makeFieldFinal_noKeyword() async {
+    String src = '''
+class C {
+  /*LINT*/f = 2;
+}
+''';
+    await findLint(src, LintNames.prefer_final_fields);
+
+    await applyFix(DartFixKind.MAKE_FINAL);
+
+    verifyResult('''
+class C {
+  final f = 2;
+}
+''');
+  }
+
   test_makeFieldFinal_type() async {
     String src = '''
 class C {
diff --git a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
index 4e8323b..d007bc6 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
@@ -130,7 +130,9 @@
 }
 
 class Test extends StatelessWidget {
-  Test({Key key}) : super(key: key);
+  const Test({
+    Key key,
+  }) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -180,7 +182,9 @@
 }
 
 class Test extends StatelessWidget {
-  Test({Key key}) : super(key: key);
+  const Test({
+    Key key,
+  }) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -215,7 +219,9 @@
 }
 
 class Test extends StatelessWidget {
-  Test({Key key}) : super(key: key);
+  const Test({
+    Key key,
+  }) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -254,7 +260,9 @@
 }
 
 class Test extends StatelessWidget {
-  Test({Key key}) : super(key: key);
+  const Test({
+    Key key,
+  }) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -358,9 +366,12 @@
 }
 
 class Test extends StatelessWidget {
-  final C c;
+  const Test({
+    Key key,
+    @required this.c,
+  }) : super(key: key);
 
-  Test({Key key, this.c}) : super(key: key);
+  final C c;
 
   @override
   Widget build(BuildContext context) {
@@ -408,7 +419,9 @@
 }
 
 class Test extends StatelessWidget {
-  Test({Key key}) : super(key: key);
+  const Test({
+    Key key,
+  }) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -471,12 +484,17 @@
 }
 
 class Test extends StatelessWidget {
+  const Test({
+    Key key,
+    @required this.foo,
+    @required this.p1,
+    @required this.p2,
+  }) : super(key: key);
+
   final String foo;
   final String p1;
   final int p2;
 
-  Test({Key key, this.foo, this.p1, this.p2}) : super(key: key);
-
   @override
   Widget build(BuildContext context) {
     var a = new Text('$foo $p1');
@@ -538,12 +556,17 @@
 }
 
 class Test extends StatelessWidget {
+  const Test({
+    Key key,
+    @required this.foo,
+    @required this.p1,
+    @required this.p2,
+  }) : super(key: key);
+
   final String foo;
   final String p1;
   final int p2;
 
-  Test({Key key, this.foo, this.p1, this.p2}) : super(key: key);
-
   @override
   Widget build(BuildContext context) {
     var a = new Text('$foo $p1');
@@ -585,9 +608,12 @@
 }
 
 class Test extends StatelessWidget {
-  final String field;
+  const Test({
+    Key key,
+    @required this.field,
+  }) : super(key: key);
 
-  Test({Key key, this.field}) : super(key: key);
+  final String field;
 
   @override
   Widget build(BuildContext context) {
@@ -634,9 +660,12 @@
 }
 
 class Test extends StatelessWidget {
-  final C c;
+  const Test({
+    Key key,
+    @required this.c,
+  }) : super(key: key);
 
-  Test({Key key, this.c}) : super(key: key);
+  final C c;
 
   @override
   Widget build(BuildContext context) {
@@ -675,7 +704,9 @@
 }
 
 class Test extends StatelessWidget {
-  Test({Key key}) : super(key: key);
+  const Test({
+    Key key,
+  }) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -779,9 +810,12 @@
 }
 
 class Test extends StatelessWidget {
-  final C c;
+  const Test({
+    Key key,
+    @required this.c,
+  }) : super(key: key);
 
-  Test({Key key, this.c}) : super(key: key);
+  final C c;
 
   @override
   Widget build(BuildContext context) {
@@ -842,9 +876,12 @@
 }
 
 class Test extends StatelessWidget {
-  final String local;
+  const Test({
+    Key key,
+    @required this.local,
+  }) : super(key: key);
 
-  Test({Key key, this.local}) : super(key: key);
+  final String local;
 
   @override
   Widget build(BuildContext context) {
@@ -914,11 +951,15 @@
 }
 
 class Test extends StatelessWidget {
+  const Test({
+    Key key,
+    @required this.field,
+    @required this.local,
+  }) : super(key: key);
+
   final String field;
   final String local;
 
-  Test({Key key, this.field, this.local}) : super(key: key);
-
   @override
   Widget build(BuildContext context) {
     return new Column(
diff --git a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
index 736448b..fb78873 100644
--- a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analysis_server/src/services/correction/status.dart';
 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
@@ -144,6 +145,12 @@
         expectedMessage: "Field name must not be empty.");
   }
 
+  void test_validateFieldName_keyword() {
+    assertRefactoringStatus(
+        validateFieldName("for"), RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Field name must not be a keyword.");
+  }
+
   void test_validateFieldName_leadingBlanks() {
     assertRefactoringStatus(
         validateFieldName(" newName"), RefactoringProblemSeverity.FATAL,
@@ -163,18 +170,6 @@
             "Field name must begin with a lowercase letter or underscore.");
   }
 
-  void test_validateFieldName_notKeyword() {
-    assertRefactoringStatus(
-        validateFieldName("for"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Field name must not be a keyword.");
-  }
-
-  void test_validateFieldName_notPseudoKeyword() {
-    assertRefactoringStatus(
-        validateFieldName("await"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Field name must not be a keyword.");
-  }
-
   void test_validateFieldName_null() {
     assertRefactoringStatus(
         validateFieldName(null), RefactoringProblemSeverity.FATAL,
@@ -193,6 +188,10 @@
     assertRefactoringStatusOK(validateFieldName("new_name"));
   }
 
+  void test_validateFieldName_pseudoKeyword() {
+    _assertWarningBuiltIn(validateFieldName("await"));
+  }
+
   void test_validateFieldName_trailingBlanks() {
     assertRefactoringStatus(
         validateFieldName("newName "), RefactoringProblemSeverity.FATAL,
@@ -211,6 +210,12 @@
         expectedMessage: "Function name must not be empty.");
   }
 
+  void test_validateFunctionName_keyword() {
+    assertRefactoringStatus(
+        validateFunctionName("new"), RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Function name must not be a keyword.");
+  }
+
   void test_validateFunctionName_leadingBlanks() {
     assertRefactoringStatus(
         validateFunctionName(" newName"), RefactoringProblemSeverity.FATAL,
@@ -230,18 +235,6 @@
             "Function name must begin with a lowercase letter or underscore.");
   }
 
-  void test_validateFunctionName_notKeyword() {
-    assertRefactoringStatus(
-        validateFunctionName("new"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Function name must not be a keyword.");
-  }
-
-  void test_validateFunctionName_notPseudoKeyword() {
-    assertRefactoringStatus(
-        validateFunctionName("yield"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Function name must not be a keyword.");
-  }
-
   void test_validateFunctionName_null() {
     assertRefactoringStatus(
         validateFunctionName(null), RefactoringProblemSeverity.FATAL,
@@ -260,6 +253,10 @@
     assertRefactoringStatusOK(validateFunctionName("new_name"));
   }
 
+  void test_validateFunctionName_pseudoKeyword() {
+    _assertWarningBuiltIn(validateFunctionName("yield"));
+  }
+
   void test_validateFunctionName_trailingBlanks() {
     assertRefactoringStatus(
         validateFunctionName("newName "), RefactoringProblemSeverity.FATAL,
@@ -339,6 +336,12 @@
     assertRefactoringStatusOK(validateImportPrefixName(""));
   }
 
+  void test_validateImportPrefixName_keyword() {
+    assertRefactoringStatus(
+        validateImportPrefixName("while"), RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Import prefix name must not be a keyword.");
+  }
+
   void test_validateImportPrefixName_leadingBlanks() {
     assertRefactoringStatus(
         validateImportPrefixName(" newName"), RefactoringProblemSeverity.FATAL,
@@ -359,18 +362,6 @@
             "Import prefix name must begin with a lowercase letter or underscore.");
   }
 
-  void test_validateImportPrefixName_notKeyword() {
-    assertRefactoringStatus(
-        validateImportPrefixName("while"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Import prefix name must not be a keyword.");
-  }
-
-  void test_validateImportPrefixName_notPseudoKeyword() {
-    assertRefactoringStatus(
-        validateImportPrefixName("await"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Import prefix name must not be a keyword.");
-  }
-
   void test_validateImportPrefixName_null() {
     assertRefactoringStatus(
         validateImportPrefixName(null), RefactoringProblemSeverity.FATAL,
@@ -389,6 +380,12 @@
     assertRefactoringStatusOK(validateImportPrefixName("new_name"));
   }
 
+  void test_validateImportPrefixName_pseudoKeyword() {
+    assertRefactoringStatus(
+        validateImportPrefixName("await"), RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Import prefix name must not be a keyword.");
+  }
+
   void test_validateImportPrefixName_trailingBlanks() {
     assertRefactoringStatus(
         validateImportPrefixName("newName "), RefactoringProblemSeverity.FATAL,
@@ -408,6 +405,12 @@
         expectedMessage: "Label name must not be empty.");
   }
 
+  void test_validateLabelName_keyword() {
+    assertRefactoringStatus(
+        validateLabelName("for"), RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Label name must not be a keyword.");
+  }
+
   void test_validateLabelName_leadingBlanks() {
     assertRefactoringStatus(
         validateLabelName(" newName"), RefactoringProblemSeverity.FATAL,
@@ -427,18 +430,6 @@
             "Label name must begin with a lowercase letter or underscore.");
   }
 
-  void test_validateLabelName_notKeyword() {
-    assertRefactoringStatus(
-        validateLabelName("for"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Label name must not be a keyword.");
-  }
-
-  void test_validateLabelName_notPseudoKeyword() {
-    assertRefactoringStatus(
-        validateLabelName("await"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Label name must not be a keyword.");
-  }
-
   void test_validateLabelName_null() {
     assertRefactoringStatus(
         validateLabelName(null), RefactoringProblemSeverity.FATAL,
@@ -461,6 +452,10 @@
     assertRefactoringStatusOK(validateLabelName("new_name"));
   }
 
+  void test_validateLabelName_pseudoKeyword() {
+    _assertWarningBuiltIn(validateLabelName("await"));
+  }
+
   void test_validateLabelName_trailingBlanks() {
     assertRefactoringStatus(
         validateLabelName("newName "), RefactoringProblemSeverity.FATAL,
@@ -493,6 +488,12 @@
             "Library name should consist of lowercase identifier separated by dots.");
   }
 
+  void test_validateLibraryName_keyword() {
+    assertRefactoringStatus(
+        validateLibraryName("my.for.name"), RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Library name identifier must not be a keyword.");
+  }
+
   void test_validateLibraryName_leadingBlanks() {
     assertRefactoringStatus(
         validateLibraryName("my. name"), RefactoringProblemSeverity.FATAL,
@@ -513,12 +514,6 @@
             "Library name identifier must begin with a lowercase letter or underscore.");
   }
 
-  void test_validateLibraryName_notKeyword() {
-    assertRefactoringStatus(
-        validateLibraryName("my.yield.name"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Library name identifier must not be a keyword.");
-  }
-
   void test_validateLibraryName_null() {
     assertRefactoringStatus(
         validateLibraryName(null), RefactoringProblemSeverity.FATAL,
@@ -577,18 +572,6 @@
             "Method name must begin with a lowercase letter or underscore.");
   }
 
-  void test_validateMethodName_notKeyword() {
-    assertRefactoringStatus(
-        validateMethodName("do"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Method name must not be a keyword.");
-  }
-
-  void test_validateMethodName_notPseudoKeyword() {
-    assertRefactoringStatus(
-        validateMethodName("yield"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Method name must not be a keyword.");
-  }
-
   void test_validateMethodName_null() {
     assertRefactoringStatus(
         validateMethodName(null), RefactoringProblemSeverity.FATAL,
@@ -607,12 +590,20 @@
     assertRefactoringStatusOK(validateMethodName("new_name"));
   }
 
+  void test_validateMethodName_pseudoKeyword() {
+    _assertWarningBuiltIn(validateMethodName("yield"));
+  }
+
   void test_validateMethodName_trailingBlanks() {
     assertRefactoringStatus(
         validateMethodName("newName "), RefactoringProblemSeverity.FATAL,
         expectedMessage: "Method name must not start or end with a blank.");
   }
 
+  void test_validateParameterName_builtIn() {
+    _assertWarningBuiltIn(validateParameterName("await"));
+  }
+
   void test_validateParameterName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
         validateParameterName("NewName"), RefactoringProblemSeverity.WARNING,
@@ -626,6 +617,12 @@
         expectedMessage: "Parameter name must not be empty.");
   }
 
+  void test_validateParameterName_keyword() {
+    assertRefactoringStatus(
+        validateParameterName("while"), RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Parameter name must not be a keyword.");
+  }
+
   void test_validateParameterName_leadingBlanks() {
     assertRefactoringStatus(
         validateParameterName(" newName"), RefactoringProblemSeverity.FATAL,
@@ -645,18 +642,6 @@
             "Parameter name must begin with a lowercase letter or underscore.");
   }
 
-  void test_validateParameterName_notKeyword() {
-    assertRefactoringStatus(
-        validateParameterName("while"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Parameter name must not be a keyword.");
-  }
-
-  void test_validateParameterName_notPseudoKeyword() {
-    assertRefactoringStatus(
-        validateParameterName("await"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Parameter name must not be a keyword.");
-  }
-
   void test_validateParameterName_null() {
     assertRefactoringStatus(
         validateParameterName(null), RefactoringProblemSeverity.FATAL,
@@ -675,12 +660,20 @@
     assertRefactoringStatusOK(validateParameterName("new_name"));
   }
 
+  void test_validateParameterName_pseudoKeyword() {
+    _assertWarningBuiltIn(validateParameterName("await"));
+  }
+
   void test_validateParameterName_trailingBlanks() {
     assertRefactoringStatus(
         validateParameterName("newName "), RefactoringProblemSeverity.FATAL,
         expectedMessage: "Parameter name must not start or end with a blank.");
   }
 
+  void test_validateVariableName_builtIn() {
+    _assertWarningBuiltIn(validateVariableName('abstract'));
+  }
+
   void test_validateVariableName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
         validateVariableName("NewName"), RefactoringProblemSeverity.WARNING,
@@ -693,6 +686,12 @@
         expectedMessage: "Variable name must not be empty.");
   }
 
+  void test_validateVariableName_keyword() {
+    assertRefactoringStatus(
+        validateVariableName("for"), RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Variable name must not be a keyword.");
+  }
+
   void test_validateVariableName_leadingBlanks() {
     assertRefactoringStatus(
         validateVariableName(" newName"), RefactoringProblemSeverity.FATAL,
@@ -712,18 +711,6 @@
             "Variable name must begin with a lowercase letter or underscore.");
   }
 
-  void test_validateVariableName_notKeyword() {
-    assertRefactoringStatus(
-        validateVariableName("for"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Variable name must not be a keyword.");
-  }
-
-  void test_validateVariableName_notPseudoKeyword() {
-    assertRefactoringStatus(
-        validateVariableName("await"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Variable name must not be a keyword.");
-  }
-
   void test_validateVariableName_null() {
     assertRefactoringStatus(
         validateVariableName(null), RefactoringProblemSeverity.FATAL,
@@ -746,9 +733,18 @@
     assertRefactoringStatusOK(validateVariableName("new_name"));
   }
 
+  void test_validateVariableName_pseudoKeyword() {
+    _assertWarningBuiltIn(validateVariableName("await"));
+  }
+
   void test_validateVariableName_trailingBlanks() {
     assertRefactoringStatus(
         validateVariableName("newName "), RefactoringProblemSeverity.FATAL,
         expectedMessage: "Variable name must not start or end with a blank.");
   }
+
+  void _assertWarningBuiltIn(RefactoringStatus status) {
+    assertRefactoringStatus(status, RefactoringProblemSeverity.WARNING,
+        expectedMessage: 'Avoid using built-in identifiers as names.');
+  }
 }
diff --git a/pkg/analysis_server/test/src/computer/folding_computer_test.dart b/pkg/analysis_server/test/src/computer/folding_computer_test.dart
new file mode 100644
index 0000000..c9d00a1
--- /dev/null
+++ b/pkg/analysis_server/test/src/computer/folding_computer_test.dart
@@ -0,0 +1,96 @@
+// 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:async';
+
+import 'package:analysis_server/src/computer/computer_folding.dart';
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../abstract_context.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FoldingComputerTest);
+  });
+}
+
+@reflectiveTest
+class FoldingComputerTest extends AbstractContextTest {
+  String sourcePath;
+
+  setUp() {
+    super.setUp();
+    sourcePath = resourceProvider.convertPath('/p/lib/source.dart');
+  }
+
+  test_single_import_directives() async {
+    String content = """
+import 'dart:async';
+
+main() {}
+""";
+
+    // Since there are no region comment markers above
+    final regions = await _computeRegions(content);
+    expect(regions, hasLength(0));
+  }
+
+  test_multiple_import_directives() async {
+    String content = """
+/*1*/import 'dart:async';
+
+// We can have comments
+import 'package:a/b.dart';
+import 'package:b/c.dart';
+
+import '../a.dart';/*1:DIRECTIVES*/
+
+main() {}
+""";
+
+    final regions = await _computeRegions(content);
+    _compareRegions(regions, content);
+  }
+
+  /// Compares provided folding regions with expected
+  /// regions extracted from the comments in the provided content.
+  void _compareRegions(List<FoldingRegion> regions, String content) {
+    // Find all numeric markers for region starts.
+    final regex = new RegExp(r'/\*(\d+)\*/');
+    final expectedRegions = regex.allMatches(content);
+
+    // Check we didn't get more than expected, since the loop below only
+    // checks for the presence of matches, not absence.
+    expect(regions, hasLength(expectedRegions.length));
+
+    // Go through each marker, find the expected region start/end and
+    // ensure it's in the results.
+    expectedRegions.forEach((m) {
+      final i = m.group(1);
+      // Find the end marker.
+      final endMatch = new RegExp('/\\*$i:(.+?)\\*/').firstMatch(content);
+
+      final expectedStart = m.end;
+      final expectedLength = endMatch.start - expectedStart;
+      final expectedKindString = endMatch.group(1);
+      final expectedKind = FoldingKind.VALUES
+          .firstWhere((f) => f.toString() == 'FoldingKind.$expectedKindString');
+
+      expect(
+          regions,
+          contains(
+              new FoldingRegion(expectedKind, expectedStart, expectedLength)));
+    });
+  }
+
+  Future<List<FoldingRegion>> _computeRegions(String sourceContent) async {
+    newFile(sourcePath, content: sourceContent);
+    ResolveResult result = await driver.getResult(sourcePath);
+    DartUnitFoldingComputer computer = new DartUnitFoldingComputer(result.unit);
+    return computer.compute();
+  }
+}
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 316cf31..67e9b9b 100644
--- a/pkg/analysis_server/test/src/computer/outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
@@ -546,6 +546,124 @@
     expect(outline, isNotNull);
   }
 
+  test_isTest_isTestGroup() async {
+    addMetaPackageSource();
+    Outline outline = await _computeOutline('''
+import 'package:meta/meta.dart';
+
+@isTestGroup
+void myGroup(name, body()) {}
+
+@isTest
+void myTest(name) {}
+
+void main() {
+  myGroup('group1', () {
+    myGroup('group1_1', () {
+      myTest('test1_1_1');
+      myTest('test1_1_2');
+    });
+    myGroup('group1_2', () {
+      myTest('test1_2_1');
+    });
+  });
+  myGroup('group2', () {
+    myTest('test2_1');
+    myTest('test2_2');
+  });
+}
+''');
+    // unit
+    List<Outline> unit_children = outline.children;
+    expect(unit_children, hasLength(3));
+    // main
+    Outline main_outline = unit_children[2];
+    _expect(main_outline,
+        kind: ElementKind.FUNCTION,
+        name: 'main',
+        offset: testCode.indexOf("main() {"),
+        parameters: '()',
+        returnType: 'void');
+    List<Outline> main_children = main_outline.children;
+    expect(main_children, hasLength(2));
+    // group1
+    Outline group1_outline = main_children[0];
+    _expect(group1_outline,
+        kind: ElementKind.UNIT_TEST_GROUP,
+        length: 7,
+        name: 'myGroup("group1")',
+        offset: testCode.indexOf("myGroup('group1'"));
+    List<Outline> group1_children = group1_outline.children;
+    expect(group1_children, hasLength(2));
+    // group1_1
+    Outline group1_1_outline = group1_children[0];
+    _expect(group1_1_outline,
+        kind: ElementKind.UNIT_TEST_GROUP,
+        length: 7,
+        name: 'myGroup("group1_1")',
+        offset: testCode.indexOf("myGroup('group1_1'"));
+    List<Outline> group1_1_children = group1_1_outline.children;
+    expect(group1_1_children, hasLength(2));
+    // test1_1_1
+    Outline test1_1_1_outline = group1_1_children[0];
+    _expect(test1_1_1_outline,
+        kind: ElementKind.UNIT_TEST_TEST,
+        leaf: true,
+        length: 6,
+        name: 'myTest("test1_1_1")',
+        offset: testCode.indexOf("myTest('test1_1_1'"));
+    // test1_1_1
+    Outline test1_1_2_outline = group1_1_children[1];
+    _expect(test1_1_2_outline,
+        kind: ElementKind.UNIT_TEST_TEST,
+        leaf: true,
+        length: 6,
+        name: 'myTest("test1_1_2")',
+        offset: testCode.indexOf("myTest('test1_1_2'"));
+    // group1_2
+    Outline group1_2_outline = group1_children[1];
+    _expect(group1_2_outline,
+        kind: ElementKind.UNIT_TEST_GROUP,
+        length: 7,
+        name: 'myGroup("group1_2")',
+        offset: testCode.indexOf("myGroup('group1_2'"));
+    List<Outline> group1_2_children = group1_2_outline.children;
+    expect(group1_2_children, hasLength(1));
+    // test2_1
+    Outline test1_2_1_outline = group1_2_children[0];
+    _expect(test1_2_1_outline,
+        kind: ElementKind.UNIT_TEST_TEST,
+        leaf: true,
+        length: 6,
+        name: 'myTest("test1_2_1")',
+        offset: testCode.indexOf("myTest('test1_2_1'"));
+    // group2
+    Outline group2_outline = main_children[1];
+    _expect(group2_outline,
+        kind: ElementKind.UNIT_TEST_GROUP,
+        length: 7,
+        name: 'myGroup("group2")',
+        offset: testCode.indexOf("myGroup('group2'"));
+    List<Outline> group2_children = group2_outline.children;
+    expect(group2_children, hasLength(2));
+    // test2_1
+    Outline test2_1_outline = group2_children[0];
+    _expect(test2_1_outline,
+        kind: ElementKind.UNIT_TEST_TEST,
+        leaf: true,
+        length: 6,
+        name: 'myTest("test2_1")',
+        offset: testCode.indexOf("myTest('test2_1'"));
+    // test2_2
+    Outline test2_2_outline = group2_children[1];
+    _expect(test2_2_outline,
+        kind: ElementKind.UNIT_TEST_TEST,
+        leaf: true,
+        length: 6,
+        name: 'myTest("test2_2")',
+        offset: testCode.indexOf("myTest('test2_2'"));
+  }
+
   test_localFunctions() async {
     Outline unitOutline = await _computeOutline('''
 class A {
diff --git a/pkg/analysis_server/test/src/computer/test_all.dart b/pkg/analysis_server/test/src/computer/test_all.dart
index 4bf0a76..8159db8 100644
--- a/pkg/analysis_server/test/src/computer/test_all.dart
+++ b/pkg/analysis_server/test/src/computer/test_all.dart
@@ -5,6 +5,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'closingLabels_computer_test.dart' as closingLabels_computer_test;
+import 'folding_computer_test.dart' as folding_computer_test;
 import 'import_elements_computer_test.dart' as import_elements_computer_test;
 import 'imported_elements_computer_test.dart'
     as imported_elements_computer_test;
@@ -13,6 +14,7 @@
 main() {
   defineReflectiveSuite(() {
     closingLabels_computer_test.main();
+    folding_computer_test.main();
     import_elements_computer_test.main();
     imported_elements_computer_test.main();
     outline_computer_test.main();
diff --git a/pkg/analysis_server/test/src/utilities/flutter_util.dart b/pkg/analysis_server/test/src/utilities/flutter_util.dart
index b7bdb1b..83b5b82 100644
--- a/pkg/analysis_server/test/src/utilities/flutter_util.dart
+++ b/pkg/analysis_server/test/src/utilities/flutter_util.dart
@@ -35,6 +35,13 @@
 export 'src/widgets/text.dart';
 ''');
 
+  newFile('$flutterPkgLibPath/foundation.dart', r'''
+export 'package:meta/meta.dart' show
+  required;
+
+export 'src/foundation/key.dart';
+''');
+
   void createSrcMaterial() {
     newFile('$flutterPkgLibPath/src/material/app_bar.dart', r'''
 import 'package:flutter/widgets.dart';
@@ -129,6 +136,28 @@
 ''');
   }
 
+  void createSrcFoundation() {
+    newFile('$flutterPkgLibPath/src/foundation/key.dart', r'''
+
+abstract class Key {
+  const factory Key(String value) = ValueKey<String>;
+
+  const Key._();
+}
+
+abstract class LocalKey extends Key {
+  const LocalKey() : super._();
+}
+
+
+class ValueKey<T> extends LocalKey {
+  final T value;
+
+  const ValueKey(this.value);
+}
+''');
+  }
+
   void createSrcWidgets() {
     newFile('$flutterPkgLibPath/src/widgets/basic.dart', r'''
 import 'framework.dart';
@@ -186,7 +215,7 @@
 class AspectRatio extends SingleChildRenderObjectWidget {
   const AspectRatio({
     Key key,
-    @required aspectRatio,
+    @required double aspectRatio,
     Widget child,
   });
 }
@@ -221,22 +250,17 @@
 ''');
 
     newFile('$flutterPkgLibPath/src/widgets/framework.dart', r'''
+import 'package:flutter/foundation.dart';
+
+export 'package:flutter/foundation.dart' show required;
+export 'package:flutter/foundation.dart' show Key, LocalKey, ValueKey;
+
 typedef void VoidCallback();
 
 abstract class BuildContext {
   Widget get widget;
 }
 
-abstract class Key {
-  const factory Key(String value) = ValueKey<String>;
-
-  const Key._();
-}
-
-abstract class LocalKey extends Key {
-  const LocalKey() : super._();
-}
-
 abstract class State<T extends StatefulWidget> {
   BuildContext get context => null;
 
@@ -261,12 +285,6 @@
   Widget build(BuildContext context) => null;
 }
 
-class ValueKey<T> extends LocalKey {
-  final T value;
-
-  const ValueKey(this.value);
-}
-
 class Widget {
   final Key key;
 
@@ -324,6 +342,7 @@
 ''');
   }
 
+  createSrcFoundation();
   createPainting();
   createRendering();
   createSrcWidgets();
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index 62c933f..0d1c534 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -7,7 +7,7 @@
 <body>
 <h1>Analysis Server API Specification</h1>
 <h1 style="color:#999999">Version
-  <version>1.20.1</version>
+  <version>1.20.2</version>
 </h1>
 <p>
   This document contains a specification of the API provided by the
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 5b2237b..8af9b7d 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -618,6 +618,16 @@
   bool get hasFactory;
 
   /**
+   * Return `true` if this element has an annotation of the form `@isTest`.
+   */
+  bool get hasIsTest;
+
+  /**
+   * Return `true` if this element has an annotation of the form `@isTestGroup`.
+   */
+  bool get hasIsTestGroup;
+
+  /**
    * Return `true` if this element has an annotation of the form `@JS(..)`.
    */
   bool get hasJS;
@@ -889,6 +899,18 @@
   bool get isImmutable;
 
   /**
+   * Return `true` if this annotation marks the associated member as running
+   * a single test.
+   */
+  bool get isIsTest;
+
+  /**
+   * Return `true` if this annotation marks the associated member as running
+   * a test group.
+   */
+  bool get isIsTestGroup;
+
+  /**
    * Return `true` if this annotation marks the associated element with the `JS`
    * annotation.
    */
@@ -1436,6 +1458,11 @@
   bool get isDeferred;
 
   /**
+   * The [Namespace] that this directive contributes to the containing library.
+   */
+  Namespace get namespace;
+
+  /**
    * Return the prefix that was specified as part of the import directive, or
    * `null` if there was no prefix specified.
    */
diff --git a/pkg/analyzer/lib/source/line_info.dart b/pkg/analyzer/lib/source/line_info.dart
index 47661a2..5d0dee9 100644
--- a/pkg/analyzer/lib/source/line_info.dart
+++ b/pkg/analyzer/lib/source/line_info.dart
@@ -119,6 +119,6 @@
    * containing the given [offset].
    */
   int getOffsetOfLineAfter(int offset) {
-    return getOffsetOfLine(getLocation(offset).lineNumber + 1);
+    return getOffsetOfLine(getLocation(offset).lineNumber);
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 3933454..a54df1f 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -14,7 +14,6 @@
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
-import 'package:analyzer/src/dart/resolver/scope.dart' show NamespaceBuilder;
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:collection/collection.dart';
 
@@ -823,11 +822,7 @@
   _ImportElementReferencesVisitor(
       ImportElement element, this.enclosingUnitElement)
       : importElement = element {
-    importedElements = new NamespaceBuilder()
-        .createImportNamespaceForDirective(element)
-        .definedNames
-        .values
-        .toSet();
+    importedElements = element.namespace.definedNames.values.toSet();
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/analysis/session_helper.dart b/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
index 1644e8f..758fe29 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
@@ -29,4 +29,18 @@
       return null;
     }
   }
+
+  /// Return the [PropertyAccessorElement] with the given [name] that is
+  /// exported from the library with the given [uri], or `null` if the
+  /// library does not export a top-level accessor with such name.
+  Future<PropertyAccessorElement> getTopLevelPropertyAccessor(
+      String uri, String name) async {
+    var libraryElement = await session.getLibraryByUri(uri);
+    var element = libraryElement.exportNamespace.get(name);
+    if (element is PropertyAccessorElement) {
+      return element;
+    } else {
+      return null;
+    }
+  }
 }
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 8fa0d0b..ac82f5f 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -2854,6 +2854,18 @@
   static String _IMMUTABLE_VARIABLE_NAME = "immutable";
 
   /**
+   * The name of the top-level variable used to mark a function as running
+   * a single test.
+   */
+  static String _IS_TEST_VARIABLE_NAME = "isTest";
+
+  /**
+   * The name of the top-level variable used to mark a function as running
+   * a test group.
+   */
+  static String _IS_TEST_GROUP_VARIABLE_NAME = "isTestGroup";
+
+  /**
    * The name of the class used to JS annotate an element.
    */
   static String _JS_CLASS_NAME = "JS";
@@ -2983,6 +2995,18 @@
       element.library?.name == _META_LIB_NAME;
 
   @override
+  bool get isIsTest =>
+      element is PropertyAccessorElement &&
+      element.name == _IS_TEST_VARIABLE_NAME &&
+      element.library?.name == _META_LIB_NAME;
+
+  @override
+  bool get isIsTestGroup =>
+      element is PropertyAccessorElement &&
+      element.name == _IS_TEST_GROUP_VARIABLE_NAME &&
+      element.library?.name == _META_LIB_NAME;
+
+  @override
   bool get isJS =>
       element is ConstructorElement &&
       element.enclosingElement.name == _JS_CLASS_NAME &&
@@ -3214,6 +3238,14 @@
   }
 
   @override
+  bool get hasIsTest =>
+      metadata.any((ElementAnnotation annotation) => annotation.isIsTest);
+
+  @override
+  bool get hasIsTestGroup =>
+      metadata.any((ElementAnnotation annotation) => annotation.isIsTestGroup);
+
+  @override
   bool get hasJS =>
       metadata.any((ElementAnnotation annotation) => annotation.isJS);
 
@@ -5759,6 +5791,11 @@
   String _selectedUri;
 
   /**
+   * The cached value of [namespace].
+   */
+  Namespace _namespace;
+
+  /**
    * Initialize a newly created import element at the given [offset].
    * The offset may be `-1` if the import is synthetic.
    */
@@ -5907,6 +5944,12 @@
     return offset;
   }
 
+  @override
+  Namespace get namespace {
+    return _namespace ??=
+        new NamespaceBuilder().createImportNamespaceForDirective(this);
+  }
+
   PrefixElement get prefix {
     if (_prefix == null) {
       if (_kernel != null && _kernel.name != null) {
@@ -7556,6 +7599,12 @@
   bool get hasFactory => false;
 
   @override
+  bool get hasIsTest => false;
+
+  @override
+  bool get hasIsTestGroup => false;
+
+  @override
   bool get hasJS => false;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/handle.dart b/pkg/analyzer/lib/src/dart/element/handle.dart
index a5f7cbe..c3a659d 100644
--- a/pkg/analyzer/lib/src/dart/element/handle.dart
+++ b/pkg/analyzer/lib/src/dart/element/handle.dart
@@ -363,6 +363,12 @@
   int get hashCode => _location.hashCode;
 
   @override
+  bool get hasIsTest => actualElement.hasIsTest;
+
+  @override
+  bool get hasIsTestGroup => actualElement.hasIsTestGroup;
+
+  @override
   bool get hasJS => actualElement.hasJS;
 
   @override
@@ -757,6 +763,9 @@
   ElementKind get kind => ElementKind.IMPORT;
 
   @override
+  Namespace get namespace => actualElement.namespace;
+
+  @override
   PrefixElement get prefix => actualElement.prefix;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 026a7ef..a304d9f 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -400,6 +400,12 @@
   bool get hasFactory => _baseElement.hasFactory;
 
   @override
+  bool get hasIsTest => _baseElement.hasIsTest;
+
+  @override
+  bool get hasIsTestGroup => _baseElement.hasIsTestGroup;
+
+  @override
   bool get hasJS => _baseElement.hasJS;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/resolver/scope.dart b/pkg/analyzer/lib/src/dart/resolver/scope.dart
index ef99e4c..a5533a8 100644
--- a/pkg/analyzer/lib/src/dart/resolver/scope.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/scope.dart
@@ -488,13 +488,11 @@
    * later reference.
    */
   void _createImportedNamespaces() {
-    NamespaceBuilder builder = new NamespaceBuilder();
     List<ImportElement> imports = _definingLibrary.imports;
     int count = imports.length;
     _importedNamespaces = new List<Namespace>(count);
     for (int i = 0; i < count; i++) {
-      _importedNamespaces[i] =
-          builder.createImportNamespaceForDirective(imports[i]);
+      _importedNamespaces[i] = imports[i].namespace;
     }
   }
 
diff --git a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
new file mode 100644
index 0000000..96318e4
--- /dev/null
+++ b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
@@ -0,0 +1,190 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/src/dart/ast/ast_factory.dart';
+import 'package:front_end/src/fasta/kernel/forest.dart';
+import 'package:kernel/ast.dart' as kernel;
+
+/// An implementation of a [Forest] that can be used to build an AST structure.
+class AstBuildingForest
+    implements Forest<Expression, Statement, Token, _Arguments> {
+  /// The factory used to create AST nodes.
+  AstFactoryImpl astFactory = new AstFactoryImpl();
+
+  /// Initialize a newly created AST-building forest.
+  AstBuildingForest();
+
+  @override
+  _Arguments arguments(List<Expression> positional, Token location,
+      {covariant List types, covariant List named}) {
+    _Arguments arguments = new _Arguments();
+    if (types != null) {
+      arguments.typeArguments = types.cast<TypeAnnotation>();
+    }
+    arguments.positionalArguments = positional.cast<Expression>();
+    if (named != null) {
+      arguments.namedArguments = named.cast<Expression>();
+    }
+    return arguments;
+  }
+
+  @override
+  _Arguments argumentsEmpty(Token location) => new _Arguments();
+
+  @override
+  List argumentsNamed(_Arguments arguments) => arguments.namedArguments;
+
+  @override
+  List<Expression> argumentsPositional(_Arguments arguments) =>
+      arguments.positionalArguments;
+
+  @override
+  void argumentsSetTypeArguments(_Arguments arguments, covariant List types) {
+    arguments.typeArguments = types.cast<TypeAnnotation>();
+  }
+
+  @override
+  List argumentsTypeArguments(_Arguments arguments) => arguments.typeArguments;
+
+  @override
+  Expression asExpression(Expression expression, type, Token location) =>
+      astFactory.asExpression(expression, location, type);
+
+  Expression asLiteralString(Expression value) => value;
+
+  @override
+  Expression awaitExpression(Expression operand, Token awaitKeyword) {
+    return astFactory.awaitExpression(awaitKeyword, operand);
+  }
+
+  @override
+  kernel.Arguments castArguments(_Arguments arguments) {
+    // TODO(brianwilkerson) Implement this or remove it from the API.
+    throw new UnimplementedError();
+  }
+
+  @override
+  Expression checkLibraryIsLoaded(dependency) {
+    // TODO(brianwilkerson) Implement this.
+    throw new UnimplementedError();
+  }
+
+  @override
+  Expression conditionalExpression(Expression condition, Token question,
+          Expression thenExpression, Token colon, Expression elseExpression) =>
+      astFactory.conditionalExpression(
+          condition, question, thenExpression, colon, elseExpression);
+
+  @override
+  kernel.DartType getTypeAt(Object typeArguments, int index) {
+    return null; // (typeArguments as TypeArgumentList).arguments[index].type.kernelType;
+  }
+
+  @override
+  int getTypeCount(Object typeArguments) {
+    return (typeArguments as TypeArgumentList).arguments.length;
+  }
+
+  @override
+  bool isErroneousNode(covariant node) => false; // ???
+
+  @override
+  Expression isExpression(Expression expression, Token isOperator,
+          Token notOperator, Object type) =>
+      astFactory.isExpression(expression, isOperator, notOperator, type);
+
+  @override
+  Expression literalBool(bool value, Token location) =>
+      astFactory.booleanLiteral(location, value);
+
+  @override
+  Expression literalDouble(double value, Token location) =>
+      astFactory.doubleLiteral(location, value);
+
+  @override
+  Expression literalInt(int value, Token location) =>
+      astFactory.integerLiteral(location, value);
+
+  @override
+  Expression literalList(
+          Token constKeyword,
+          bool isConst,
+          Object typeArgument,
+          Object typeArguments,
+          Token leftBracket,
+          List<Expression> expressions,
+          Token rightBracket) =>
+      astFactory.listLiteral(
+          constKeyword, typeArguments, leftBracket, expressions, rightBracket);
+
+  @override
+  Expression literalMap(
+          Token constKeyword,
+          bool isConst,
+          covariant keyType,
+          covariant valueType,
+          Object typeArguments,
+          Token leftBracket,
+          covariant List entries,
+          Token rightBracket) =>
+      astFactory.mapLiteral(
+          constKeyword, typeArguments, leftBracket, entries, rightBracket);
+
+  @override
+  Expression literalNull(Token location) => astFactory.nullLiteral(location);
+
+  @override
+  Expression literalString(String value, Token location) =>
+      astFactory.simpleStringLiteral(location, value);
+
+  @override
+  Expression literalSymbol(String value, Token location) {
+    // TODO(brianwilkerson) Get the missing information.
+    return astFactory.symbolLiteral(location, null /* components */);
+  }
+
+  @override
+  Expression literalType(covariant type, Token location) {
+    // TODO(brianwilkerson) Capture the type information.
+    return astFactory.simpleIdentifier(location);
+  }
+
+  @override
+  Expression loadLibrary(dependency) {
+    // TODO(brianwilkerson) Implement this.
+    throw new UnimplementedError();
+  }
+
+  @override
+  Object mapEntry(Expression key, Token colon, Expression value) =>
+      astFactory.mapLiteralEntry(key, colon, value);
+
+  @override
+  List mapEntryList(int length) => <MapLiteralEntry>[];
+
+  @override
+  Expression notExpression(Expression operand, Token operator) =>
+      astFactory.prefixExpression(operator, operand);
+
+  @override
+  int readOffset(AstNode node) => node.offset;
+
+  @override
+  Expression stringConcatenationExpression(
+          List<Expression> strings, Token location) =>
+      astFactory.adjacentStrings(strings);
+
+  @override
+  Expression thisExpression(Token thisKeyword) =>
+      astFactory.thisExpression(thisKeyword);
+}
+
+/// A data holder used to conform to the [Forest] API.
+class _Arguments {
+  List<TypeAnnotation> typeArguments = <TypeAnnotation>[];
+  List<Expression> positionalArguments = <Expression>[];
+  List<Expression> namedArguments = <Expression>[];
+}
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 5562394..503d7b1 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -4263,8 +4263,7 @@
       // the map.
       ImportElement importElement = importDirective.element;
       if (importElement != null) {
-        NamespaceBuilder builder = new NamespaceBuilder();
-        namespace = builder.createImportNamespaceForDirective(importElement);
+        namespace = importElement.namespace;
         _namespaceMap[importDirective] = namespace;
       }
     }
@@ -8505,7 +8504,17 @@
     if (typeName is SimpleIdentifier) {
       return typeName;
     } else {
-      return (typeName as PrefixedIdentifier).identifier;
+      PrefixedIdentifier prefixed = typeName;
+      SimpleIdentifier prefix = prefixed.prefix;
+      // The prefixed identifier can be:
+      // 1. new importPrefix.TypeName()
+      // 2. new TypeName.constructorName()
+      // 3. new unresolved.Unresolved()
+      if (prefix.staticElement is PrefixElement) {
+        return prefixed.identifier;
+      } else {
+        return prefix;
+      }
     }
   }
 
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index 7c76550..d178f25 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -20,6 +20,7 @@
     show AnalysisContext, AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
 import 'package:analyzer/src/generated/utilities_dart.dart' show ParameterKind;
+import 'package:meta/meta.dart';
 
 /**
  * `void`, `dynamic`, and `Object` are all equivalent. However, this makes
@@ -63,6 +64,651 @@
       identical(t, UnknownInferredType.instance);
 }
 
+/// Tracks upper and lower type bounds for a set of type parameters.
+///
+/// This class is used by calling [isSubtypeOf]. When it encounters one of
+/// the type parameters it is inferring, it will record the constraint, and
+/// optimistically assume the constraint will be satisfied.
+///
+/// For example if we are inferring type parameter A, and we ask if
+/// `A <: num`, this will record that A must be a subytpe of `num`. It also
+/// handles cases when A appears as part of the structure of another type, for
+/// example `Iterable<A> <: Iterable<num>` would infer the same constraint
+/// (due to covariant generic types) as would `() -> A <: () -> num`. In
+/// contrast `(A) -> void <: (num) -> void`.
+///
+/// Once the lower/upper bounds are determined, [infer] should be called to
+/// finish the inference. It will instantiate a generic function type with the
+/// inferred types for each type parameter.
+///
+/// It can also optionally compute a partial solution, in case some of the type
+/// parameters could not be inferred (because the constraints cannot be
+/// satisfied), or bail on the inference when this happens.
+///
+/// As currently designed, an instance of this class should only be used to
+/// infer a single call and discarded immediately afterwards.
+class GenericInferrer {
+  final StrongTypeSystemImpl _typeSystem;
+  final TypeProvider typeProvider;
+  final Map<TypeParameterElement, List<_TypeConstraint>> constraints;
+
+  /// Buffer recording constraints recorded while performing a recursive call to
+  /// [_matchSubtypeOf] that might fail, so that any constraints recorded during
+  /// the failed match can be rewound.
+  final _undoBuffer = <_TypeConstraint>[];
+
+  GenericInferrer(this.typeProvider, this._typeSystem,
+      Iterable<TypeParameterElement> typeFormals)
+      : constraints = new HashMap(
+            equals: (x, y) => x.location == y.location,
+            hashCode: (x) => x.location.hashCode) {
+    for (var formal in typeFormals) {
+      constraints[formal] = [];
+    }
+  }
+
+  /// Apply an argument constraint, which asserts that the [argument] staticType
+  /// is a subtype of the [parameterType].
+  void constrainArgument(
+      DartType argumentType, DartType parameterType, String parameterName,
+      {DartType genericType}) {
+    var origin = new _TypeConstraintFromArgument(
+        argumentType, parameterType, parameterName,
+        genericType: genericType);
+    tryMatchSubtypeOf(argumentType, parameterType, origin, covariant: false);
+  }
+
+  /// Constrain a universal function type [fnType] used in a context
+  /// [contextType].
+  void constrainGenericFunctionInContext(
+      FunctionType fnType, DartType contextType) {
+    var origin = new _TypeConstraintFromFunctionContext(fnType, contextType);
+
+    // Since we're trying to infer the instantiation, we want to ignore type
+    // formals as we check the parameters and return type.
+    var inferFnType =
+        fnType.instantiate(TypeParameterTypeImpl.getTypes(fnType.typeFormals));
+    tryMatchSubtypeOf(inferFnType, contextType, origin, covariant: true);
+  }
+
+  /// Apply a return type constraint, which asserts that the [declaredType]
+  /// is a subtype of the [contextType].
+  void constrainReturnType(DartType declaredType, DartType contextType) {
+    var origin = new _TypeConstraintFromReturnType(declaredType, contextType);
+    tryMatchSubtypeOf(declaredType, contextType, origin, covariant: true);
+  }
+
+  /// Given the constraints that were given by calling [isSubtypeOf], find the
+  /// instantiation of the generic function that satisfies these constraints.
+  ///
+  /// If [downwardsInferPhase] is set, we are in the first pass of inference,
+  /// pushing context types down. At that point we are allowed to push down
+  /// `?` to precisely represent an unknown type. If [downwardsInferPhase] is
+  /// false, we are on our final inference pass, have all available information
+  /// including argument types, and must not conclude `?` for any type formal.
+  T infer<T extends ParameterizedType>(
+      T genericType, List<TypeParameterElement> typeFormals,
+      {bool considerExtendsClause: true,
+      ErrorReporter errorReporter,
+      AstNode errorNode,
+      bool downwardsInferPhase: false}) {
+    var fnTypeParams = TypeParameterTypeImpl.getTypes(typeFormals);
+
+    // Initialize the inferred type array.
+    //
+    // In the downwards phase, they all start as `?` to offer reasonable
+    // degradation for f-bounded type parameters.
+    var inferredTypes = new List<DartType>.filled(
+        fnTypeParams.length, UnknownInferredType.instance);
+    var _inferTypeParameter = downwardsInferPhase
+        ? _inferTypeParameterFromContext
+        : _inferTypeParameterFromAll;
+
+    for (int i = 0; i < fnTypeParams.length; i++) {
+      TypeParameterType typeParam = fnTypeParams[i];
+
+      var typeParamBound = typeParam.bound;
+      _TypeConstraint extendsClause;
+      if (considerExtendsClause && !typeParamBound.isDynamic) {
+        extendsClause = new _TypeConstraint.fromExtends(typeParam,
+            typeParam.bound.substitute2(inferredTypes, fnTypeParams));
+      }
+
+      inferredTypes[i] =
+          _inferTypeParameter(constraints[typeParam.element], extendsClause);
+    }
+
+    // If the downwards infer phase has failed, we'll catch this in the upwards
+    // phase later on.
+    if (downwardsInferPhase) {
+      return genericType.instantiate(inferredTypes) as T;
+    }
+
+    // Check the inferred types against all of the constraints.
+    var knownTypes = new HashMap<TypeParameterType, DartType>(
+        equals: (x, y) => x.element == y.element,
+        hashCode: (x) => x.element.hashCode);
+    for (int i = 0; i < fnTypeParams.length; i++) {
+      TypeParameterType typeParam = fnTypeParams[i];
+      var constraints = this.constraints[typeParam.element];
+      var typeParamBound =
+          typeParam.bound.substitute2(inferredTypes, fnTypeParams);
+
+      var inferred = inferredTypes[i];
+      bool success =
+          constraints.every((c) => c.isSatisifedBy(_typeSystem, inferred));
+      if (success && !typeParamBound.isDynamic) {
+        // If everything else succeeded, check the `extends` constraint.
+        var extendsConstraint =
+            new _TypeConstraint.fromExtends(typeParam, typeParamBound);
+        constraints.add(extendsConstraint);
+        success = extendsConstraint.isSatisifedBy(_typeSystem, inferred);
+      }
+
+      if (!success) {
+        errorReporter?.reportErrorForNode(
+            StrongModeCode.COULD_NOT_INFER,
+            errorNode,
+            [typeParam, _formatError(typeParam, inferred, constraints)]);
+
+        // Heuristic: even if we failed, keep the erroneous type.
+        // It should satisfy at least some of the constraints (e.g. the return
+        // context). If we fall back to instantiateToBounds, we'll typically get
+        // more errors (e.g. because `dynamic` is the most common bound).
+      }
+
+      if (UnknownInferredType.isKnown(inferred)) {
+        knownTypes[typeParam] = inferred;
+      }
+    }
+
+    // Use instantiate to bounds to finish things off.
+    var hasError = new List<bool>.filled(fnTypeParams.length, false);
+    var result = _typeSystem.instantiateToBounds(genericType,
+        hasError: hasError, knownTypes: knownTypes) as T;
+
+    // Report any errors from instantiateToBounds.
+    for (int i = 0; i < hasError.length; i++) {
+      if (hasError[i]) {
+        TypeParameterType typeParam = fnTypeParams[i];
+        var typeParamBound =
+            typeParam.bound.substitute2(inferredTypes, fnTypeParams);
+        // TODO(jmesserly): improve this error message.
+        errorReporter
+            ?.reportErrorForNode(StrongModeCode.COULD_NOT_INFER, errorNode, [
+          typeParam,
+          "\nRecursive bound cannot be instantiated: '$typeParamBound'."
+              "\nConsider passing explicit type argument(s) "
+              "to the generic.\n\n'"
+        ]);
+      }
+    }
+    return result;
+  }
+
+  /// Tries to make [i1] a subtype of [i2] and accumulate constraints as needed.
+  ///
+  /// The return value indicates whether the match was successful.  If it was
+  /// unsuccessful, any constraints that were accumulated during the match
+  /// attempt have been rewound (see [_rewindConstraints]).
+  bool tryMatchSubtypeOf(DartType t1, DartType t2, _TypeConstraintOrigin origin,
+      {bool covariant}) {
+    int previousRewindBufferLength = _undoBuffer.length;
+    bool success = _matchSubtypeOf(t1, t2, null, origin, covariant: covariant);
+    if (!success) {
+      _rewindConstraints(previousRewindBufferLength);
+    }
+    return success;
+  }
+
+  /// Choose the bound that was implied by the return type, if any.
+  ///
+  /// Which bound this is depends on what positions the type parameter
+  /// appears in. If the type only appears only in a contravariant position,
+  /// we will choose the lower bound instead.
+  ///
+  /// For example given:
+  ///
+  ///     Func1<T, bool> makeComparer<T>(T x) => (T y) => x() == y;
+  ///
+  ///     main() {
+  ///       Func1<num, bool> t = makeComparer/* infer <num> */(42);
+  ///       print(t(42.0)); /// false, no error.
+  ///     }
+  ///
+  /// The constraints we collect are:
+  ///
+  /// * `num <: T`
+  /// * `int <: T`
+  ///
+  /// ... and no upper bound. Therefore the lower bound is the best choice.
+  DartType _chooseTypeFromConstraints(Iterable<_TypeConstraint> constraints,
+      {bool toKnownType: false}) {
+    DartType lower = UnknownInferredType.instance;
+    DartType upper = UnknownInferredType.instance;
+    for (var constraint in constraints) {
+      // Given constraints:
+      //
+      //     L1 <: T <: U1
+      //     L2 <: T <: U2
+      //
+      // These can be combined to produce:
+      //
+      //     LUB(L1, L2) <: T <: GLB(U1, U2).
+      //
+      // This can then be done for all constraints in sequence.
+      //
+      // This resulting constraint may be unsatisfiable; in that case inference
+      // will fail.
+      upper = _getGreatestLowerBound(upper, constraint.upperBound);
+      lower = _typeSystem.getLeastUpperBound(lower, constraint.lowerBound);
+    }
+
+    // Prefer the known bound, if any.
+    // Otherwise take whatever bound has partial information, e.g. `Iterable<?>`
+    //
+    // For both of those, prefer the lower bound (arbitrary heuristic).
+    if (UnknownInferredType.isKnown(lower)) {
+      return lower;
+    }
+    if (UnknownInferredType.isKnown(upper)) {
+      return upper;
+    }
+    if (!identical(UnknownInferredType.instance, lower)) {
+      return toKnownType ? _typeSystem.lowerBoundForType(lower) : lower;
+    }
+    if (!identical(UnknownInferredType.instance, upper)) {
+      return toKnownType ? _typeSystem.upperBoundForType(upper) : upper;
+    }
+    return lower;
+  }
+
+  String _formatError(TypeParameterType typeParam, DartType inferred,
+      Iterable<_TypeConstraint> constraints) {
+    var intro = "Tried to infer '$inferred' for '$typeParam'"
+        " which doesn't work:";
+
+    var constraintsByOrigin = <_TypeConstraintOrigin, List<_TypeConstraint>>{};
+    for (var c in constraints) {
+      constraintsByOrigin.putIfAbsent(c.origin, () => []).add(c);
+    }
+
+    // Only report unique constraint origins.
+    Iterable<_TypeConstraint> isSatisified(bool expected) => constraintsByOrigin
+        .values
+        .where((l) =>
+            l.every((c) => c.isSatisifedBy(_typeSystem, inferred)) == expected)
+        .expand((i) => i);
+
+    String unsatisified = _formatConstraints(isSatisified(false));
+    String satisified = _formatConstraints(isSatisified(true));
+
+    assert(unsatisified.isNotEmpty);
+    if (satisified.isNotEmpty) {
+      satisified = "\nThe type '$inferred' was inferred from:\n$satisified";
+    }
+
+    return '\n\n$intro\n$unsatisified$satisified\n\n'
+        'Consider passing explicit type argument(s) to the generic.\n\n';
+  }
+
+  /// This is first calls strong mode's GLB, but if it fails to find anything
+  /// (i.e. returns the bottom type), we kick in a few additional rules:
+  ///
+  /// - `GLB(FutureOr<A>, B)` is defined as:
+  ///   - `GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>`
+  ///   - `GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>`
+  ///   - else `GLB(FutureOr<A>, B) == GLB(A, B)`
+  /// - `GLB(A, FutureOr<B>) ==  GLB(FutureOr<A>, B)` (defined above),
+  /// - else `GLB(A, B) == Null`
+  DartType _getGreatestLowerBound(DartType t1, DartType t2) {
+    var result = _typeSystem.getGreatestLowerBound(t1, t2);
+    if (result.isBottom) {
+      // See if we can do better by considering FutureOr rules.
+      if (t1 is InterfaceType && t1.isDartAsyncFutureOr) {
+        var t1TypeArg = t1.typeArguments[0];
+        if (t2 is InterfaceType) {
+          //  GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>
+          if (t2.isDartAsyncFutureOr) {
+            var t2TypeArg = t2.typeArguments[0];
+            return typeProvider.futureOrType
+                .instantiate([_getGreatestLowerBound(t1TypeArg, t2TypeArg)]);
+          }
+          // GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>
+          if (t2.isDartAsyncFuture) {
+            var t2TypeArg = t2.typeArguments[0];
+            return typeProvider.futureType
+                .instantiate([_getGreatestLowerBound(t1TypeArg, t2TypeArg)]);
+          }
+        }
+        // GLB(FutureOr<A>, B) == GLB(A, B)
+        return _getGreatestLowerBound(t1TypeArg, t2);
+      }
+      if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
+        // GLB(A, FutureOr<B>) ==  GLB(FutureOr<A>, B)
+        return _getGreatestLowerBound(t2, t1);
+      }
+      // TODO(jmesserly): fix this rule once we support non-nullable types.
+      return typeProvider.nullType;
+    }
+    return result;
+  }
+
+  DartType _inferTypeParameterFromAll(
+      List<_TypeConstraint> constraints, _TypeConstraint extendsClause) {
+    // See if we already fixed this type from downwards inference.
+    // If so, then we aren't allowed to change it based on argument types.
+    DartType t = _inferTypeParameterFromContext(
+        constraints.where((c) => c.isDownwards), extendsClause);
+    if (UnknownInferredType.isKnown(t)) {
+      // Remove constraints that aren't downward ones; we'll ignore these for
+      // error reporting, because inference already succeeded.
+      constraints.removeWhere((c) => !c.isDownwards);
+      return t;
+    }
+
+    if (extendsClause != null) {
+      constraints = constraints.toList()..add(extendsClause);
+    }
+
+    var choice = _chooseTypeFromConstraints(constraints, toKnownType: true);
+    return choice;
+  }
+
+  DartType _inferTypeParameterFromContext(
+      Iterable<_TypeConstraint> constraints, _TypeConstraint extendsClause) {
+    DartType t = _chooseTypeFromConstraints(constraints);
+    if (UnknownInferredType.isUnknown(t)) {
+      return t;
+    }
+
+    // If we're about to make our final choice, apply the extends clause.
+    // This gives us a chance to refine the choice, in case it would violate
+    // the `extends` clause. For example:
+    //
+    //     Object obj = math.min/*<infer Object, error>*/(1, 2);
+    //
+    // If we consider the `T extends num` we conclude `<num>`, which works.
+    if (extendsClause != null) {
+      constraints = constraints.toList()..add(extendsClause);
+      return _chooseTypeFromConstraints(constraints);
+    }
+    return t;
+  }
+
+  /// Tries to make [i1] a subtype of [i2] and accumulate constraints as needed.
+  ///
+  /// The return value indicates whether the match was successful.  If it was
+  /// unsuccessful, the caller is responsible for ignoring any constraints that
+  /// were accumulated (see [_rewindConstraints]).
+  bool _matchInterfaceSubtypeOf(InterfaceType i1, InterfaceType i2,
+      Set<Element> visited, _TypeConstraintOrigin origin,
+      {bool covariant}) {
+    if (identical(i1, i2)) {
+      return true;
+    }
+
+    if (i1.element == i2.element) {
+      List<DartType> tArgs1 = i1.typeArguments;
+      List<DartType> tArgs2 = i2.typeArguments;
+      assert(tArgs1.length == tArgs2.length);
+      for (int i = 0; i < tArgs1.length; i++) {
+        if (!_matchSubtypeOf(tArgs1[i], tArgs2[i], visited, origin,
+            covariant: covariant)) {
+          return false;
+        }
+      }
+      return true;
+    }
+    if (i1.isObject) {
+      return false;
+    }
+
+    // Guard against loops in the class hierarchy
+    //
+    // TODO(jmesserly): this function isn't guarding against anything (it's not
+    // passsing down `visitedSet`, so adding the element has no effect).
+    //
+    // If that's fixed, it breaks inference tests for types like
+    // `Iterable<Iterable<?>>` matched aganinst `List<List<int>>`.
+    //
+    // The fix is for type arguments (above) to not pass down `visited`, similar
+    // to how _isInterfaceSubtypeOf does not pass down `visited` for type
+    // arguments.
+    bool guardedInterfaceSubtype(InterfaceType t1) {
+      var visitedSet = visited ?? new HashSet<Element>();
+      if (visitedSet.add(t1.element)) {
+        bool matched = _matchInterfaceSubtypeOf(t1, i2, visited, origin,
+            covariant: covariant);
+        visitedSet.remove(t1.element);
+        return matched;
+      } else {
+        // In the case of a recursive type parameter, consider the subtype
+        // match to have failed.
+        return false;
+      }
+    }
+
+    // We don't need to search the entire class hierarchy, since a given
+    // subclass can't appear multiple times with different generic parameters.
+    // So shortcut to the first match found.
+    //
+    // We don't need undo logic here because if the classes don't match, nothing
+    // is added to the constraint set.
+    if (guardedInterfaceSubtype(i1.superclass)) return true;
+    for (final parent in i1.interfaces) {
+      if (guardedInterfaceSubtype(parent)) return true;
+    }
+    for (final parent in i1.mixins) {
+      if (guardedInterfaceSubtype(parent)) return true;
+    }
+    return false;
+  }
+
+  /// Assert that [t1] will be a subtype of [t2], and returns if the constraint
+  /// can be satisfied.
+  ///
+  /// [covariant] must be true if [t1] is a declared type of the generic
+  /// function and [t2] is the context type, or false if the reverse. For
+  /// example [covariant] is used when [t1] is the declared return type
+  /// and [t2] is the context type. Contravariant would be used if [t1] is the
+  /// argument type (i.e. passed in to the generic function) and [t2] is the
+  /// declared parameter type.
+  ///
+  /// [origin] indicates where the constraint came from, for example an argument
+  /// or return type.
+  bool _matchSubtypeOf(DartType t1, DartType t2, Set<Element> visited,
+      _TypeConstraintOrigin origin,
+      {bool covariant}) {
+    if (covariant && t1 is TypeParameterType) {
+      var constraints = this.constraints[t1.element];
+      if (constraints != null) {
+        if (!identical(t2, UnknownInferredType.instance)) {
+          var constraint = new _TypeConstraint(origin, t1, upper: t2);
+          constraints.add(constraint);
+          _undoBuffer.add(constraint);
+        }
+        return true;
+      }
+    }
+    if (!covariant && t2 is TypeParameterType) {
+      var constraints = this.constraints[t2.element];
+      if (constraints != null) {
+        if (!identical(t1, UnknownInferredType.instance)) {
+          var constraint = new _TypeConstraint(origin, t2, lower: t1);
+          constraints.add(constraint);
+          _undoBuffer.add(constraint);
+        }
+        return true;
+      }
+    }
+
+    if (identical(t1, t2)) {
+      return true;
+    }
+
+    // TODO(jmesserly): this logic is taken from subtype.
+    bool matchSubtype(DartType t1, DartType t2) {
+      return _matchSubtypeOf(t1, t2, null, origin, covariant: covariant);
+    }
+
+    // Handle FutureOr<T> union type.
+    if (t1 is InterfaceType && t1.isDartAsyncFutureOr) {
+      var t1TypeArg = t1.typeArguments[0];
+      if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
+        var t2TypeArg = t2.typeArguments[0];
+        // FutureOr<A> <: FutureOr<B> iff A <: B
+        return matchSubtype(t1TypeArg, t2TypeArg);
+      }
+
+      // given t1 is Future<A> | A, then:
+      // (Future<A> | A) <: t2 iff Future<A> <: t2 and A <: t2.
+      var t1Future = typeProvider.futureType.instantiate([t1TypeArg]);
+      return matchSubtype(t1Future, t2) && matchSubtype(t1TypeArg, t2);
+    }
+
+    if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
+      // given t2 is Future<A> | A, then:
+      // t1 <: (Future<A> | A) iff t1 <: Future<A> or t1 <: A
+      var t2TypeArg = t2.typeArguments[0];
+      var t2Future = typeProvider.futureType.instantiate([t2TypeArg]);
+
+      // First we try matching `t1 <: Future<A>`.  If that succeeds *and*
+      // records at least one constraint, then we proceed using that constraint.
+      var previousRewindBufferLength = _undoBuffer.length;
+      var success =
+          tryMatchSubtypeOf(t1, t2Future, origin, covariant: covariant);
+
+      if (_undoBuffer.length != previousRewindBufferLength) {
+        // Trying to match `t1 <: Future<A>` succeeded and recorded constraints,
+        // so those are the constraints we want.
+        return true;
+      } else {
+        // Either `t1 <: Future<A>` failed to match, or it matched trivially
+        // without recording any constraints (e.g. because t1 is `Null`).  We
+        // want constraints, because they let us do more precise inference, so
+        // go ahead and try matching `t1 <: A` to see if it records any
+        // constraints.
+        if (tryMatchSubtypeOf(t1, t2TypeArg, origin, covariant: covariant)) {
+          // Trying to match `t1 <: A` succeeded.  If it recorded constraints,
+          // those are the constraints we want.  If it didn't, then there's no
+          // way we're going to get any constraints.  So either way, we want to
+          // return `true` since the match suceeded and the constraints we want
+          // (if any) have been recorded.
+          return true;
+        } else {
+          // Trying to match `t1 <: A` failed.  So there's no way we are going
+          // to get any constraints.  Just return `success` to indicate whether
+          // the match succeeded.
+          return success;
+        }
+      }
+    }
+
+    // S <: T where S is a type variable
+    //  T is not dynamic or object (handled above)
+    //  True if T == S
+    //  Or true if bound of S is S' and S' <: T
+
+    if (t1 is TypeParameterType) {
+      // Guard against recursive type parameters
+      //
+      // TODO(jmesserly): this function isn't guarding against anything (it's
+      // not passsing down `visitedSet`, so adding the element has no effect).
+      bool guardedSubtype(DartType t1, DartType t2) {
+        var visitedSet = visited ?? new HashSet<Element>();
+        if (visitedSet.add(t1.element)) {
+          bool matched = matchSubtype(t1, t2);
+          visitedSet.remove(t1.element);
+          return matched;
+        } else {
+          // In the case of a recursive type parameter, consider the subtype
+          // match to have failed.
+          return false;
+        }
+      }
+
+      if (t2 is TypeParameterType && t1.definition == t2.definition) {
+        return guardedSubtype(t1.bound, t2.bound);
+      }
+      return guardedSubtype(t1.bound, t2);
+    }
+    if (t2 is TypeParameterType) {
+      return false;
+    }
+
+    if (_isBottom(t1) || _isTop(t2)) return true;
+
+    if (t1 is InterfaceType && t2 is InterfaceType) {
+      return _matchInterfaceSubtypeOf(t1, t2, visited, origin,
+          covariant: covariant);
+    }
+
+    if (t1 is FunctionType && t2 is FunctionType) {
+      return FunctionTypeImpl.relate(
+          t1,
+          t2,
+          (t1, t2) {
+            // TODO(jmesserly): should we flip covariance when we're relating
+            // type formal bounds? They're more like parameters.
+            return matchSubtype(t1, t2);
+          },
+          _typeSystem.instantiateToBounds,
+          parameterRelation: (p1, p2) {
+            return _matchSubtypeOf(p2.type, p1.type, null, origin,
+                covariant: !covariant);
+          });
+    }
+
+    if (t1 is FunctionType && t2 == typeProvider.functionType) {
+      return true;
+    }
+
+    return false;
+  }
+
+  /// Un-does constraints that were gathered by a failed match attempt, until
+  /// [_undoBuffer] has length [previousRewindBufferLength].
+  ///
+  /// The intended usage is that the caller should record the length of
+  /// [_undoBuffer] before attempting to make a match.  Then, if the match
+  /// fails, pass the recorded length to this method to erase any constraints
+  /// that were recorded during the failed match.
+  void _rewindConstraints(int previousRewindBufferLength) {
+    while (_undoBuffer.length > previousRewindBufferLength) {
+      var constraint = _undoBuffer.removeLast();
+      var element = constraint.typeParameter.element;
+      assert(identical(constraints[element].last, constraint));
+      constraints[element].removeLast();
+    }
+  }
+
+  static String _formatConstraints(Iterable<_TypeConstraint> constraints) {
+    List<List<String>> lineParts =
+        new Set<_TypeConstraintOrigin>.from(constraints.map((c) => c.origin))
+            .map((o) => o.formatError())
+            .toList();
+
+    int prefixMax = lineParts.map((p) => p[0].length).fold(0, math.max);
+
+    // Use a set to prevent identical message lines.
+    // (It's not uncommon for the same constraint to show up in a few places.)
+    var messageLines = new Set<String>.from(lineParts.map((parts) {
+      var prefix = parts[0];
+      var middle = parts[1];
+      var prefixPad = ' ' * (prefixMax - prefix.length);
+      var middlePad = ' ' * (prefixMax);
+      var end = "";
+      if (parts.length > 2) {
+        end = '\n  $middlePad ${parts[2]}';
+      }
+      return '  $prefix$prefixPad $middle$end';
+    }));
+
+    return messageLines.join('\n');
+  }
+}
+
 /**
  * Implementation of [TypeSystem] using the strong mode rules.
  * https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md
@@ -99,20 +745,6 @@
   @override
   bool get isStrong => true;
 
-  bool anyParameterType(FunctionType ft, bool predicate(DartType t)) {
-    return ft.parameters.any((p) => predicate(p.type));
-  }
-
-  /// Given a type t, if t is an interface type with a call method
-  /// defined, return the function type for the call method, otherwise
-  /// return null.
-  FunctionType getCallMethodType(DartType t) {
-    if (t is InterfaceType) {
-      return t.lookUpInheritedMethod("call")?.type;
-    }
-    return null;
-  }
-
   /// Returns true iff the type [t] accepts function types, and requires an
   /// implicit coercion if interface types with a `call` method are passed in.
   ///
@@ -130,6 +762,20 @@
     return t is FunctionType || t.isDartCoreFunction;
   }
 
+  bool anyParameterType(FunctionType ft, bool predicate(DartType t)) {
+    return ft.parameters.any((p) => predicate(p.type));
+  }
+
+  /// Given a type t, if t is an interface type with a call method
+  /// defined, return the function type for the call method, otherwise
+  /// return null.
+  FunctionType getCallMethodType(DartType t) {
+    if (t is InterfaceType) {
+      return t.lookUpInheritedMethod("call")?.type;
+    }
+    return null;
+  }
+
   /// Computes the greatest lower bound of [type1] and [type2].
   DartType getGreatestLowerBound(DartType type1, DartType type2) {
     // The greatest lower bound relation is reflexive.
@@ -233,7 +879,7 @@
     // inferred. It will optimistically assume these type parameters can be
     // subtypes (or supertypes) as necessary, and track the constraints that
     // are implied by this.
-    var inferrer = new _GenericInferrer(typeProvider, this, fnType.typeFormals);
+    var inferrer = new GenericInferrer(typeProvider, this, fnType.typeFormals);
     inferrer.constrainGenericFunctionInContext(fnType, contextType);
 
     // Infer and instantiate the resulting type.
@@ -280,7 +926,7 @@
     // inferred. It will optimistically assume these type parameters can be
     // subtypes (or supertypes) as necessary, and track the constraints that
     // are implied by this.
-    var inferrer = new _GenericInferrer(typeProvider, this, typeFormals);
+    var inferrer = new GenericInferrer(typeProvider, this, typeFormals);
 
     DartType declaredReturnType =
         genericType is FunctionType ? genericType.returnType : genericType;
@@ -549,6 +1195,91 @@
         p1.isCovariant && isSubtypeOf(p1.type, p2.type);
   }
 
+  @override
+  bool isSubtypeOf(DartType t1, DartType t2) {
+    if (identical(t1, t2)) {
+      return true;
+    }
+
+    // The types are void, dynamic, bottom, interface types, function types,
+    // FutureOr<T> and type parameters.
+    //
+    // We proceed by eliminating these different classes from consideration.
+
+    // Trivially true.
+    //
+    // Note that `?` is treated as a top and a bottom type during inference,
+    // so it's also covered here.
+    if (_isTop(t2) || _isBottom(t1)) {
+      return true;
+    }
+
+    // Trivially false.
+    if (_isTop(t1) || _isBottom(t2)) {
+      return false;
+    }
+
+    // Handle FutureOr<T> union type.
+    if (t1 is InterfaceType && t1.isDartAsyncFutureOr) {
+      var t1TypeArg = t1.typeArguments[0];
+      if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
+        var t2TypeArg = t2.typeArguments[0];
+        // FutureOr<A> <: FutureOr<B> iff A <: B
+        return isSubtypeOf(t1TypeArg, t2TypeArg);
+      }
+
+      // given t1 is Future<A> | A, then:
+      // (Future<A> | A) <: t2 iff Future<A> <: t2 and A <: t2.
+      var t1Future = typeProvider.futureType.instantiate([t1TypeArg]);
+      return isSubtypeOf(t1Future, t2) && isSubtypeOf(t1TypeArg, t2);
+    }
+
+    if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
+      // given t2 is Future<A> | A, then:
+      // t1 <: (Future<A> | A) iff t1 <: Future<A> or t1 <: A
+      var t2TypeArg = t2.typeArguments[0];
+      var t2Future = typeProvider.futureType.instantiate([t2TypeArg]);
+      return isSubtypeOf(t1, t2Future) || isSubtypeOf(t1, t2TypeArg);
+    }
+
+    // S <: T where S is a type variable
+    //  T is not dynamic or object (handled above)
+    //  True if T == S
+    //  Or true if bound of S is S' and S' <: T
+    if (t1 is TypeParameterType) {
+      if (t2 is TypeParameterType &&
+          t1.definition == t2.definition &&
+          _typeParameterBoundsSubtype(t1.bound, t2.bound, true)) {
+        return true;
+      }
+      DartType bound = t1.element.bound;
+      return bound == null
+          ? false
+          : _typeParameterBoundsSubtype(bound, t2, false);
+    }
+    if (t2 is TypeParameterType) {
+      return false;
+    }
+
+    // We've eliminated void, dynamic, bottom, type parameters, and FutureOr.
+    // The only cases are the combinations of interface type and function type.
+
+    // A function type can only subtype an interface type if
+    // the interface type is Function
+    if (t1 is FunctionType && t2 is InterfaceType) {
+      return t2.isDartCoreFunction;
+    }
+
+    if (t1 is InterfaceType && t2 is FunctionType) return false;
+
+    // Two interface types
+    if (t1 is InterfaceType && t2 is InterfaceType) {
+      return _isInterfaceSubtypeOf(t1, t2, null);
+    }
+
+    return _isFunctionSubtypeOf(t1, t2);
+  }
+
   /// Given a [type] T that may have an unknown type `?`, returns a type
   /// R such that R <: T for any type substituted for `?`.
   ///
@@ -856,91 +1587,6 @@
     return false;
   }
 
-  @override
-  bool isSubtypeOf(DartType t1, DartType t2) {
-    if (identical(t1, t2)) {
-      return true;
-    }
-
-    // The types are void, dynamic, bottom, interface types, function types,
-    // FutureOr<T> and type parameters.
-    //
-    // We proceed by eliminating these different classes from consideration.
-
-    // Trivially true.
-    //
-    // Note that `?` is treated as a top and a bottom type during inference,
-    // so it's also covered here.
-    if (_isTop(t2) || _isBottom(t1)) {
-      return true;
-    }
-
-    // Trivially false.
-    if (_isTop(t1) || _isBottom(t2)) {
-      return false;
-    }
-
-    // Handle FutureOr<T> union type.
-    if (t1 is InterfaceType && t1.isDartAsyncFutureOr) {
-      var t1TypeArg = t1.typeArguments[0];
-      if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
-        var t2TypeArg = t2.typeArguments[0];
-        // FutureOr<A> <: FutureOr<B> iff A <: B
-        return isSubtypeOf(t1TypeArg, t2TypeArg);
-      }
-
-      // given t1 is Future<A> | A, then:
-      // (Future<A> | A) <: t2 iff Future<A> <: t2 and A <: t2.
-      var t1Future = typeProvider.futureType.instantiate([t1TypeArg]);
-      return isSubtypeOf(t1Future, t2) && isSubtypeOf(t1TypeArg, t2);
-    }
-
-    if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
-      // given t2 is Future<A> | A, then:
-      // t1 <: (Future<A> | A) iff t1 <: Future<A> or t1 <: A
-      var t2TypeArg = t2.typeArguments[0];
-      var t2Future = typeProvider.futureType.instantiate([t2TypeArg]);
-      return isSubtypeOf(t1, t2Future) || isSubtypeOf(t1, t2TypeArg);
-    }
-
-    // S <: T where S is a type variable
-    //  T is not dynamic or object (handled above)
-    //  True if T == S
-    //  Or true if bound of S is S' and S' <: T
-    if (t1 is TypeParameterType) {
-      if (t2 is TypeParameterType &&
-          t1.definition == t2.definition &&
-          _typeParameterBoundsSubtype(t1.bound, t2.bound, true)) {
-        return true;
-      }
-      DartType bound = t1.element.bound;
-      return bound == null
-          ? false
-          : _typeParameterBoundsSubtype(bound, t2, false);
-    }
-    if (t2 is TypeParameterType) {
-      return false;
-    }
-
-    // We've eliminated void, dynamic, bottom, type parameters, and FutureOr.
-    // The only cases are the combinations of interface type and function type.
-
-    // A function type can only subtype an interface type if
-    // the interface type is Function
-    if (t1 is FunctionType && t2 is InterfaceType) {
-      return t2.isDartCoreFunction;
-    }
-
-    if (t1 is InterfaceType && t2 is FunctionType) return false;
-
-    // Two interface types
-    if (t1 is InterfaceType && t2 is InterfaceType) {
-      return _isInterfaceSubtypeOf(t1, t2, null);
-    }
-
-    return _isFunctionSubtypeOf(t1, t2);
-  }
-
   DartType _substituteForUnknownType(DartType type, {bool lowerBound: false}) {
     if (identical(type, UnknownInferredType.instance)) {
       if (lowerBound) {
@@ -1231,7 +1877,7 @@
   InterfaceType matchSupertypeConstraints(
       ClassElement mixinElement, List<DartType> srcs, List<DartType> dests) {
     var typeParameters = mixinElement.typeParameters;
-    var inferrer = new _GenericInferrer(typeProvider, this, typeParameters);
+    var inferrer = new GenericInferrer(typeProvider, this, typeParameters);
     for (int i = 0; i < srcs.length; i++) {
       inferrer.constrainReturnType(srcs[i], dests[i]);
       inferrer.constrainReturnType(dests[i], srcs[i]);
@@ -1659,575 +2305,6 @@
   T accept<T>(ElementVisitor visitor) => null;
 }
 
-/// Tracks upper and lower type bounds for a set of type parameters.
-///
-/// This class is used by calling [isSubtypeOf]. When it encounters one of
-/// the type parameters it is inferring, it will record the constraint, and
-/// optimistically assume the constraint will be satisfied.
-///
-/// For example if we are inferring type parameter A, and we ask if
-/// `A <: num`, this will record that A must be a subytpe of `num`. It also
-/// handles cases when A appears as part of the structure of another type, for
-/// example `Iterable<A> <: Iterable<num>` would infer the same constraint
-/// (due to covariant generic types) as would `() -> A <: () -> num`. In
-/// contrast `(A) -> void <: (num) -> void`.
-///
-/// Once the lower/upper bounds are determined, [infer] should be called to
-/// finish the inference. It will instantiate a generic function type with the
-/// inferred types for each type parameter.
-///
-/// It can also optionally compute a partial solution, in case some of the type
-/// parameters could not be inferred (because the constraints cannot be
-/// satisfied), or bail on the inference when this happens.
-///
-/// As currently designed, an instance of this class should only be used to
-/// infer a single call and discarded immediately afterwards.
-class _GenericInferrer {
-  final StrongTypeSystemImpl _typeSystem;
-  final TypeProvider typeProvider;
-  final Map<TypeParameterElement, List<_TypeConstraint>> _constraints;
-
-  /// Counter internally by [_matchSubtypeOf] to see if a recursive call
-  /// added anything to [_constraints].
-  ///
-  /// Essentially just an optimization for:
-  /// `_constraints.values.expand((x) => x).length`
-  int _constraintCount = 0;
-
-  _GenericInferrer(this.typeProvider, this._typeSystem,
-      Iterable<TypeParameterElement> typeFormals)
-      : _constraints = new HashMap(
-            equals: (x, y) => x.location == y.location,
-            hashCode: (x) => x.location.hashCode) {
-    for (var formal in typeFormals) {
-      _constraints[formal] = [];
-    }
-  }
-
-  /// Apply an argument constraint, which asserts that the [argument] staticType
-  /// is a subtype of the [parameterType].
-  void constrainArgument(
-      DartType argumentType, DartType parameterType, String parameterName,
-      {DartType genericType}) {
-    var origin = new _TypeConstraintFromArgument(
-        argumentType, parameterType, parameterName,
-        genericType: genericType);
-    _matchSubtypeOf(argumentType, parameterType, null, origin,
-        covariant: false);
-  }
-
-  /// Constrain a universal function type [fnType] used in a context
-  /// [contextType].
-  void constrainGenericFunctionInContext(
-      FunctionType fnType, DartType contextType) {
-    var origin = new _TypeConstraintFromFunctionContext(fnType, contextType);
-
-    // Since we're trying to infer the instantiation, we want to ignore type
-    // formals as we check the parameters and return type.
-    var inferFnType =
-        fnType.instantiate(TypeParameterTypeImpl.getTypes(fnType.typeFormals));
-    _matchSubtypeOf(inferFnType, contextType, null, origin, covariant: true);
-  }
-
-  /// Apply a return type constraint, which asserts that the [declaredType]
-  /// is a subtype of the [contextType].
-  void constrainReturnType(DartType declaredType, DartType contextType) {
-    var origin = new _TypeConstraintFromReturnType(declaredType, contextType);
-    _matchSubtypeOf(declaredType, contextType, null, origin, covariant: true);
-  }
-
-  /// Given the constraints that were given by calling [isSubtypeOf], find the
-  /// instantiation of the generic function that satisfies these constraints.
-  ///
-  /// If [downwardsInferPhase] is set, we are in the first pass of inference,
-  /// pushing context types down. At that point we are allowed to push down
-  /// `?` to precisely represent an unknown type. If [downwardsInferPhase] is
-  /// false, we are on our final inference pass, have all available information
-  /// including argument types, and must not conclude `?` for any type formal.
-  T infer<T extends ParameterizedType>(
-      T genericType, List<TypeParameterElement> typeFormals,
-      {bool considerExtendsClause: true,
-      ErrorReporter errorReporter,
-      AstNode errorNode,
-      bool downwardsInferPhase: false}) {
-    var fnTypeParams = TypeParameterTypeImpl.getTypes(typeFormals);
-
-    // Initialize the inferred type array.
-    //
-    // In the downwards phase, they all start as `?` to offer reasonable
-    // degradation for f-bounded type parameters.
-    var inferredTypes = new List<DartType>.filled(
-        fnTypeParams.length, UnknownInferredType.instance);
-    var _inferTypeParameter = downwardsInferPhase
-        ? _inferTypeParameterFromContext
-        : _inferTypeParameterFromAll;
-
-    for (int i = 0; i < fnTypeParams.length; i++) {
-      TypeParameterType typeParam = fnTypeParams[i];
-
-      var typeParamBound = typeParam.bound;
-      _TypeConstraint extendsClause;
-      if (considerExtendsClause && !typeParamBound.isDynamic) {
-        extendsClause = new _TypeConstraint.fromExtends(typeParam,
-            typeParam.bound.substitute2(inferredTypes, fnTypeParams));
-      }
-
-      var constraints = _constraints[typeParam.element];
-      inferredTypes[i] = _inferTypeParameter(constraints, extendsClause);
-    }
-
-    // If the downwards infer phase has failed, we'll catch this in the upwards
-    // phase later on.
-    if (downwardsInferPhase) {
-      return genericType.instantiate(inferredTypes) as T;
-    }
-
-    // Check the inferred types against all of the constraints.
-    var knownTypes = new HashMap<TypeParameterType, DartType>(
-        equals: (x, y) => x.element == y.element,
-        hashCode: (x) => x.element.hashCode);
-    for (int i = 0; i < fnTypeParams.length; i++) {
-      TypeParameterType typeParam = fnTypeParams[i];
-      var constraints = _constraints[typeParam.element];
-      var typeParamBound =
-          typeParam.bound.substitute2(inferredTypes, fnTypeParams);
-
-      var inferred = inferredTypes[i];
-      bool success =
-          constraints.every((c) => c.isSatisifedBy(_typeSystem, inferred));
-      if (success && !typeParamBound.isDynamic) {
-        // If everything else succeeded, check the `extends` constraint.
-        var extendsConstraint =
-            new _TypeConstraint.fromExtends(typeParam, typeParamBound);
-        constraints.add(extendsConstraint);
-        success = extendsConstraint.isSatisifedBy(_typeSystem, inferred);
-      }
-
-      if (!success) {
-        errorReporter?.reportErrorForNode(
-            StrongModeCode.COULD_NOT_INFER,
-            errorNode,
-            [typeParam, _formatError(typeParam, inferred, constraints)]);
-
-        // Heuristic: even if we failed, keep the erroneous type.
-        // It should satisfy at least some of the constraints (e.g. the return
-        // context). If we fall back to instantiateToBounds, we'll typically get
-        // more errors (e.g. because `dynamic` is the most common bound).
-      }
-
-      if (UnknownInferredType.isKnown(inferred)) {
-        knownTypes[typeParam] = inferred;
-      }
-    }
-
-    // Use instantiate to bounds to finish things off.
-    var hasError = new List<bool>.filled(fnTypeParams.length, false);
-    var result = _typeSystem.instantiateToBounds(genericType,
-        hasError: hasError, knownTypes: knownTypes) as T;
-
-    // Report any errors from instantiateToBounds.
-    for (int i = 0; i < hasError.length; i++) {
-      if (hasError[i]) {
-        TypeParameterType typeParam = fnTypeParams[i];
-        var typeParamBound =
-            typeParam.bound.substitute2(inferredTypes, fnTypeParams);
-        // TODO(jmesserly): improve this error message.
-        errorReporter
-            ?.reportErrorForNode(StrongModeCode.COULD_NOT_INFER, errorNode, [
-          typeParam,
-          "\nRecursive bound cannot be instantiated: '$typeParamBound'."
-              "\nConsider passing explicit type argument(s) "
-              "to the generic.\n\n'"
-        ]);
-      }
-    }
-    return result;
-  }
-
-  /// Choose the bound that was implied by the return type, if any.
-  ///
-  /// Which bound this is depends on what positions the type parameter
-  /// appears in. If the type only appears only in a contravariant position,
-  /// we will choose the lower bound instead.
-  ///
-  /// For example given:
-  ///
-  ///     Func1<T, bool> makeComparer<T>(T x) => (T y) => x() == y;
-  ///
-  ///     main() {
-  ///       Func1<num, bool> t = makeComparer/* infer <num> */(42);
-  ///       print(t(42.0)); /// false, no error.
-  ///     }
-  ///
-  /// The constraints we collect are:
-  ///
-  /// * `num <: T`
-  /// * `int <: T`
-  ///
-  /// ... and no upper bound. Therefore the lower bound is the best choice.
-  DartType _chooseTypeFromConstraints(Iterable<_TypeConstraint> constraints,
-      {bool toKnownType: false}) {
-    DartType lower = UnknownInferredType.instance;
-    DartType upper = UnknownInferredType.instance;
-    for (var constraint in constraints) {
-      // Given constraints:
-      //
-      //     L1 <: T <: U1
-      //     L2 <: T <: U2
-      //
-      // These can be combined to produce:
-      //
-      //     LUB(L1, L2) <: T <: GLB(U1, U2).
-      //
-      // This can then be done for all constraints in sequence.
-      //
-      // This resulting constraint may be unsatisfiable; in that case inference
-      // will fail.
-      upper = _getGreatestLowerBound(upper, constraint.upperBound);
-      lower = _typeSystem.getLeastUpperBound(lower, constraint.lowerBound);
-    }
-
-    // Prefer the known bound, if any.
-    // Otherwise take whatever bound has partial information, e.g. `Iterable<?>`
-    //
-    // For both of those, prefer the lower bound (arbitrary heuristic).
-    if (UnknownInferredType.isKnown(lower)) {
-      return lower;
-    }
-    if (UnknownInferredType.isKnown(upper)) {
-      return upper;
-    }
-    if (!identical(UnknownInferredType.instance, lower)) {
-      return toKnownType ? _typeSystem.lowerBoundForType(lower) : lower;
-    }
-    if (!identical(UnknownInferredType.instance, upper)) {
-      return toKnownType ? _typeSystem.upperBoundForType(upper) : upper;
-    }
-    return lower;
-  }
-
-  String _formatError(TypeParameterType typeParam, DartType inferred,
-      Iterable<_TypeConstraint> constraints) {
-    var intro = "Tried to infer '$inferred' for '$typeParam'"
-        " which doesn't work:";
-
-    var constraintsByOrigin = <_TypeConstraintOrigin, List<_TypeConstraint>>{};
-    for (var c in constraints) {
-      constraintsByOrigin.putIfAbsent(c.origin, () => []).add(c);
-    }
-
-    // Only report unique constraint origins.
-    Iterable<_TypeConstraint> isSatisified(bool expected) => constraintsByOrigin
-        .values
-        .where((l) =>
-            l.every((c) => c.isSatisifedBy(_typeSystem, inferred)) == expected)
-        .expand((i) => i);
-
-    String unsatisified = _formatConstraints(isSatisified(false));
-    String satisified = _formatConstraints(isSatisified(true));
-
-    assert(unsatisified.isNotEmpty);
-    if (satisified.isNotEmpty) {
-      satisified = "\nThe type '$inferred' was inferred from:\n$satisified";
-    }
-
-    return '\n\n$intro\n$unsatisified$satisified\n\n'
-        'Consider passing explicit type argument(s) to the generic.\n\n';
-  }
-
-  /// This is first calls strong mode's GLB, but if it fails to find anything
-  /// (i.e. returns the bottom type), we kick in a few additional rules:
-  ///
-  /// - `GLB(FutureOr<A>, B)` is defined as:
-  ///   - `GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>`
-  ///   - `GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>`
-  ///   - else `GLB(FutureOr<A>, B) == GLB(A, B)`
-  /// - `GLB(A, FutureOr<B>) ==  GLB(FutureOr<A>, B)` (defined above),
-  /// - else `GLB(A, B) == Null`
-  DartType _getGreatestLowerBound(DartType t1, DartType t2) {
-    var result = _typeSystem.getGreatestLowerBound(t1, t2);
-    if (result.isBottom) {
-      // See if we can do better by considering FutureOr rules.
-      if (t1 is InterfaceType && t1.isDartAsyncFutureOr) {
-        var t1TypeArg = t1.typeArguments[0];
-        if (t2 is InterfaceType) {
-          //  GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>
-          if (t2.isDartAsyncFutureOr) {
-            var t2TypeArg = t2.typeArguments[0];
-            return typeProvider.futureOrType
-                .instantiate([_getGreatestLowerBound(t1TypeArg, t2TypeArg)]);
-          }
-          // GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>
-          if (t2.isDartAsyncFuture) {
-            var t2TypeArg = t2.typeArguments[0];
-            return typeProvider.futureType
-                .instantiate([_getGreatestLowerBound(t1TypeArg, t2TypeArg)]);
-          }
-        }
-        // GLB(FutureOr<A>, B) == GLB(A, B)
-        return _getGreatestLowerBound(t1TypeArg, t2);
-      }
-      if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
-        // GLB(A, FutureOr<B>) ==  GLB(FutureOr<A>, B)
-        return _getGreatestLowerBound(t2, t1);
-      }
-      // TODO(jmesserly): fix this rule once we support non-nullable types.
-      return typeProvider.nullType;
-    }
-    return result;
-  }
-
-  DartType _inferTypeParameterFromAll(
-      List<_TypeConstraint> constraints, _TypeConstraint extendsClause) {
-    // See if we already fixed this type from downwards inference.
-    // If so, then we aren't allowed to change it based on argument types.
-    DartType t = _inferTypeParameterFromContext(
-        constraints.where((c) => c.isDownwards), extendsClause);
-    if (UnknownInferredType.isKnown(t)) {
-      // Remove constraints that aren't downward ones; we'll ignore these for
-      // error reporting, because inference already succeeded.
-      constraints.removeWhere((c) => !c.isDownwards);
-      return t;
-    }
-
-    if (extendsClause != null) {
-      constraints = constraints.toList()..add(extendsClause);
-    }
-
-    var choice = _chooseTypeFromConstraints(constraints, toKnownType: true);
-    return choice;
-  }
-
-  DartType _inferTypeParameterFromContext(
-      Iterable<_TypeConstraint> constraints, _TypeConstraint extendsClause) {
-    DartType t = _chooseTypeFromConstraints(constraints);
-    if (UnknownInferredType.isUnknown(t)) {
-      return t;
-    }
-
-    // If we're about to make our final choice, apply the extends clause.
-    // This gives us a chance to refine the choice, in case it would violate
-    // the `extends` clause. For example:
-    //
-    //     Object obj = math.min/*<infer Object, error>*/(1, 2);
-    //
-    // If we consider the `T extends num` we conclude `<num>`, which works.
-    if (extendsClause != null) {
-      constraints = constraints.toList()..add(extendsClause);
-      return _chooseTypeFromConstraints(constraints);
-    }
-    return t;
-  }
-
-  void _matchInterfaceSubtypeOf(InterfaceType i1, InterfaceType i2,
-      Set<Element> visited, _TypeConstraintOrigin origin,
-      {bool covariant}) {
-    if (identical(i1, i2)) {
-      return;
-    }
-
-    if (i1.element == i2.element) {
-      List<DartType> tArgs1 = i1.typeArguments;
-      List<DartType> tArgs2 = i2.typeArguments;
-      assert(tArgs1.length == tArgs2.length);
-      for (int i = 0; i < tArgs1.length; i++) {
-        _matchSubtypeOf(tArgs1[i], tArgs2[i], visited, origin,
-            covariant: covariant);
-      }
-      return;
-    }
-    if (i1.isObject) {
-      return;
-    }
-
-    // Guard against loops in the class hierarchy
-    //
-    // TODO(jmesserly): this function isn't guarding against anything (it's not
-    // passsing down `visitedSet`, so adding the element has no effect).
-    //
-    // If that's fixed, it breaks inference tests for types like
-    // `Iterable<Iterable<?>>` matched aganinst `List<List<int>>`.
-    //
-    // The fix is for type arguments (above) to not pass down `visited`, similar
-    // to how _isInterfaceSubtypeOf does not pass down `visited` for type
-    // arguments.
-    void guardedInterfaceSubtype(InterfaceType t1) {
-      var visitedSet = visited ?? new HashSet<Element>();
-      if (visitedSet.add(t1.element)) {
-        _matchInterfaceSubtypeOf(t1, i2, visited, origin, covariant: covariant);
-        visitedSet.remove(t1.element);
-      }
-    }
-
-    guardedInterfaceSubtype(i1.superclass);
-    for (final parent in i1.interfaces) {
-      guardedInterfaceSubtype(parent);
-    }
-    for (final parent in i1.mixins) {
-      guardedInterfaceSubtype(parent);
-    }
-  }
-
-  /// Assert that [t1] will be a subtype of [t2], and returns if the constraint
-  /// can be satisfied.
-  ///
-  /// [covariant] must be true if [t1] is a declared type of the generic
-  /// function and [t2] is the context type, or false if the reverse. For
-  /// example [covariant] is used when [t1] is the declared return type
-  /// and [t2] is the context type. Contravariant would be used if [t1] is the
-  /// argument type (i.e. passed in to the generic function) and [t2] is the
-  /// declared parameter type.
-  ///
-  /// [origin] indicates where the constraint came from, for example an argument
-  /// or return type.
-  void _matchSubtypeOf(DartType t1, DartType t2, Set<Element> visited,
-      _TypeConstraintOrigin origin,
-      {bool covariant}) {
-    if (covariant && t1 is TypeParameterType) {
-      var constraints = _constraints[t1.element];
-      if (constraints != null) {
-        if (!identical(t2, UnknownInferredType.instance)) {
-          constraints.add(new _TypeConstraint(origin, t1, upper: t2));
-          _constraintCount++;
-        }
-        return;
-      }
-    }
-    if (!covariant && t2 is TypeParameterType) {
-      var constraints = _constraints[t2.element];
-      if (constraints != null) {
-        if (!identical(t1, UnknownInferredType.instance)) {
-          constraints.add(new _TypeConstraint(origin, t2, lower: t1));
-          _constraintCount++;
-        }
-        return;
-      }
-    }
-
-    if (identical(t1, t2)) {
-      return;
-    }
-
-    // TODO(jmesserly): this logic is taken from subtype.
-    void matchSubtype(DartType t1, DartType t2) {
-      _matchSubtypeOf(t1, t2, null, origin, covariant: covariant);
-    }
-
-    // Handle FutureOr<T> union type.
-    if (t1 is InterfaceType && t1.isDartAsyncFutureOr) {
-      var t1TypeArg = t1.typeArguments[0];
-      if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
-        var t2TypeArg = t2.typeArguments[0];
-        // FutureOr<A> <: FutureOr<B> iff A <: B
-        matchSubtype(t1TypeArg, t2TypeArg);
-        return;
-      }
-
-      // given t1 is Future<A> | A, then:
-      // (Future<A> | A) <: t2 iff Future<A> <: t2 and A <: t2.
-      var t1Future = typeProvider.futureType.instantiate([t1TypeArg]);
-      matchSubtype(t1Future, t2);
-      matchSubtype(t1TypeArg, t2);
-      return;
-    }
-
-    if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
-      // given t2 is Future<A> | A, then:
-      // t1 <: (Future<A> | A) iff t1 <: Future<A> or t1 <: A
-      var t2TypeArg = t2.typeArguments[0];
-      var t2Future = typeProvider.futureType.instantiate([t2TypeArg]);
-
-      int constraintCount = _constraintCount;
-      matchSubtype(t1, t2Future);
-
-      // We only want to record these as "or" constraints, so if we matched
-      // the `t1 <: Future<A>` constraint, don't add `t1 <: A` constraint, as
-      // that would be interpreted incorrectly as `t1 <: Future<A> && t1 <: A`.
-      if (constraintCount == _constraintCount) {
-        matchSubtype(t1, t2TypeArg);
-      }
-      return;
-    }
-
-    // S <: T where S is a type variable
-    //  T is not dynamic or object (handled above)
-    //  True if T == S
-    //  Or true if bound of S is S' and S' <: T
-
-    if (t1 is TypeParameterType) {
-      // Guard against recursive type parameters
-      //
-      // TODO(jmesserly): this function isn't guarding against anything (it's
-      // not passsing down `visitedSet`, so adding the element has no effect).
-      void guardedSubtype(DartType t1, DartType t2) {
-        var visitedSet = visited ?? new HashSet<Element>();
-        if (visitedSet.add(t1.element)) {
-          matchSubtype(t1, t2);
-          visitedSet.remove(t1.element);
-        }
-      }
-
-      if (t2 is TypeParameterType && t1.definition == t2.definition) {
-        guardedSubtype(t1.bound, t2.bound);
-        return;
-      }
-      guardedSubtype(t1.bound, t2);
-      return;
-    }
-    if (t2 is TypeParameterType) {
-      return;
-    }
-
-    if (t1 is InterfaceType && t2 is InterfaceType) {
-      _matchInterfaceSubtypeOf(t1, t2, visited, origin, covariant: covariant);
-      return;
-    }
-
-    if (t1 is FunctionType && t2 is FunctionType) {
-      FunctionTypeImpl.relate(
-          t1,
-          t2,
-          (t1, t2) {
-            // TODO(jmesserly): should we flip covariance when we're relating
-            // type formal bounds? They're more like parameters.
-            matchSubtype(t1, t2);
-            return true;
-          },
-          _typeSystem.instantiateToBounds,
-          parameterRelation: (p1, p2) {
-            _matchSubtypeOf(p2.type, p1.type, null, origin,
-                covariant: !covariant);
-            return true;
-          });
-    }
-  }
-
-  static String _formatConstraints(Iterable<_TypeConstraint> constraints) {
-    List<List<String>> lineParts =
-        new Set<_TypeConstraintOrigin>.from(constraints.map((c) => c.origin))
-            .map((o) => o.formatError())
-            .toList();
-
-    int prefixMax = lineParts.map((p) => p[0].length).fold(0, math.max);
-
-    // Use a set to prevent identical message lines.
-    // (It's not uncommon for the same constraint to show up in a few places.)
-    var messageLines = new Set<String>.from(lineParts.map((parts) {
-      var prefix = parts[0];
-      var middle = parts[1];
-      var prefixPad = ' ' * (prefixMax - prefix.length);
-      var middlePad = ' ' * (prefixMax);
-      var end = "";
-      if (parts.length > 2) {
-        end = '\n  $middlePad ${parts[2]}';
-      }
-      return '  $prefix$prefixPad $middle$end';
-    }));
-
-    return messageLines.join('\n');
-  }
-}
-
 /// A constraint on a type parameter that we're inferring.
 class _TypeConstraint extends _TypeRange {
   /// The type parameter that is constrained by [lowerBound] or [upperBound].
@@ -2393,4 +2470,22 @@
   _TypeRange({DartType lower, DartType upper})
       : lowerBound = lower ?? UnknownInferredType.instance,
         upperBound = upper ?? UnknownInferredType.instance;
+
+  /// Formats the typeRange as a string suitable for unit testing.
+  ///
+  /// For example, if [typeName] is 'T' and the range has bounds int and Object
+  /// respectively, the returned string will be 'int <: T <: Object'.
+  @visibleForTesting
+  String format(String typeName) {
+    var lowerString = identical(lowerBound, UnknownInferredType.instance)
+        ? ''
+        : '$lowerBound <: ';
+    var upperString = identical(upperBound, UnknownInferredType.instance)
+        ? ''
+        : ' <: $upperBound';
+    return '$lowerString$typeName$upperString';
+  }
+
+  @override
+  String toString() => format('(type)');
 }
diff --git a/pkg/analyzer/test/generated/parser_forest_test.dart b/pkg/analyzer/test/generated/parser_forest_test.dart
new file mode 100644
index 0000000..7b9bc03
--- /dev/null
+++ b/pkg/analyzer/test/generated/parser_forest_test.dart
@@ -0,0 +1,1291 @@
+// 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:async';
+import 'dart:io' show File;
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/fasta/ast_building_factory.dart';
+import "package:front_end/src/api_prototype/front_end.dart";
+import "package:front_end/src/api_prototype/memory_file_system.dart";
+import "package:front_end/src/base/processed_options.dart";
+import "package:front_end/src/compute_platform_binaries_location.dart";
+import 'package:front_end/src/fasta/compiler_context.dart';
+import 'package:front_end/src/fasta/constant_context.dart';
+import 'package:front_end/src/fasta/dill/built_type_builder.dart';
+import 'package:front_end/src/fasta/dill/dill_target.dart';
+import "package:front_end/src/fasta/fasta_codes.dart";
+import 'package:front_end/src/fasta/kernel/body_builder.dart';
+import 'package:front_end/src/fasta/kernel/forest.dart';
+import 'package:front_end/src/fasta/kernel/kernel_builder.dart';
+import "package:front_end/src/fasta/kernel/kernel_target.dart";
+import 'package:front_end/src/fasta/modifier.dart' as Modifier;
+import 'package:front_end/src/fasta/parser/parser.dart';
+import 'package:front_end/src/fasta/scanner.dart';
+import 'package:front_end/src/fasta/ticker.dart';
+import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
+import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
+import 'package:front_end/src/fasta/uri_translator_impl.dart';
+import 'package:front_end/src/scanner/token.dart';
+import 'package:kernel/class_hierarchy.dart' as kernel;
+import 'package:kernel/core_types.dart' as kernel;
+import 'package:kernel/kernel.dart' as kernel;
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'parser_test.dart';
+
+main() async {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExpressionParserTest_Forest);
+  });
+}
+
+/**
+ * Tests of the fasta parser based on [ExpressionParserTestMixin].
+ */
+@reflectiveTest
+class ExpressionParserTest_Forest extends FastaParserTestCase
+    with ExpressionParserTestMixin {
+  @failingTest
+  void test_1_plus_2() {
+    Expression expression = parseAdditiveExpression('1 + 2');
+    expect(expression, isNotNull);
+    assertNoErrors();
+    var binaryExpression = expression as BinaryExpression;
+    expect(binaryExpression.leftOperand, isNotNull);
+    expect(binaryExpression.operator, isNotNull);
+    expect(binaryExpression.operator.type, TokenType.PLUS);
+    expect(binaryExpression.rightOperand, isNotNull);
+  }
+
+  @failingTest
+  void test_namedArgument() {
+    super.test_namedArgument();
+  }
+
+  @failingTest
+  void test_parseAdditiveExpression_normal() {
+    super.test_parseAdditiveExpression_normal();
+  }
+
+  @failingTest
+  void test_parseAdditiveExpression_super() {
+    super.test_parseAdditiveExpression_super();
+  }
+
+  @failingTest
+  void test_parseAssignableExpression_expression_args_dot() {
+    super.test_parseAssignableExpression_expression_args_dot();
+  }
+
+  @failingTest
+  void
+      test_parseAssignableExpression_expression_args_dot_typeArgumentComments() {
+    super
+        .test_parseAssignableExpression_expression_args_dot_typeArgumentComments();
+  }
+
+  @failingTest
+  void test_parseAssignableExpression_expression_args_dot_typeArguments() {
+    super.test_parseAssignableExpression_expression_args_dot_typeArguments();
+  }
+
+  @failingTest
+  void test_parseAssignableExpression_expression_dot() {
+    super.test_parseAssignableExpression_expression_dot();
+  }
+
+  @failingTest
+  void test_parseAssignableExpression_expression_index() {
+    super.test_parseAssignableExpression_expression_index();
+  }
+
+  @failingTest
+  void test_parseAssignableExpression_expression_question_dot() {
+    super.test_parseAssignableExpression_expression_question_dot();
+  }
+
+  @failingTest
+  void test_parseAssignableExpression_identifier() {
+    super.test_parseAssignableExpression_identifier();
+  }
+
+  @failingTest
+  void test_parseAssignableExpression_identifier_args_dot() {
+    super.test_parseAssignableExpression_identifier_args_dot();
+  }
+
+  @failingTest
+  void
+      test_parseAssignableExpression_identifier_args_dot_typeArgumentComments() {
+    super
+        .test_parseAssignableExpression_identifier_args_dot_typeArgumentComments();
+  }
+
+  @failingTest
+  void test_parseAssignableExpression_identifier_args_dot_typeArguments() {
+    super.test_parseAssignableExpression_identifier_args_dot_typeArguments();
+  }
+
+  @failingTest
+  void test_parseAssignableExpression_identifier_dot() {
+    super.test_parseAssignableExpression_identifier_dot();
+  }
+
+  @failingTest
+  void test_parseAssignableExpression_identifier_index() {
+    super.test_parseAssignableExpression_identifier_index();
+  }
+
+  @failingTest
+  void test_parseAssignableExpression_identifier_question_dot() {
+    super.test_parseAssignableExpression_identifier_question_dot();
+  }
+
+  @failingTest
+  void test_parseAssignableExpression_super_dot() {
+    super.test_parseAssignableExpression_super_dot();
+  }
+
+  @failingTest
+  void test_parseAssignableExpression_super_index() {
+    super.test_parseAssignableExpression_super_index();
+  }
+
+  @failingTest
+  void test_parseAssignableSelector_dot() {
+    super.test_parseAssignableSelector_dot();
+  }
+
+  @failingTest
+  void test_parseAssignableSelector_index() {
+    super.test_parseAssignableSelector_index();
+  }
+
+  @failingTest
+  void test_parseAssignableSelector_none() {
+    super.test_parseAssignableSelector_none();
+  }
+
+  @failingTest
+  void test_parseAssignableSelector_question_dot() {
+    super.test_parseAssignableSelector_question_dot();
+  }
+
+  @failingTest
+  void test_parseAwaitExpression() {
+    super.test_parseAwaitExpression();
+  }
+
+  @failingTest
+  void test_parseBitwiseAndExpression_normal() {
+    super.test_parseBitwiseAndExpression_normal();
+  }
+
+  @failingTest
+  void test_parseBitwiseAndExpression_super() {
+    super.test_parseBitwiseAndExpression_super();
+  }
+
+  @failingTest
+  void test_parseBitwiseOrExpression_normal() {
+    super.test_parseBitwiseOrExpression_normal();
+  }
+
+  @failingTest
+  void test_parseBitwiseOrExpression_super() {
+    super.test_parseBitwiseOrExpression_super();
+  }
+
+  @failingTest
+  void test_parseBitwiseXorExpression_normal() {
+    super.test_parseBitwiseXorExpression_normal();
+  }
+
+  @failingTest
+  void test_parseBitwiseXorExpression_super() {
+    super.test_parseBitwiseXorExpression_super();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_i() {
+    super.test_parseCascadeSection_i();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_ia() {
+    super.test_parseCascadeSection_ia();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_ia_typeArgumentComments() {
+    super.test_parseCascadeSection_ia_typeArgumentComments();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_ia_typeArguments() {
+    super.test_parseCascadeSection_ia_typeArguments();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_ii() {
+    super.test_parseCascadeSection_ii();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_ii_typeArgumentComments() {
+    super.test_parseCascadeSection_ii_typeArgumentComments();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_ii_typeArguments() {
+    super.test_parseCascadeSection_ii_typeArguments();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_p() {
+    super.test_parseCascadeSection_p();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_p_assign() {
+    super.test_parseCascadeSection_p_assign();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_p_assign_withCascade() {
+    super.test_parseCascadeSection_p_assign_withCascade();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_p_assign_withCascade_typeArgumentComments() {
+    super.test_parseCascadeSection_p_assign_withCascade_typeArgumentComments();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_p_assign_withCascade_typeArguments() {
+    super.test_parseCascadeSection_p_assign_withCascade_typeArguments();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_p_builtIn() {
+    super.test_parseCascadeSection_p_builtIn();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_pa() {
+    super.test_parseCascadeSection_pa();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_pa_typeArgumentComments() {
+    super.test_parseCascadeSection_pa_typeArgumentComments();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_pa_typeArguments() {
+    super.test_parseCascadeSection_pa_typeArguments();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_paa() {
+    super.test_parseCascadeSection_paa();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_paa_typeArgumentComments() {
+    super.test_parseCascadeSection_paa_typeArgumentComments();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_paa_typeArguments() {
+    super.test_parseCascadeSection_paa_typeArguments();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_paapaa() {
+    super.test_parseCascadeSection_paapaa();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_paapaa_typeArgumentComments() {
+    super.test_parseCascadeSection_paapaa_typeArgumentComments();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_paapaa_typeArguments() {
+    super.test_parseCascadeSection_paapaa_typeArguments();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_pap() {
+    super.test_parseCascadeSection_pap();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_pap_typeArgumentComments() {
+    super.test_parseCascadeSection_pap_typeArgumentComments();
+  }
+
+  @failingTest
+  void test_parseCascadeSection_pap_typeArguments() {
+    super.test_parseCascadeSection_pap_typeArguments();
+  }
+
+  @failingTest
+  void test_parseConditionalExpression() {
+    super.test_parseConditionalExpression();
+  }
+
+  @failingTest
+  void test_parseConstExpression_instanceCreation() {
+    super.test_parseConstExpression_instanceCreation();
+  }
+
+  @failingTest
+  void test_parseConstExpression_listLiteral_typed() {
+    super.test_parseConstExpression_listLiteral_typed();
+  }
+
+  @failingTest
+  void test_parseConstExpression_listLiteral_typed_genericComment() {
+    super.test_parseConstExpression_listLiteral_typed_genericComment();
+  }
+
+  @failingTest
+  void test_parseConstExpression_listLiteral_untyped() {
+    super.test_parseConstExpression_listLiteral_untyped();
+  }
+
+  @failingTest
+  void test_parseConstExpression_mapLiteral_typed() {
+    super.test_parseConstExpression_mapLiteral_typed();
+  }
+
+  @failingTest
+  void test_parseConstExpression_mapLiteral_typed_genericComment() {
+    super.test_parseConstExpression_mapLiteral_typed_genericComment();
+  }
+
+  @failingTest
+  void test_parseConstExpression_mapLiteral_untyped() {
+    super.test_parseConstExpression_mapLiteral_untyped();
+  }
+
+  @failingTest
+  void test_parseEqualityExpression_normal() {
+    super.test_parseEqualityExpression_normal();
+  }
+
+  @failingTest
+  void test_parseEqualityExpression_super() {
+    super.test_parseEqualityExpression_super();
+  }
+
+  @failingTest
+  void test_parseExpression_assign() {
+    super.test_parseExpression_assign();
+  }
+
+  @failingTest
+  void test_parseExpression_assign_compound() {
+    super.test_parseExpression_assign_compound();
+  }
+
+  @failingTest
+  void test_parseExpression_comparison() {
+    super.test_parseExpression_comparison();
+  }
+
+  @failingTest
+  void test_parseExpression_function_async() {
+    super.test_parseExpression_function_async();
+  }
+
+  @failingTest
+  void test_parseExpression_function_asyncStar() {
+    super.test_parseExpression_function_asyncStar();
+  }
+
+  @failingTest
+  void test_parseExpression_function_sync() {
+    super.test_parseExpression_function_sync();
+  }
+
+  @failingTest
+  void test_parseExpression_function_syncStar() {
+    super.test_parseExpression_function_syncStar();
+  }
+
+  @failingTest
+  void test_parseExpression_invokeFunctionExpression() {
+    super.test_parseExpression_invokeFunctionExpression();
+  }
+
+  @failingTest
+  void test_parseExpression_nonAwait() {
+    super.test_parseExpression_nonAwait();
+  }
+
+  @failingTest
+  void test_parseExpression_superMethodInvocation() {
+    super.test_parseExpression_superMethodInvocation();
+  }
+
+  @failingTest
+  void test_parseExpression_superMethodInvocation_typeArgumentComments() {
+    super.test_parseExpression_superMethodInvocation_typeArgumentComments();
+  }
+
+  @failingTest
+  void test_parseExpression_superMethodInvocation_typeArguments() {
+    super.test_parseExpression_superMethodInvocation_typeArguments();
+  }
+
+  @failingTest
+  void test_parseExpression_superMethodInvocation_typeArguments_chained() {
+    super.test_parseExpression_superMethodInvocation_typeArguments_chained();
+  }
+
+  @failingTest
+  void test_parseExpressionList_multiple() {
+    super.test_parseExpressionList_multiple();
+  }
+
+  @failingTest
+  void test_parseExpressionList_single() {
+    super.test_parseExpressionList_single();
+  }
+
+  @failingTest
+  void test_parseExpressionWithoutCascade_assign() {
+    super.test_parseExpressionWithoutCascade_assign();
+  }
+
+  @failingTest
+  void test_parseExpressionWithoutCascade_comparison() {
+    super.test_parseExpressionWithoutCascade_comparison();
+  }
+
+  @failingTest
+  void test_parseExpressionWithoutCascade_superMethodInvocation() {
+    super.test_parseExpressionWithoutCascade_superMethodInvocation();
+  }
+
+  @failingTest
+  void
+      test_parseExpressionWithoutCascade_superMethodInvocation_typeArgumentComments() {
+    super
+        .test_parseExpressionWithoutCascade_superMethodInvocation_typeArgumentComments();
+  }
+
+  @failingTest
+  void
+      test_parseExpressionWithoutCascade_superMethodInvocation_typeArguments() {
+    super
+        .test_parseExpressionWithoutCascade_superMethodInvocation_typeArguments();
+  }
+
+  @failingTest
+  void test_parseFunctionExpression_body_inExpression() {
+    super.test_parseFunctionExpression_body_inExpression();
+  }
+
+  @failingTest
+  void test_parseFunctionExpression_typeParameterComments() {
+    super.test_parseFunctionExpression_typeParameterComments();
+  }
+
+  @failingTest
+  void test_parseFunctionExpression_typeParameters() {
+    super.test_parseFunctionExpression_typeParameters();
+  }
+
+  @failingTest
+  void test_parseInstanceCreationExpression_qualifiedType() {
+    super.test_parseInstanceCreationExpression_qualifiedType();
+  }
+
+  @failingTest
+  void test_parseInstanceCreationExpression_qualifiedType_named() {
+    super.test_parseInstanceCreationExpression_qualifiedType_named();
+  }
+
+  @failingTest
+  void
+      test_parseInstanceCreationExpression_qualifiedType_named_typeArgumentComments() {
+    super
+        .test_parseInstanceCreationExpression_qualifiedType_named_typeArgumentComments();
+  }
+
+  @failingTest
+  void
+      test_parseInstanceCreationExpression_qualifiedType_named_typeArguments() {
+    super
+        .test_parseInstanceCreationExpression_qualifiedType_named_typeArguments();
+  }
+
+  @failingTest
+  void
+      test_parseInstanceCreationExpression_qualifiedType_typeArgumentComments() {
+    super
+        .test_parseInstanceCreationExpression_qualifiedType_typeArgumentComments();
+  }
+
+  @failingTest
+  void test_parseInstanceCreationExpression_qualifiedType_typeArguments() {
+    super.test_parseInstanceCreationExpression_qualifiedType_typeArguments();
+  }
+
+  @failingTest
+  void test_parseInstanceCreationExpression_type() {
+    super.test_parseInstanceCreationExpression_type();
+  }
+
+  @failingTest
+  void test_parseInstanceCreationExpression_type_named() {
+    super.test_parseInstanceCreationExpression_type_named();
+  }
+
+  @failingTest
+  void test_parseInstanceCreationExpression_type_named_typeArgumentComments() {
+    super
+        .test_parseInstanceCreationExpression_type_named_typeArgumentComments();
+  }
+
+  @failingTest
+  void test_parseInstanceCreationExpression_type_named_typeArguments() {
+    super.test_parseInstanceCreationExpression_type_named_typeArguments();
+  }
+
+  @failingTest
+  void test_parseInstanceCreationExpression_type_typeArgumentComments() {
+    super.test_parseInstanceCreationExpression_type_typeArgumentComments();
+  }
+
+  @failingTest
+  void test_parseInstanceCreationExpression_type_typeArguments() {
+    super.test_parseInstanceCreationExpression_type_typeArguments();
+  }
+
+  @failingTest
+  void test_parseListLiteral_empty_oneToken() {
+    super.test_parseListLiteral_empty_oneToken();
+  }
+
+  @failingTest
+  void test_parseListLiteral_empty_oneToken_withComment() {
+    super.test_parseListLiteral_empty_oneToken_withComment();
+  }
+
+  @failingTest
+  void test_parseListLiteral_empty_twoTokens() {
+    super.test_parseListLiteral_empty_twoTokens();
+  }
+
+  @failingTest
+  void test_parseListLiteral_multiple() {
+    super.test_parseListLiteral_multiple();
+  }
+
+  @failingTest
+  void test_parseListLiteral_single() {
+    super.test_parseListLiteral_single();
+  }
+
+  @failingTest
+  void test_parseListLiteral_single_withTypeArgument() {
+    super.test_parseListLiteral_single_withTypeArgument();
+  }
+
+  @failingTest
+  void test_parseListOrMapLiteral_list_noType() {
+    super.test_parseListOrMapLiteral_list_noType();
+  }
+
+  @failingTest
+  void test_parseListOrMapLiteral_list_type() {
+    super.test_parseListOrMapLiteral_list_type();
+  }
+
+  @failingTest
+  void test_parseListOrMapLiteral_map_noType() {
+    super.test_parseListOrMapLiteral_map_noType();
+  }
+
+  @failingTest
+  void test_parseListOrMapLiteral_map_type() {
+    super.test_parseListOrMapLiteral_map_type();
+  }
+
+  @failingTest
+  void test_parseLogicalAndExpression() {
+    super.test_parseLogicalAndExpression();
+  }
+
+  @failingTest
+  void test_parseLogicalOrExpression() {
+    super.test_parseLogicalOrExpression();
+  }
+
+  @failingTest
+  void test_parseMapLiteral_empty() {
+    super.test_parseMapLiteral_empty();
+  }
+
+  @failingTest
+  void test_parseMapLiteral_multiple() {
+    super.test_parseMapLiteral_multiple();
+  }
+
+  @failingTest
+  void test_parseMapLiteral_single() {
+    super.test_parseMapLiteral_single();
+  }
+
+  @failingTest
+  void test_parseMapLiteralEntry_complex() {
+    super.test_parseMapLiteralEntry_complex();
+  }
+
+  @failingTest
+  void test_parseMapLiteralEntry_int() {
+    super.test_parseMapLiteralEntry_int();
+  }
+
+  @failingTest
+  void test_parseMapLiteralEntry_string() {
+    super.test_parseMapLiteralEntry_string();
+  }
+
+  @failingTest
+  void test_parseMultiplicativeExpression_normal() {
+    super.test_parseMultiplicativeExpression_normal();
+  }
+
+  @failingTest
+  void test_parseMultiplicativeExpression_super() {
+    super.test_parseMultiplicativeExpression_super();
+  }
+
+  @failingTest
+  void test_parseNewExpression() {
+    super.test_parseNewExpression();
+  }
+
+  @failingTest
+  void test_parsePostfixExpression_decrement() {
+    super.test_parsePostfixExpression_decrement();
+  }
+
+  @failingTest
+  void test_parsePostfixExpression_increment() {
+    super.test_parsePostfixExpression_increment();
+  }
+
+  @failingTest
+  void test_parsePostfixExpression_none_indexExpression() {
+    super.test_parsePostfixExpression_none_indexExpression();
+  }
+
+  @failingTest
+  void test_parsePostfixExpression_none_methodInvocation() {
+    super.test_parsePostfixExpression_none_methodInvocation();
+  }
+
+  @failingTest
+  void test_parsePostfixExpression_none_methodInvocation_question_dot() {
+    super.test_parsePostfixExpression_none_methodInvocation_question_dot();
+  }
+
+  @failingTest
+  void
+      test_parsePostfixExpression_none_methodInvocation_question_dot_typeArgumentComments() {
+    super
+        .test_parsePostfixExpression_none_methodInvocation_question_dot_typeArgumentComments();
+  }
+
+  @failingTest
+  void
+      test_parsePostfixExpression_none_methodInvocation_question_dot_typeArguments() {
+    super
+        .test_parsePostfixExpression_none_methodInvocation_question_dot_typeArguments();
+  }
+
+  @failingTest
+  void
+      test_parsePostfixExpression_none_methodInvocation_typeArgumentComments() {
+    super
+        .test_parsePostfixExpression_none_methodInvocation_typeArgumentComments();
+  }
+
+  @failingTest
+  void test_parsePostfixExpression_none_methodInvocation_typeArguments() {
+    super.test_parsePostfixExpression_none_methodInvocation_typeArguments();
+  }
+
+  @failingTest
+  void test_parsePostfixExpression_none_propertyAccess() {
+    super.test_parsePostfixExpression_none_propertyAccess();
+  }
+
+  @failingTest
+  void test_parsePrefixedIdentifier_noPrefix() {
+    super.test_parsePrefixedIdentifier_noPrefix();
+  }
+
+  @failingTest
+  void test_parsePrefixedIdentifier_prefix() {
+    super.test_parsePrefixedIdentifier_prefix();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_const() {
+    super.test_parsePrimaryExpression_const();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_double() {
+    super.test_parsePrimaryExpression_double();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_false() {
+    super.test_parsePrimaryExpression_false();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_function_arguments() {
+    super.test_parsePrimaryExpression_function_arguments();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_function_noArguments() {
+    super.test_parsePrimaryExpression_function_noArguments();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_genericFunctionExpression() {
+    super.test_parsePrimaryExpression_genericFunctionExpression();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_hex() {
+    super.test_parsePrimaryExpression_hex();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_identifier() {
+    super.test_parsePrimaryExpression_identifier();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_int() {
+    super.test_parsePrimaryExpression_int();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_listLiteral() {
+    super.test_parsePrimaryExpression_listLiteral();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_listLiteral_index() {
+    super.test_parsePrimaryExpression_listLiteral_index();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_listLiteral_typed() {
+    super.test_parsePrimaryExpression_listLiteral_typed();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_listLiteral_typed_genericComment() {
+    super.test_parsePrimaryExpression_listLiteral_typed_genericComment();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_mapLiteral() {
+    super.test_parsePrimaryExpression_mapLiteral();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_mapLiteral_typed() {
+    super.test_parsePrimaryExpression_mapLiteral_typed();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_mapLiteral_typed_genericComment() {
+    super.test_parsePrimaryExpression_mapLiteral_typed_genericComment();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_new() {
+    super.test_parsePrimaryExpression_new();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_null() {
+    super.test_parsePrimaryExpression_null();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_parenthesized() {
+    super.test_parsePrimaryExpression_parenthesized();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_string() {
+    super.test_parsePrimaryExpression_string();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_string_multiline() {
+    super.test_parsePrimaryExpression_string_multiline();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_string_raw() {
+    super.test_parsePrimaryExpression_string_raw();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_super() {
+    super.test_parsePrimaryExpression_super();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_this() {
+    super.test_parsePrimaryExpression_this();
+  }
+
+  @failingTest
+  void test_parsePrimaryExpression_true() {
+    super.test_parsePrimaryExpression_true();
+  }
+
+  @failingTest
+  void test_parseRedirectingConstructorInvocation_named() {
+    super.test_parseRedirectingConstructorInvocation_named();
+  }
+
+  @failingTest
+  void test_parseRedirectingConstructorInvocation_unnamed() {
+    super.test_parseRedirectingConstructorInvocation_unnamed();
+  }
+
+  @failingTest
+  void test_parseRelationalExpression_as_functionType_noReturnType() {
+    super.test_parseRelationalExpression_as_functionType_noReturnType();
+  }
+
+  @failingTest
+  void test_parseRelationalExpression_as_functionType_returnType() {
+    super.test_parseRelationalExpression_as_functionType_returnType();
+  }
+
+  @failingTest
+  void test_parseRelationalExpression_as_generic() {
+    super.test_parseRelationalExpression_as_generic();
+  }
+
+  @failingTest
+  void test_parseRelationalExpression_as_simple() {
+    super.test_parseRelationalExpression_as_simple();
+  }
+
+  @failingTest
+  void test_parseRelationalExpression_as_simple_function() {
+    super.test_parseRelationalExpression_as_simple_function();
+  }
+
+  @failingTest
+  void test_parseRelationalExpression_is() {
+    super.test_parseRelationalExpression_is();
+  }
+
+  @failingTest
+  void test_parseRelationalExpression_isNot() {
+    super.test_parseRelationalExpression_isNot();
+  }
+
+  @failingTest
+  void test_parseRelationalExpression_normal() {
+    super.test_parseRelationalExpression_normal();
+  }
+
+  @failingTest
+  void test_parseRelationalExpression_super() {
+    super.test_parseRelationalExpression_super();
+  }
+
+  @failingTest
+  void test_parseRethrowExpression() {
+    super.test_parseRethrowExpression();
+  }
+
+  @failingTest
+  void test_parseShiftExpression_normal() {
+    super.test_parseShiftExpression_normal();
+  }
+
+  @failingTest
+  void test_parseShiftExpression_super() {
+    super.test_parseShiftExpression_super();
+  }
+
+  @failingTest
+  void test_parseSimpleIdentifier_builtInIdentifier() {
+    super.test_parseSimpleIdentifier_builtInIdentifier();
+  }
+
+  @failingTest
+  void test_parseSimpleIdentifier_normalIdentifier() {
+    super.test_parseSimpleIdentifier_normalIdentifier();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_adjacent() {
+    super.test_parseStringLiteral_adjacent();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_endsWithInterpolation() {
+    super.test_parseStringLiteral_endsWithInterpolation();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_interpolated() {
+    super.test_parseStringLiteral_interpolated();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_multiline_encodedSpace() {
+    super.test_parseStringLiteral_multiline_encodedSpace();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_multiline_endsWithInterpolation() {
+    super.test_parseStringLiteral_multiline_endsWithInterpolation();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_multiline_escapedBackslash() {
+    super.test_parseStringLiteral_multiline_escapedBackslash();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_multiline_escapedBackslash_raw() {
+    super.test_parseStringLiteral_multiline_escapedBackslash_raw();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_multiline_escapedEolMarker() {
+    super.test_parseStringLiteral_multiline_escapedEolMarker();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_multiline_escapedEolMarker_raw() {
+    super.test_parseStringLiteral_multiline_escapedEolMarker_raw();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_multiline_escapedSpaceAndEolMarker() {
+    super.test_parseStringLiteral_multiline_escapedSpaceAndEolMarker();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_multiline_escapedSpaceAndEolMarker_raw() {
+    super.test_parseStringLiteral_multiline_escapedSpaceAndEolMarker_raw();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_multiline_escapedTab() {
+    super.test_parseStringLiteral_multiline_escapedTab();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_multiline_escapedTab_raw() {
+    super.test_parseStringLiteral_multiline_escapedTab_raw();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_multiline_quoteAfterInterpolation() {
+    super.test_parseStringLiteral_multiline_quoteAfterInterpolation();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_multiline_startsWithInterpolation() {
+    super.test_parseStringLiteral_multiline_startsWithInterpolation();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_multiline_twoSpaces() {
+    super.test_parseStringLiteral_multiline_twoSpaces();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_multiline_twoSpaces_raw() {
+    super.test_parseStringLiteral_multiline_twoSpaces_raw();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_multiline_untrimmed() {
+    super.test_parseStringLiteral_multiline_untrimmed();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_quoteAfterInterpolation() {
+    super.test_parseStringLiteral_quoteAfterInterpolation();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_single() {
+    super.test_parseStringLiteral_single();
+  }
+
+  @failingTest
+  void test_parseStringLiteral_startsWithInterpolation() {
+    super.test_parseStringLiteral_startsWithInterpolation();
+  }
+
+  @failingTest
+  void test_parseSuperConstructorInvocation_named() {
+    super.test_parseSuperConstructorInvocation_named();
+  }
+
+  @failingTest
+  void test_parseSuperConstructorInvocation_unnamed() {
+    super.test_parseSuperConstructorInvocation_unnamed();
+  }
+
+  @failingTest
+  void test_parseSymbolLiteral_builtInIdentifier() {
+    super.test_parseSymbolLiteral_builtInIdentifier();
+  }
+
+  @failingTest
+  void test_parseSymbolLiteral_multiple() {
+    super.test_parseSymbolLiteral_multiple();
+  }
+
+  @failingTest
+  void test_parseSymbolLiteral_operator() {
+    super.test_parseSymbolLiteral_operator();
+  }
+
+  @failingTest
+  void test_parseSymbolLiteral_single() {
+    super.test_parseSymbolLiteral_single();
+  }
+
+  @failingTest
+  void test_parseSymbolLiteral_void() {
+    super.test_parseSymbolLiteral_void();
+  }
+
+  @failingTest
+  void test_parseThrowExpression() {
+    super.test_parseThrowExpression();
+  }
+
+  @failingTest
+  void test_parseThrowExpressionWithoutCascade() {
+    super.test_parseThrowExpressionWithoutCascade();
+  }
+
+  @failingTest
+  void test_parseUnaryExpression_decrement_normal() {
+    super.test_parseUnaryExpression_decrement_normal();
+  }
+
+  @failingTest
+  void test_parseUnaryExpression_decrement_super() {
+    super.test_parseUnaryExpression_decrement_super();
+  }
+
+  @failingTest
+  void test_parseUnaryExpression_decrement_super_propertyAccess() {
+    super.test_parseUnaryExpression_decrement_super_propertyAccess();
+  }
+
+  @failingTest
+  void test_parseUnaryExpression_decrement_super_withComment() {
+    super.test_parseUnaryExpression_decrement_super_withComment();
+  }
+
+  @failingTest
+  void test_parseUnaryExpression_increment_normal() {
+    super.test_parseUnaryExpression_increment_normal();
+  }
+
+  @failingTest
+  void test_parseUnaryExpression_increment_super_index() {
+    super.test_parseUnaryExpression_increment_super_index();
+  }
+
+  @failingTest
+  void test_parseUnaryExpression_increment_super_propertyAccess() {
+    super.test_parseUnaryExpression_increment_super_propertyAccess();
+  }
+
+  @failingTest
+  void test_parseUnaryExpression_minus_normal() {
+    super.test_parseUnaryExpression_minus_normal();
+  }
+
+  @failingTest
+  void test_parseUnaryExpression_minus_super() {
+    super.test_parseUnaryExpression_minus_super();
+  }
+
+  @failingTest
+  void test_parseUnaryExpression_not_normal() {
+    super.test_parseUnaryExpression_not_normal();
+  }
+
+  @failingTest
+  void test_parseUnaryExpression_not_super() {
+    super.test_parseUnaryExpression_not_super();
+  }
+
+  @failingTest
+  void test_parseUnaryExpression_tilda_normal() {
+    super.test_parseUnaryExpression_tilda_normal();
+  }
+
+  @failingTest
+  void test_parseUnaryExpression_tilda_super() {
+    super.test_parseUnaryExpression_tilda_super();
+  }
+}
+
+/**
+ * Implementation of [AbstractParserTestCase] specialized for testing building
+ * Analyzer AST using the fasta [Forest] API.
+ */
+class FastaParserTestCase extends Object
+    with ParserTestHelpers
+    implements AbstractParserTestCase {
+  // TODO(danrubel): Consider HybridFileSystem.
+  static final MemoryFileSystem fs =
+      new MemoryFileSystem(Uri.parse("org-dartlang-test:///"));
+
+  /// The custom URI used to locate the dill file in the MemoryFileSystem.
+  static final Uri sdkSummary = fs.currentDirectory.resolve("vm_platform.dill");
+
+  /// The in memory test code URI
+  static final Uri entryPoint = fs.currentDirectory.resolve("main.dart");
+
+  static ProcessedOptions options;
+
+  static KernelTarget kernelTarget;
+
+  @override
+  Expression parseAdditiveExpression(String code) {
+    ScannerResult scan = scanString(code);
+
+    return CompilerContext.runWithOptions(options, (CompilerContext c) {
+      KernelLibraryBuilder library = new KernelLibraryBuilder(
+        entryPoint,
+        entryPoint,
+        kernelTarget.loader,
+        null /* actualOrigin */,
+        null /* enclosingLibrary */,
+      );
+      List<KernelTypeVariableBuilder> typeVariableBuilders =
+          <KernelTypeVariableBuilder>[];
+      List<KernelFormalParameterBuilder> formalParameterBuilders =
+          <KernelFormalParameterBuilder>[];
+      KernelProcedureBuilder procedureBuilder = new KernelProcedureBuilder(
+          null /* metadata */,
+          Modifier.staticMask /* or Modifier.varMask */,
+          new BuiltTypeBuilder(new kernel.DynamicType()),
+          "analyzerTest",
+          typeVariableBuilders,
+          formalParameterBuilders,
+          kernel.ProcedureKind.Method,
+          library,
+          -1 /* charOffset */,
+          -1 /* charOpenParenOffset */,
+          -1 /* charEndOffset */);
+
+      TypeInferrerDisabled typeInferrer =
+          new TypeInferrerDisabled(new TypeSchemaEnvironment(
+        kernelTarget.loader.coreTypes,
+        kernelTarget.loader.hierarchy,
+        // TODO(danrubel): Enable strong mode.
+        false /* strong mode */,
+      ));
+
+      BodyBuilder builder = new BodyBuilder(
+        library,
+        procedureBuilder,
+        library.scope,
+        procedureBuilder.computeFormalParameterScope(library.scope),
+        kernelTarget.loader.hierarchy,
+        kernelTarget.loader.coreTypes,
+        null /* classBuilder */,
+        false /* isInstanceMember */,
+        null /* uri */,
+        typeInferrer,
+        new AstBuildingForest(),
+      )..constantContext = ConstantContext.none; // .inferred ?
+
+      Parser parser = new Parser(builder);
+      parser.parseExpression(parser.syntheticPreviousToken(scan.tokens));
+      return builder.pop();
+    });
+  }
+
+  Future setUp() async {
+    // TODO(danrubel): Tear down once all tests in group have been run.
+    if (options != null) {
+      return;
+    }
+
+    // Read the dill file containing kernel platform summaries into memory.
+    List<int> sdkSummaryBytes = await new File.fromUri(
+            computePlatformBinariesLocation().resolve("vm_platform.dill"))
+        .readAsBytes();
+    fs.entityForUri(sdkSummary).writeAsBytesSync(sdkSummaryBytes);
+
+    final CompilerOptions optionBuilder = new CompilerOptions()
+      ..strongMode = false // TODO(danrubel): enable strong mode.
+      ..reportMessages = true
+      ..verbose = false
+      ..fileSystem = fs
+      ..sdkSummary = sdkSummary
+      ..onProblem = (FormattedMessage problem, Severity severity,
+          List<FormattedMessage> context) {
+        // TODO(danrubel): Capture problems and check against expectations.
+        print(problem.formatted);
+      };
+
+    options = new ProcessedOptions(optionBuilder, false, [entryPoint]);
+
+    UriTranslatorImpl uriTranslator = await options.getUriTranslator();
+
+    await CompilerContext.runWithOptions(options, (CompilerContext c) async {
+      DillTarget dillTarget = new DillTarget(
+          new Ticker(isVerbose: false), uriTranslator, options.target);
+
+      kernelTarget = new KernelTarget(fs, true, dillTarget, uriTranslator);
+
+      // Load the dill file containing platform code.
+      dillTarget.loader.read(Uri.parse('dart:core'), -1, fileUri: sdkSummary);
+      kernel.Component sdkComponent =
+          kernel.loadComponentFromBytes(sdkSummaryBytes);
+      dillTarget.loader
+          .appendLibraries(sdkComponent, byteCount: sdkSummaryBytes.length);
+      await dillTarget.buildOutlines();
+      await kernelTarget.buildOutlines();
+      kernelTarget.computeCoreTypes();
+      assert(kernelTarget.loader.coreTypes != null);
+    });
+  }
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 83855d0..1f39754e 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -4117,11 +4117,11 @@
     parseCompilationUnit("typedef var Function(var arg);",
         errors: usingFastaParser
             ? [
+                expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 8, 3),
+                expectedError(ParserErrorCode.VAR_AND_TYPE, 21, 3),
+                expectedError(ParserErrorCode.MISSING_IDENTIFIER, 29, 1),
                 expectedError(
-                    ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 0, 7),
-                expectedError(ParserErrorCode.EXPECTED_TOKEN, 8, 3),
-                expectedError(ParserErrorCode.VAR_RETURN_TYPE, 8, 3),
-                expectedError(ParserErrorCode.MISSING_FUNCTION_BODY, 29, 1),
+                    ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, 29, 1),
               ]
             : [
                 expectedError(ParserErrorCode.MISSING_IDENTIFIER, 8, 3),
@@ -11443,7 +11443,14 @@
   G<int double> g;
 }''',
         errors: usingFastaParser
-            ? [expectedError(ParserErrorCode.EXPECTED_TOKEN, 18, 6)]
+            ? [
+                // TODO(danrubel): Improve missing comma recovery.
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 18, 6),
+                expectedError(ParserErrorCode.MISSING_METHOD_PARAMETERS, 12, 1),
+                expectedError(ParserErrorCode.MISSING_FUNCTION_BODY, 26, 1),
+                expectedError(
+                    ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 26, 1),
+              ]
             : [
                 expectedError(ParserErrorCode.EXPECTED_TOKEN, 18, 6),
                 expectedError(ParserErrorCode.EXPECTED_TOKEN, 18, 6),
@@ -11455,14 +11462,14 @@
     // one class
     List<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(1));
-    ClassDeclaration classDecl = declarations[0] as ClassDeclaration;
     // validate members
     if (usingFastaParser) {
-      expect(classDecl.members, hasLength(1));
-      FieldDeclaration fields = classDecl.members.first;
-      expect(fields.fields.variables, hasLength(1));
-      VariableDeclaration field = fields.fields.variables.first;
-      expect(field.name.name, 'g');
+//      ClassDeclaration classDecl = declarations[0] as ClassDeclaration;
+//      expect(classDecl.members, hasLength(1));
+//      FieldDeclaration fields = classDecl.members.first;
+//      expect(fields.fields.variables, hasLength(1));
+//      VariableDeclaration field = fields.fields.variables.first;
+//      expect(field.name.name, 'g');
     }
   }
 
diff --git a/pkg/analyzer/test/generated/test_all.dart b/pkg/analyzer/test/generated/test_all.dart
index 52a3081..ef889c4 100644
--- a/pkg/analyzer/test/generated/test_all.dart
+++ b/pkg/analyzer/test/generated/test_all.dart
@@ -42,6 +42,7 @@
 import 'non_hint_code_test.dart' as non_hint_code_test;
 import 'package_test.dart' as package_test;
 import 'parser_fasta_test.dart' as parser_fasta_test;
+import 'parser_forest_test.dart' as parser_forest_test;
 import 'parser_test.dart' as parser_test;
 import 'resolver_driver_test.dart' as resolver_driver_test;
 import 'resolver_kernel_test.dart' as resolver_kernel_test;
@@ -107,6 +108,7 @@
     non_hint_code_test.main();
     package_test.main();
     parser_fasta_test.main();
+    parser_forest_test.main();
     parser_test.main();
     resolver_driver_test.main();
     resolver_kernel_test.main();
diff --git a/pkg/analyzer/test/generated/type_system_test.dart b/pkg/analyzer/test/generated/type_system_test.dart
index da90947..c371ec8 100644
--- a/pkg/analyzer/test/generated/type_system_test.dart
+++ b/pkg/analyzer/test/generated/type_system_test.dart
@@ -6,7 +6,8 @@
 
 library analyzer.test.generated.type_system_test;
 
-import 'package:analyzer/analyzer.dart' show ErrorReporter, StrongModeCode;
+import 'package:analyzer/analyzer.dart'
+    show ErrorReporter, ParameterKind, StrongModeCode;
 import 'package:analyzer/dart/ast/standard_ast_factory.dart' show astFactory;
 import 'package:analyzer/dart/ast/token.dart' show Keyword;
 import 'package:analyzer/dart/element/element.dart';
@@ -28,6 +29,7 @@
 
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(ConstraintMatchingTest);
     defineReflectiveTests(StrongAssignabilityTest);
     defineReflectiveTests(StrongSubtypingTest);
     defineReflectiveTests(StrongGenericFunctionInferenceTest);
@@ -49,13 +51,13 @@
   InterfaceType get doubleType => typeProvider.doubleType;
   DartType get dynamicType => typeProvider.dynamicType;
   InterfaceType get functionType => typeProvider.functionType;
+  InterfaceType get futureOrType => typeProvider.futureOrType;
   InterfaceType get intType => typeProvider.intType;
   InterfaceType get iterableType => typeProvider.iterableType;
   InterfaceType get listType => typeProvider.listType;
   InterfaceType get numType => typeProvider.numType;
   InterfaceType get objectType => typeProvider.objectType;
   InterfaceType get stringType => typeProvider.stringType;
-  InterfaceType get futureOrType => typeProvider.futureOrType;
   StrongTypeSystemImpl get strongTypeSystem =>
       typeSystem as StrongTypeSystemImpl;
 
@@ -133,6 +135,354 @@
   }
 }
 
+@reflectiveTest
+class ConstraintMatchingTest {
+  TypeProvider typeProvider;
+  TypeSystem typeSystem;
+  TypeParameterType T;
+
+  DartType get dynamicType => DynamicTypeImpl.instance;
+
+  InterfaceType get functionType => typeProvider.functionType;
+
+  InterfaceType get intType => typeProvider.intType;
+
+  InterfaceType get nullType => typeProvider.nullType;
+
+  InterfaceType get objectType => typeProvider.objectType;
+
+  InterfaceType get stringType => typeProvider.stringType;
+
+  DartType get voidType => VoidTypeImpl.instance;
+
+  DartType fn(DartType paramType, DartType returnType) =>
+      new FunctionElementImpl.synthetic([
+        new ParameterElementImpl.synthetic(
+            'value', paramType, ParameterKind.REQUIRED)
+      ], returnType)
+          .type;
+
+  DartType future(DartType T) => typeProvider.futureType.instantiate([T]);
+
+  DartType futureOr(DartType T) => typeProvider.futureOrType.instantiate([T]);
+
+  DartType iterable(DartType T) => typeProvider.iterableType.instantiate([T]);
+
+  DartType list(DartType T) => typeProvider.listType.instantiate([T]);
+
+  void setUp() {
+    typeProvider = AnalysisContextFactory.contextWithCore().typeProvider;
+    typeSystem = new StrongTypeSystemImpl(typeProvider);
+    T = _newTypeParameter('T');
+  }
+
+  void test_function_coreFunction() {
+    _checkOrdinarySubtypeMatch(fn(intType, stringType), functionType, [T],
+        covariant: true);
+  }
+
+  void test_function_parameter_types() {
+    _checkIsSubtypeMatchOf(
+        fn(T, intType), fn(stringType, intType), [T], ['String <: T'],
+        covariant: true);
+  }
+
+  void test_function_return_types() {
+    _checkIsSubtypeMatchOf(
+        fn(intType, T), fn(intType, stringType), [T], ['T <: String'],
+        covariant: true);
+  }
+
+  void test_futureOr_futureOr() {
+    _checkIsSubtypeMatchOf(
+        futureOr(T), futureOr(stringType), [T], ['T <: String'],
+        covariant: true);
+  }
+
+  void test_futureOr_x_fail_future_branch() {
+    // FutureOr<List<T>> <: List<String> can't be satisfied because
+    // Future<List<T>> <: List<String> can't be satisfied
+    _checkIsNotSubtypeMatchOf(futureOr(list(T)), list(stringType), [T],
+        covariant: true);
+  }
+
+  void test_futureOr_x_fail_nonFuture_branch() {
+    // FutureOr<List<T>> <: Future<List<String>> can't be satisfied because
+    // List<T> <: Future<List<String>> can't be satisfied
+    _checkIsNotSubtypeMatchOf(futureOr(list(T)), future(list(stringType)), [T],
+        covariant: true);
+  }
+
+  void test_futureOr_x_success() {
+    // FutureOr<T> <: Future<T> can be satisfied by T=Null.  At this point in
+    // the type inference algorithm all we figure out is that T must be a
+    // subtype of both String and Future<String>.
+    _checkIsSubtypeMatchOf(futureOr(T), future(stringType), [T],
+        ['T <: String', 'T <: Future<String>'],
+        covariant: true);
+  }
+
+  void test_lhs_null() {
+    // Null <: T is trivially satisfied by the constraint Null <: T.
+    _checkIsSubtypeMatchOf(nullType, T, [T], ['Null <: T'], covariant: false);
+    // For any other type X, Null <: X is satisfied without the need for any
+    // constraints.
+    _checkOrdinarySubtypeMatch(nullType, list(T), [T], covariant: false);
+    _checkOrdinarySubtypeMatch(nullType, stringType, [T], covariant: false);
+    _checkOrdinarySubtypeMatch(nullType, voidType, [T], covariant: false);
+    _checkOrdinarySubtypeMatch(nullType, dynamicType, [T], covariant: false);
+    _checkOrdinarySubtypeMatch(nullType, objectType, [T], covariant: false);
+    _checkOrdinarySubtypeMatch(nullType, nullType, [T], covariant: false);
+    _checkOrdinarySubtypeMatch(nullType, fn(intType, stringType), [T],
+        covariant: false);
+  }
+
+  void test_param_on_lhs_contravariant_direct() {
+    // When doing a contravariant match, the type parameters we're trying to
+    // find types for are on the right hand side.  Is a type parameter also
+    // appears on the left hand side, there is a condition in which the
+    // constraint can be satisfied without consulting the bound of the LHS type
+    // parameter: the condition where both parameters appear at corresponding
+    // locations in the type tree.
+    //
+    // In other words, List<S> <: List<T> is satisfied provided that
+    // S <: T.
+    var S = _newTypeParameter('S');
+    _checkIsSubtypeMatchOf(list(S), list(T), [T], ['S <: T'], covariant: false);
+  }
+
+  void test_param_on_lhs_contravariant_via_bound() {
+    // When doing a contravariant match, the type parameters we're trying to
+    // find types for are on the right hand side.  Is a type parameter also
+    // appears on the left hand side, we may have to constrain the RHS type
+    // parameter using the bounds of the LHS type parameter.
+    //
+    // In other words, S <: List<T> is satisfied provided that
+    // bound(S) <: List<T>.
+    var S = _newTypeParameter('S', list(stringType));
+    _checkIsSubtypeMatchOf(S, list(T), [T], ['String <: T'], covariant: false);
+  }
+
+  void test_param_on_lhs_covariant() {
+    // When doing a covariant match, the type parameters we're trying to find
+    // types for are on the left hand side.
+    _checkIsSubtypeMatchOf(T, stringType, [T], ['T <: String'],
+        covariant: true);
+  }
+
+  void test_param_on_rhs_contravariant() {
+    // When doing a contravariant match, the type parameters we're trying to
+    // find types for are on the right hand side.
+    _checkIsSubtypeMatchOf(stringType, T, [T], ['String <: T'],
+        covariant: false);
+  }
+
+  void test_param_on_rhs_covariant_match() {
+    // When doing a covariant match, the type parameters we're trying to find
+    // types for are on the left hand side.  If a type parameter appears on the
+    // right hand side, there is a condition in which the constraint can be
+    // satisfied: where both parameters appear at corresponding locations in the
+    // type tree.
+    //
+    // In other words, T <: S can be satisfied trivially by the constraint
+    // T <: S.
+    var S = _newTypeParameter('S');
+    _checkIsSubtypeMatchOf(T, S, [T], ['T <: S'], covariant: true);
+  }
+
+  void test_param_on_rhs_covariant_no_match() {
+    // When doing a covariant match, the type parameters we're trying to find
+    // types for are on the left hand side.  If a type parameter appears on the
+    // right hand side, it's probable that the constraint can't be satisfied,
+    // because there is no possible type for the LHS (other than bottom)
+    // that's guaranteed to satisfy the relation for all possible assignments of
+    // the RHS type parameter.
+    //
+    // In other words, no match can be found for List<T> <: S because regardless
+    // of T, we can't guarantee that List<T> <: S for all S.
+    var S = _newTypeParameter('S');
+    _checkIsNotSubtypeMatchOf(list(T), S, [T], covariant: true);
+  }
+
+  void test_related_interface_types_failure() {
+    _checkIsNotSubtypeMatchOf(iterable(T), list(stringType), [T],
+        covariant: true);
+  }
+
+  void test_related_interface_types_success() {
+    _checkIsSubtypeMatchOf(list(T), iterable(stringType), [T], ['T <: String'],
+        covariant: true);
+  }
+
+  void test_rhs_dynamic() {
+    // T <: dynamic is trivially satisfied by the constraint T <: dynamic.
+    _checkIsSubtypeMatchOf(T, dynamicType, [T], ['T <: dynamic'],
+        covariant: true);
+    // For any other type X, X <: dynamic is satisfied without the need for any
+    // constraints.
+    _checkOrdinarySubtypeMatch(list(T), dynamicType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(stringType, dynamicType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(voidType, dynamicType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(dynamicType, dynamicType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(objectType, dynamicType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(nullType, dynamicType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(fn(intType, stringType), dynamicType, [T],
+        covariant: true);
+  }
+
+  void test_rhs_object() {
+    // T <: Object is trivially satisfied by the constraint T <: Object.
+    _checkIsSubtypeMatchOf(T, objectType, [T], ['T <: Object'],
+        covariant: true);
+    // For any other type X, X <: Object is satisfied without the need for any
+    // constraints.
+    _checkOrdinarySubtypeMatch(list(T), objectType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(stringType, objectType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(voidType, objectType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(dynamicType, objectType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(objectType, objectType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(nullType, objectType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(fn(intType, stringType), objectType, [T],
+        covariant: true);
+  }
+
+  void test_rhs_void() {
+    // T <: void is trivially satisfied by the constraint T <: void.
+    _checkIsSubtypeMatchOf(T, voidType, [T], ['T <: void'], covariant: true);
+    // For any other type X, X <: void is satisfied without the need for any
+    // constraints.
+    _checkOrdinarySubtypeMatch(list(T), voidType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(stringType, voidType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(voidType, voidType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(dynamicType, voidType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(objectType, voidType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(nullType, voidType, [T], covariant: true);
+    _checkOrdinarySubtypeMatch(fn(intType, stringType), voidType, [T],
+        covariant: true);
+  }
+
+  void test_same_interface_types() {
+    _checkIsSubtypeMatchOf(list(T), list(stringType), [T], ['T <: String'],
+        covariant: true);
+  }
+
+  void test_x_futureOr_fail_both_branches() {
+    // List<T> <: FutureOr<String> can't be satisfied because neither
+    // List<T> <: Future<String> nor List<T> <: int can be satisfied
+    _checkIsNotSubtypeMatchOf(list(T), futureOr(stringType), [T],
+        covariant: true);
+  }
+
+  void test_x_futureOr_pass_both_branches_constraints_from_both_branches() {
+    // Future<String> <: FutureOr<T> can be satisfied because both
+    // Future<String> <: Future<T> and Future<String> <: T can be satisfied.
+    // Trying to match Future<String> <: Future<T> generates the constraint
+    // String <: T, whereas trying to match Future<String> <: T generates the
+    // constraint Future<String> <: T.  We keep the constraint based on trying
+    // to match Future<String> <: Future<T>, so String <: T.
+    _checkIsSubtypeMatchOf(
+        future(stringType), futureOr(T), [T], ['String <: T'],
+        covariant: false);
+  }
+
+  void test_x_futureOr_pass_both_branches_constraints_from_future_branch() {
+    // Future<T> <: FutureOr<Object> can be satisfied because both
+    // Future<T> <: Future<Object> and Future<T> <: Object can be satisfied.
+    // Trying to match Future<T> <: Future<Object> generates the constraint
+    // T <: Object, whereas trying to match Future<T> <: Object generates no
+    // constraints, so we keep the constraint T <: Object.
+    _checkIsSubtypeMatchOf(
+        future(T), futureOr(objectType), [T], ['T <: Object'],
+        covariant: true);
+  }
+
+  void test_x_futureOr_pass_both_branches_constraints_from_nonFuture_branch() {
+    // Null <: FutureOr<T> can be satisfied because both
+    // Null <: Future<T> and Null <: T can be satisfied.
+    // Trying to match Null <: FutureOr<T> generates no constraints, whereas
+    // trying to match Null <: T generates the constraint Null <: T,
+    // so we keep the constraint Null <: T.
+    _checkIsSubtypeMatchOf(nullType, futureOr(T), [T], ['Null <: T'],
+        covariant: false);
+  }
+
+  void test_x_futureOr_pass_both_branches_no_constraints() {
+    // Future<String> <: FutureOr<Object> is satisfied because both
+    // Future<String> <: Future<Object> and Future<String> <: Object.
+    // No constraints are recorded.
+    _checkIsSubtypeMatchOf(future(stringType), futureOr(objectType), [T], [],
+        covariant: true);
+  }
+
+  void test_x_futureOr_pass_future_branch() {
+    // Future<T> <: FutureOr<String> can be satisfied because
+    // Future<T> <: Future<String> can be satisfied
+    _checkIsSubtypeMatchOf(
+        future(T), futureOr(stringType), [T], ['T <: String'],
+        covariant: true);
+  }
+
+  void test_x_futureOr_pass_nonFuture_branch() {
+    // List<T> <: FutureOr<List<String>> can be satisfied because
+    // List<T> <: List<String> can be satisfied
+    _checkIsSubtypeMatchOf(
+        list(T), futureOr(list(stringType)), [T], ['T <: String'],
+        covariant: true);
+  }
+
+  void _checkIsNotSubtypeMatchOf(
+      DartType t1, DartType t2, Iterable<TypeParameterType> typeFormals,
+      {bool covariant}) {
+    var inferrer = new GenericInferrer(
+        typeProvider, typeSystem, typeFormals.map((t) => t.element));
+    var success =
+        inferrer.tryMatchSubtypeOf(t1, t2, null, covariant: covariant);
+    expect(success, isFalse);
+    inferrer.constraints.forEach((typeParameter, constraintsForTypeParameter) {
+      expect(constraintsForTypeParameter, isEmpty);
+    });
+  }
+
+  void _checkIsSubtypeMatchOf(
+      DartType t1,
+      DartType t2,
+      Iterable<TypeParameterType> typeFormals,
+      Iterable<String> expectedConstraints,
+      {bool covariant}) {
+    var inferrer = new GenericInferrer(
+        typeProvider, typeSystem, typeFormals.map((t) => t.element));
+    var success =
+        inferrer.tryMatchSubtypeOf(t1, t2, null, covariant: covariant);
+    expect(success, isTrue);
+    var formattedConstraints = <String>[];
+    inferrer.constraints.forEach((typeParameter, constraintsForTypeParameter) {
+      for (var constraint in constraintsForTypeParameter) {
+        formattedConstraints.add(constraint.format(typeParameter.toString()));
+      }
+    });
+    expect(formattedConstraints, unorderedEquals(expectedConstraints));
+  }
+
+  void _checkOrdinarySubtypeMatch(
+      DartType t1, DartType t2, Iterable<TypeParameterType> typeFormals,
+      {bool covariant}) {
+    bool expectSuccess = typeSystem.isSubtypeOf(t1, t2);
+    if (expectSuccess) {
+      _checkIsSubtypeMatchOf(t1, t2, typeFormals, [], covariant: covariant);
+    } else {
+      _checkIsNotSubtypeMatchOf(t1, t2, typeFormals);
+    }
+  }
+
+  TypeParameterType _newTypeParameter(String name, [DartType bound]) {
+    var element = new TypeParameterElementImpl(name, 0);
+    if (bound != null) {
+      element.bound = bound;
+    }
+    return new TypeParameterTypeImpl(element);
+  }
+}
+
 /**
  * Tests LUB in spec mode.
  *
@@ -1044,13 +1394,13 @@
   }
 
   void test_returnFunctionWithGenericParameterAndContext() {
-    // <T>(T -> T) -> (T -> void)
+    // <T>(T -> T) -> (T -> Null)
     var t = TypeBuilder.variable('T');
     var f = TypeBuilder.function(types: [
       t
     ], required: [
       TypeBuilder.function(required: [t], result: t)
-    ], result: TypeBuilder.function(required: [t], result: voidType));
+    ], result: TypeBuilder.function(required: [t], result: nullType));
     expect(
         _inferCall(f, [],
             returnType:
@@ -1189,68 +1539,6 @@
     _checkGreatestLowerBound(bottomType, typeParam, bottomType);
   }
 
-  void test_classAndSuperclass() {
-    // class A
-    // class B extends A
-    // class C extends B
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
-    ClassElementImpl classC = ElementFactory.classElement("C", classB.type);
-    _checkGreatestLowerBound(classA.type, classC.type, classC.type);
-  }
-
-  void test_classAndSuperinterface() {
-    // class A
-    // class B implements A
-    // class C implements B
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement2("B");
-    ClassElementImpl classC = ElementFactory.classElement2("C");
-    classB.interfaces = <InterfaceType>[classA.type];
-    classC.interfaces = <InterfaceType>[classB.type];
-    _checkGreatestLowerBound(classA.type, classC.type, classC.type);
-  }
-
-  void test_dynamic_bottom() {
-    _checkGreatestLowerBound(dynamicType, bottomType, bottomType);
-  }
-
-  void test_dynamic_function() {
-    _checkGreatestLowerBound(
-        dynamicType, simpleFunctionType, simpleFunctionType);
-  }
-
-  void test_dynamic_interface() {
-    DartType interfaceType = ElementFactory.classElement2('A', []).type;
-    _checkGreatestLowerBound(dynamicType, interfaceType, interfaceType);
-  }
-
-  void test_dynamic_typeParam() {
-    DartType typeParam = ElementFactory.typeParameterElement('T').type;
-    _checkGreatestLowerBound(dynamicType, typeParam, typeParam);
-  }
-
-  void test_dynamic_void() {
-    // Note: _checkGreatestLowerBound tests `GLB(x, y)` as well as `GLB(y, x)`
-    _checkGreatestLowerBound(dynamicType, voidType, voidType);
-  }
-
-  void test_bounds_of_top_types_sanity() {
-    final futureOrDynamicType = futureOrType.instantiate([dynamicType]);
-    final futureOrFutureOrDynamicType =
-        futureOrType.instantiate([futureOrDynamicType]);
-
-    // Sanity check specific cases of top for GLB/LUB.
-    _checkLeastUpperBound(objectType, dynamicType, dynamicType);
-    _checkGreatestLowerBound(objectType, dynamicType, objectType);
-    _checkLeastUpperBound(objectType, voidType, objectType);
-    _checkLeastUpperBound(futureOrDynamicType, dynamicType, dynamicType);
-    _checkGreatestLowerBound(
-        futureOrDynamicType, objectType, futureOrDynamicType);
-    _checkGreatestLowerBound(futureOrDynamicType, futureOrFutureOrDynamicType,
-        futureOrFutureOrDynamicType);
-  }
-
   void test_bounds_of_top_types_complete() {
     // Test every combination of a subset of Tops programatically.
     final futureOrDynamicType = futureOrType.instantiate([dynamicType]);
@@ -1297,6 +1585,68 @@
     }
   }
 
+  void test_bounds_of_top_types_sanity() {
+    final futureOrDynamicType = futureOrType.instantiate([dynamicType]);
+    final futureOrFutureOrDynamicType =
+        futureOrType.instantiate([futureOrDynamicType]);
+
+    // Sanity check specific cases of top for GLB/LUB.
+    _checkLeastUpperBound(objectType, dynamicType, dynamicType);
+    _checkGreatestLowerBound(objectType, dynamicType, objectType);
+    _checkLeastUpperBound(objectType, voidType, objectType);
+    _checkLeastUpperBound(futureOrDynamicType, dynamicType, dynamicType);
+    _checkGreatestLowerBound(
+        futureOrDynamicType, objectType, futureOrDynamicType);
+    _checkGreatestLowerBound(futureOrDynamicType, futureOrFutureOrDynamicType,
+        futureOrFutureOrDynamicType);
+  }
+
+  void test_classAndSuperclass() {
+    // class A
+    // class B extends A
+    // class C extends B
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type);
+    _checkGreatestLowerBound(classA.type, classC.type, classC.type);
+  }
+
+  void test_classAndSuperinterface() {
+    // class A
+    // class B implements A
+    // class C implements B
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    classB.interfaces = <InterfaceType>[classA.type];
+    classC.interfaces = <InterfaceType>[classB.type];
+    _checkGreatestLowerBound(classA.type, classC.type, classC.type);
+  }
+
+  void test_dynamic_bottom() {
+    _checkGreatestLowerBound(dynamicType, bottomType, bottomType);
+  }
+
+  void test_dynamic_function() {
+    _checkGreatestLowerBound(
+        dynamicType, simpleFunctionType, simpleFunctionType);
+  }
+
+  void test_dynamic_interface() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    _checkGreatestLowerBound(dynamicType, interfaceType, interfaceType);
+  }
+
+  void test_dynamic_typeParam() {
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    _checkGreatestLowerBound(dynamicType, typeParam, typeParam);
+  }
+
+  void test_dynamic_void() {
+    // Note: _checkGreatestLowerBound tests `GLB(x, y)` as well as `GLB(y, x)`
+    _checkGreatestLowerBound(dynamicType, voidType, voidType);
+  }
+
   void test_functionsDifferentNamedTakeUnion() {
     FunctionType type1 = _functionType([], named: {'a': intType, 'b': intType});
     FunctionType type2 =
@@ -1613,13 +1963,13 @@
   InterfaceType get doubleType => typeProvider.doubleType;
   DartType get dynamicType => typeProvider.dynamicType;
   InterfaceType get functionType => typeProvider.functionType;
+  InterfaceType get futureOrType => typeProvider.futureOrType;
   InterfaceType get intType => typeProvider.intType;
   InterfaceType get listType => typeProvider.listType;
   InterfaceType get numType => typeProvider.numType;
   InterfaceType get objectType => typeProvider.objectType;
   InterfaceType get stringType => typeProvider.stringType;
   DartType get voidType => VoidTypeImpl.instance;
-  InterfaceType get futureOrType => typeProvider.futureOrType;
 
   void setUp() {
     typeProvider = AnalysisContextFactory.contextWithCore().typeProvider;
@@ -1692,21 +2042,6 @@
     _checkGroups(dynamicType, equivalents: equivalents, subtypes: subtypes);
   }
 
-  void test_void_isTop() {
-    DartType interfaceType = ElementFactory.classElement2('A', []).type;
-    List<DartType> equivalents = <DartType>[dynamicType, objectType, voidType];
-    List<DartType> subtypes = <DartType>[
-      intType,
-      doubleType,
-      numType,
-      stringType,
-      functionType,
-      interfaceType,
-      bottomType
-    ];
-    _checkGroups(voidType, equivalents: equivalents, subtypes: subtypes);
-  }
-
   void test_function_subtypes_itself_top_types() {
     var tops = [dynamicType, objectType, voidType];
     // Add FutureOr<T> for T := dynamic, object, void
@@ -1958,6 +2293,21 @@
     _checkIsStrictSubtypeOf(bottom, top);
   }
 
+  void test_void_isTop() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    List<DartType> equivalents = <DartType>[dynamicType, objectType, voidType];
+    List<DartType> subtypes = <DartType>[
+      intType,
+      doubleType,
+      numType,
+      stringType,
+      functionType,
+      interfaceType,
+      bottomType
+    ];
+    _checkGroups(voidType, equivalents: equivalents, subtypes: subtypes);
+  }
+
   void _checkEquivalent(DartType type1, DartType type2) {
     _checkIsSubtypeOf(type1, type2);
     _checkIsSubtypeOf(type2, type1);
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index 7781977..f960be0 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -2546,26 +2546,43 @@
     }, throwsArgumentError);
   }
 
-  void test_firstLine() {
+  void test_getLocation_firstLine() {
     LineInfo info = new LineInfo(<int>[0, 12, 34]);
     CharacterLocation location = info.getLocation(4);
     expect(location.lineNumber, 1);
     expect(location.columnNumber, 5);
   }
 
-  void test_lastLine() {
+  void test_getLocation_lastLine() {
     LineInfo info = new LineInfo(<int>[0, 12, 34]);
     CharacterLocation location = info.getLocation(36);
     expect(location.lineNumber, 3);
     expect(location.columnNumber, 3);
   }
 
-  void test_middleLine() {
+  void test_getLocation_middleLine() {
     LineInfo info = new LineInfo(<int>[0, 12, 34]);
     CharacterLocation location = info.getLocation(12);
     expect(location.lineNumber, 2);
     expect(location.columnNumber, 1);
   }
+
+  void test_getOffsetOfLine() {
+    LineInfo info = new LineInfo(<int>[0, 12, 34]);
+    expect(0, info.getOffsetOfLine(0));
+    expect(12, info.getOffsetOfLine(1));
+    expect(34, info.getOffsetOfLine(2));
+  }
+
+  void test_getOffsetOfLineAfter() {
+    LineInfo info = new LineInfo(<int>[0, 12, 34]);
+
+    expect(info.getOffsetOfLineAfter(0), 12);
+    expect(info.getOffsetOfLineAfter(11), 12);
+
+    expect(info.getOffsetOfLineAfter(12), 34);
+    expect(info.getOffsetOfLineAfter(33), 34);
+  }
 }
 
 class ListGetter_NodeReplacerTest_test_adjacentStrings
diff --git a/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart b/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
index 47c5338..81e7cbb 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -79,6 +80,99 @@
     expect(element, isNull);
   }
 
+  test_getTopLevelPropertyAccessor_defined_getter() async {
+    var path = _p('/test.dart');
+    var file = provider.newFile(path, r'''
+int get a => 0;
+''');
+    String uri = file.toUri().toString();
+
+    var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'a');
+    expect(element, isNotNull);
+    expect(element.kind, ElementKind.GETTER);
+    expect(element.displayName, 'a');
+  }
+
+  test_getTopLevelPropertyAccessor_defined_setter() async {
+    var path = _p('/test.dart');
+    var file = provider.newFile(path, r'''
+set a(_) {}
+''');
+    String uri = file.toUri().toString();
+
+    var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'a=');
+    expect(element, isNotNull);
+    expect(element.kind, ElementKind.SETTER);
+    expect(element.displayName, 'a');
+  }
+
+  test_getTopLevelPropertyAccessor_defined_variable() async {
+    var path = _p('/test.dart');
+    var file = provider.newFile(path, r'''
+int a;
+''');
+    String uri = file.toUri().toString();
+
+    var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'a');
+    expect(element, isNotNull);
+    expect(element.kind, ElementKind.GETTER);
+    expect(element.displayName, 'a');
+  }
+
+  test_getTopLevelPropertyAccessor_exported() async {
+    var a = _p('/a.dart');
+    var b = _p('/b.dart');
+    provider.newFile(a, r'''
+int a;
+''');
+    var bFile = provider.newFile(b, r'''
+export 'a.dart';
+''');
+    String bUri = bFile.toUri().toString();
+
+    var element = await sessionHelper.getTopLevelPropertyAccessor(bUri, 'a');
+    expect(element, isNotNull);
+    expect(element.kind, ElementKind.GETTER);
+    expect(element.displayName, 'a');
+  }
+
+  test_getTopLevelPropertyAccessor_imported() async {
+    var a = _p('/a.dart');
+    var b = _p('/b.dart');
+    provider.newFile(a, r'''
+int a;
+''');
+    var bFile = provider.newFile(b, r'''
+import 'a.dart';
+''');
+    String bUri = bFile.toUri().toString();
+
+    var element = await sessionHelper.getTopLevelPropertyAccessor(bUri, 'a');
+    expect(element, isNull);
+  }
+
+  test_getTopLevelPropertyAccessor_notDefined() async {
+    var path = _p('/test.dart');
+    var file = provider.newFile(path, r'''
+int a;
+''');
+    String uri = file.toUri().toString();
+
+    var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'b');
+    expect(element, isNull);
+  }
+
+  test_getTopLevelPropertyAccessor_notPropertyAccessor() async {
+    var path = _p('/test.dart');
+    var file = provider.newFile(path, r'''
+int a() {}
+''');
+    String uri = file.toUri().toString();
+
+    var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'a');
+    expect(element, isNull);
+  }
+
   /// Return the [provider] specific path for the given Posix [path].
   String _p(String path) => provider.convertPath(path);
 }
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
index e04d1b4..dd46a45 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
@@ -77,7 +77,7 @@
               ],
               "import 'a.dart' if (b) '';"),
           new TestDescriptor(
-              'ifCondition',
+              'as',
               "import 'a.dart' as",
               [
                 ParserErrorCode.MISSING_IDENTIFIER,
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/test_all.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/test_all.dart
index 735402b..eb14122 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/test_all.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/test_all.dart
@@ -26,6 +26,7 @@
 import 'switch_statement_test.dart' as switch_statement;
 import 'top_level_variable_test.dart' as top_level_variable;
 import 'try_statement_test.dart' as try_statement;
+import 'typedef_test.dart' as typedef_declaration;
 import 'while_statement_test.dart' as while_statement;
 import 'yield_statement_test.dart' as yield_statement;
 
@@ -53,6 +54,7 @@
     switch_statement.main();
     top_level_variable.main();
     try_statement.main();
+    typedef_declaration.main();
     while_statement.main();
     yield_statement.main();
   });
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/typedef_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/typedef_test.dart
new file mode 100644
index 0000000..9d91815
--- /dev/null
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/typedef_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
+
+import 'partial_code_support.dart';
+
+main() {
+  new TypedefTest().buildAll();
+}
+
+class TypedefTest extends PartialCodeTest {
+  buildAll() {
+    List<String> allExceptEof =
+        PartialCodeTest.declarationSuffixes.map((t) => t.name).toList();
+    buildTests(
+        'typedef',
+        [
+          new TestDescriptor(
+              'keyword',
+              'typedef',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_TYPEDEF_PARAMETERS,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              "typedef _s_();",
+              failing: [
+                'functionVoid',
+                'functionNonVoid',
+                'var',
+                'const',
+                'final',
+                'getter'
+              ]),
+          new TestDescriptor(
+              'keywordEquals',
+              'typedef =',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TYPE_NAME,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              "typedef _s_ = _s_;",
+              failing: allExceptEof),
+        ],
+        PartialCodeTest.declarationSuffixes);
+  }
+}
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index 19623cc..b9b3f80 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -580,6 +580,30 @@
   }
 
   @override
+  void writeReference(Element element) {
+    if (element.enclosingElement is CompilationUnitElement) {
+      LibraryElement definingLibrary = element.library;
+      LibraryElement importingLibrary =
+          dartFileEditBuilder.unit.element.library;
+
+      // TODO(scheglov) Extract this code (it is already used twice).
+      // TODO(scheglov) Consider updating `show` combinator to show the element.
+      ImportElement existingImport =
+          _getImportElement(element, importingLibrary);
+      if (existingImport != null) {
+        if (existingImport.prefix != null) {
+          write(existingImport.prefix.displayName);
+          write('.');
+        }
+      } else {
+        importLibrary(definingLibrary.source);
+      }
+    }
+
+    write(element.displayName);
+  }
+
+  @override
   bool writeType(DartType type,
       {bool addSupertypeProposals: false,
       String groupName,
@@ -841,9 +865,7 @@
    * Return the namespace added by the given import [element].
    */
   Map<String, Element> _getImportNamespace(ImportElement element) {
-    NamespaceBuilder builder = new NamespaceBuilder();
-    Namespace namespace = builder.createImportNamespaceForDirective(element);
-    return namespace.definedNames;
+    return element.namespace.definedNames;
   }
 
   /**
@@ -1402,19 +1424,22 @@
       return;
     }
 
-    // If still at the beginning of the file, skip shebang and line comments.
-    _InsertionDescription desc = _getInsertDescTop();
-    int offset = desc.offset;
+    // If still at the beginning of the file, add before the first declaration.
+    int offset;
+    bool insertEmptyLineAfter = false;
+    if (unit.declarations.isNotEmpty) {
+      offset = unit.declarations.first.offset;
+      insertEmptyLineAfter = true;
+    } else {
+      offset = unit.end;
+    }
     for (int i = 0; i < uriList.length; i++) {
       String importUri = uriList[i];
       addInsertion(offset, (EditBuilder builder) {
-        if (i == 0 && desc.insertEmptyLineBefore) {
-          builder.writeln();
-        }
         builder.write("import '");
         builder.write(importUri);
         builder.writeln("';");
-        if (i == uriList.length - 1 && desc.insertEmptyLineAfter) {
+        if (i == uriList.length - 1 && insertEmptyLineAfter) {
           builder.writeln();
         }
       });
@@ -1422,63 +1447,6 @@
   }
 
   /**
-   * Returns an insertion description describing where to insert a new directive
-   * or a top-level declaration at the top of the file.
-   */
-  _InsertionDescription _getInsertDescTop() {
-    // skip leading line comments
-    int offset = 0;
-    bool insertEmptyLineBefore = false;
-    bool insertEmptyLineAfter = false;
-    String source = unit.element.context.getContents(unit.element.source).data;
-    var lineInfo = unit.lineInfo;
-    // skip hash-bang
-    if (offset < source.length - 2) {
-      String linePrefix = _getText(source, offset, 2);
-      if (linePrefix == "#!") {
-        insertEmptyLineBefore = true;
-        offset = lineInfo.getOffsetOfLineAfter(offset);
-        // skip empty lines to first line comment
-        int emptyOffset = offset;
-        while (emptyOffset < source.length - 2) {
-          int nextLineOffset = lineInfo.getOffsetOfLineAfter(emptyOffset);
-          String line = source.substring(emptyOffset, nextLineOffset);
-          if (line.trim().isEmpty) {
-            emptyOffset = nextLineOffset;
-            continue;
-          } else if (line.startsWith("//")) {
-            offset = emptyOffset;
-            break;
-          } else {
-            break;
-          }
-        }
-      }
-    }
-    // skip line comments
-    while (offset < source.length - 2) {
-      String linePrefix = _getText(source, offset, 2);
-      if (linePrefix == "//") {
-        insertEmptyLineBefore = true;
-        offset = lineInfo.getOffsetOfLineAfter(offset);
-      } else {
-        break;
-      }
-    }
-    // determine if empty line is required after
-    int currentLine = lineInfo.getLocation(offset).lineNumber;
-    if (currentLine + 1 < lineInfo.lineCount) {
-      int nextLineOffset = lineInfo.getOffsetOfLine(currentLine + 1);
-      String insertLine = source.substring(offset, nextLineOffset);
-      if (!insertLine.trim().isEmpty) {
-        insertEmptyLineAfter = true;
-      }
-    }
-    return new _InsertionDescription(
-        offset, insertEmptyLineBefore, insertEmptyLineAfter);
-  }
-
-  /**
    * Computes the best URI to import [what] into [from].
    */
   String _getLibrarySourceUri(LibraryElement from, Source what) {
@@ -1496,13 +1464,6 @@
   }
 
   /**
-   * Returns the text of the given range in the unit.
-   */
-  String _getText(String content, int offset, int length) {
-    return content.substring(offset, offset + length);
-  }
-
-  /**
    * Create an edit to replace the return type of the innermost function
    * containing the given [node] with the type `Future`. The [typeProvider] is
    * used to check the current return type, because if it is already `Future` no
@@ -1665,11 +1626,3 @@
     return null;
   }
 }
-
-class _InsertionDescription {
-  final int offset;
-  final bool insertEmptyLineBefore;
-  final bool insertEmptyLineAfter;
-  _InsertionDescription(
-      this.offset, this.insertEmptyLineBefore, this.insertEmptyLineAfter);
-}
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
index 86545f0..f1f68be 100644
--- a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
@@ -223,6 +223,13 @@
   void writeParametersMatchingArguments(ArgumentList arguments);
 
   /**
+   * Write the code that references the [element]. If the [element] is a
+   * top-level element that has not been imported into the current library,
+   * imports will be updated.
+   */
+  void writeReference(Element element);
+
+  /**
    * Write the code for a type annotation for the given [type]. If the [type] is
    * either `null` or represents the type 'dynamic', then the behavior depends
    * on whether a type is [required]. If [required] is `true`, then 'var' will
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
index fdb1008..d8d76f8 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
@@ -154,6 +154,50 @@
 ''');
   }
 
+  test_importLibrary_noDirectives_docComment() async {
+    await _assertImportLibraries('''
+/// Documentation comment.
+/// Continues.
+void main() {}
+''', ['dart:async'], '''
+import 'dart:async';
+
+/// Documentation comment.
+/// Continues.
+void main() {}
+''');
+  }
+
+  test_importLibrary_noDirectives_hashBang() async {
+    await _assertImportLibraries('''
+#!/bin/dart
+
+void main() {}
+''', ['dart:async'], '''
+#!/bin/dart
+
+import 'dart:async';
+
+void main() {}
+''');
+  }
+
+  test_importLibrary_noDirectives_lineComment() async {
+    await _assertImportLibraries('''
+// Not documentation comment.
+// Continues.
+
+void main() {}
+''', ['dart:async'], '''
+// Not documentation comment.
+// Continues.
+
+import 'dart:async';
+
+void main() {}
+''');
+  }
+
   test_importLibrary_package_afterDart() async {
     await _assertImportLibraries('''
 import 'dart:async';
@@ -1577,6 +1621,99 @@
     expect(edit.replacement, equalsIgnoringWhitespace('String s, int i'));
   }
 
+  test_writeReference_method() async {
+    String aPath = provider.convertPath('/a.dart');
+    addSource(aPath, r'''
+class A {
+  void foo() {}
+}
+''');
+
+    String path = provider.convertPath('/test.dart');
+    String content = r'''
+import 'a.dart';
+''';
+    addSource(path, content);
+
+    var aElement = await _getClassElement(aPath, 'A');
+    var fooElement = aElement.methods[0];
+
+    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    await builder.addFileEdit(path, (DartFileEditBuilder builder) {
+      builder.addInsertion(content.length - 1, (DartEditBuilder builder) {
+        builder.writeReference(fooElement);
+      });
+    });
+    SourceEdit edit = getEdit(builder);
+    expect(edit.replacement, equalsIgnoringWhitespace('foo'));
+  }
+
+  test_writeReference_topLevel_hasImport_noPrefix() async {
+    String aPath = provider.convertPath('/a.dart');
+    addSource(aPath, 'const a = 42;');
+
+    String path = provider.convertPath('/test.dart');
+    String content = r'''
+import 'a.dart';
+''';
+    addSource(path, content);
+
+    var aElement = await _getTopLevelAccessorElement(aPath, 'a');
+
+    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    await builder.addFileEdit(path, (DartFileEditBuilder builder) {
+      builder.addInsertion(content.length - 1, (DartEditBuilder builder) {
+        builder.writeReference(aElement);
+      });
+    });
+    SourceEdit edit = getEdit(builder);
+    expect(edit.replacement, equalsIgnoringWhitespace('a'));
+  }
+
+  test_writeReference_topLevel_hasImport_prefix() async {
+    String aPath = provider.convertPath('/a.dart');
+    addSource(aPath, 'const a = 42;');
+
+    String path = provider.convertPath('/test.dart');
+    String content = r'''
+import 'a.dart' as p;
+''';
+    addSource(path, content);
+
+    var aElement = await _getTopLevelAccessorElement(aPath, 'a');
+
+    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    await builder.addFileEdit(path, (DartFileEditBuilder builder) {
+      builder.addInsertion(content.length - 1, (DartEditBuilder builder) {
+        builder.writeReference(aElement);
+      });
+    });
+    SourceEdit edit = getEdit(builder);
+    expect(edit.replacement, equalsIgnoringWhitespace('p.a'));
+  }
+
+  test_writeReference_topLevel_noImport() async {
+    String aPath = provider.convertPath('/a.dart');
+    addSource(aPath, 'const a = 42;');
+
+    String path = provider.convertPath('/test.dart');
+    String content = '';
+    addSource(path, content);
+
+    var aElement = await _getTopLevelAccessorElement(aPath, 'a');
+
+    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    await builder.addFileEdit(path, (DartFileEditBuilder builder) {
+      builder.addInsertion(content.length - 1, (DartEditBuilder builder) {
+        builder.writeReference(aElement);
+      });
+    });
+    List<SourceEdit> edits = getEdits(builder);
+    expect(edits, hasLength(2));
+    expect(edits[0].replacement, equalsIgnoringWhitespace("import 'a.dart';"));
+    expect(edits[1].replacement, equalsIgnoringWhitespace('a'));
+  }
+
   test_writeType_dynamic() async {
     String path = provider.convertPath('/test.dart');
     String content = 'class A {}';
@@ -1912,6 +2049,12 @@
     return result.element.getType(name);
   }
 
+  Future<PropertyAccessorElement> _getTopLevelAccessorElement(
+      String path, String name) async {
+    UnitElementResult result = await driver.getUnitElement(path);
+    return result.element.accessors.firstWhere((v) => v.name == name);
+  }
+
   Future<DartType> _getType(String path, String name) async {
     ClassElement classElement = await _getClassElement(path, name);
     return classElement.type;
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 055d40e..d0a95e6 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -576,8 +576,10 @@
   ClassEntity get controllerStream =>
       _findAsyncHelperClass("_ControllerStream");
 
+  ClassEntity get streamIterator => _findAsyncHelperClass("StreamIterator");
+
   ConstructorEntity get streamIteratorConstructor =>
-      _env.lookupConstructor(_findAsyncHelperClass("StreamIterator"), "");
+      _env.lookupConstructor(streamIterator, "");
 
   FunctionEntity _syncStarIterableFactory;
   FunctionEntity get syncStarIterableFactory => _syncStarIterableFactory ??=
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index c7db088..1e56455 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -23,7 +23,7 @@
     show AstElement, ClassElement, Element, MethodElement, LocalFunctionElement;
 import 'elements/entities.dart';
 import 'kernel/kelements.dart' show KLocalFunction;
-import 'universe/use.dart' show StaticUse, StaticUseKind, TypeUse, TypeUseKind;
+import 'universe/use.dart';
 import 'universe/world_impact.dart'
     show ImpactUseCase, WorldImpact, WorldImpactVisitorImpl;
 import 'util/uri_extras.dart' as uri_extras;
@@ -320,6 +320,18 @@
             case StaticUseKind.CONST_CONSTRUCTOR_INVOKE:
               _collectTypeDependencies(staticUse.type, elements);
               break;
+            case StaticUseKind.INVOKE:
+            case StaticUseKind.CLOSURE_CALL:
+            case StaticUseKind.DIRECT_INVOKE:
+              // TODO(johnniwinther): Use rti need data to skip unneeded type
+              // arguments.
+              List<DartType> typeArguments = staticUse.typeArguments;
+              if (typeArguments != null) {
+                for (DartType typeArgument in typeArguments) {
+                  _collectTypeDependencies(typeArgument, elements);
+                }
+              }
+              break;
             default:
           }
         }, visitTypeUse: (TypeUse typeUse) {
@@ -358,6 +370,15 @@
               }
               break;
           }
+        }, visitDynamicUse: (DynamicUse dynamicUse) {
+          // TODO(johnniwinther): Use rti need data to skip unneeded type
+          // arguments.
+          List<DartType> typeArguments = dynamicUse.typeArguments;
+          if (typeArguments != null) {
+            for (DartType typeArgument in typeArguments) {
+              _collectTypeDependencies(typeArgument, elements);
+            }
+          }
         }),
         DeferredLoadTask.IMPACT_USE);
   }
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index 165643c..dee89c3 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -8,7 +8,6 @@
     show ChunkedConversionSink, JsonEncoder, StringConversionSink;
 
 import 'package:dart2js_info/info.dart';
-import 'package:path/path.dart' as p;
 
 import '../compiler_new.dart';
 import 'common/names.dart';
@@ -78,17 +77,7 @@
       libname = '<unnamed>';
     }
     int size = compiler.dumpInfoTask.sizeOf(lib);
-
-    var uri = lib.canonicalUri;
-    if (Uri.base.isScheme('file') && lib.canonicalUri.isScheme('file')) {
-      var basePath = p.fromUri(Uri.base);
-      var libPath = p.fromUri(lib.canonicalUri);
-      if (p.isWithin(basePath, libPath)) {
-        uri = p.toUri(p.relative(libPath, from: basePath));
-      }
-    }
-
-    LibraryInfo info = new LibraryInfo(libname, uri, null, size);
+    LibraryInfo info = new LibraryInfo(libname, lib.canonicalUri, null, size);
     _entityToInfo[lib] = info;
 
     environment.forEachLibraryMember(lib, (MemberEntity member) {
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index 44c7969..184b42e 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -60,7 +60,7 @@
   ClosedWorld get closedWorld;
   ClosedWorldRefiner get closedWorldRefiner;
   DiagnosticReporter get reporter;
-  CommonMasks get commonMasks => closedWorld.commonMasks;
+  CommonMasks get commonMasks => closedWorld.abstractValueDomain;
   CommonElements get commonElements => closedWorld.commonElements;
 
   // TODO(johnniwinther): This should be part of [ClosedWorld] or
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
index d0d98eb..b59bf9f 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
@@ -61,7 +61,7 @@
 
   String get name => 'Graph inferrer';
 
-  CommonMasks get commonMasks => closedWorld.commonMasks;
+  CommonMasks get commonMasks => closedWorld.abstractValueDomain;
 
   TypeMask get _dynamicType => commonMasks.dynamicType;
 
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index a5ea018..d17c19d 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -2005,7 +2005,7 @@
   } else if (annotation.isVoid) {
     return type;
   } else if (annotation.isTypedef || annotation.isFunctionType) {
-    otherType = closedWorld.commonMasks.functionType;
+    otherType = closedWorld.abstractValueDomain.functionType;
   } else if (annotation.isFutureOr) {
     // TODO(johnniwinther): Narrow FutureOr types.
     return type;
diff --git a/pkg/compiler/lib/src/inferrer/type_system.dart b/pkg/compiler/lib/src/inferrer/type_system.dart
index 90c3101..3d3c9c8 100644
--- a/pkg/compiler/lib/src/inferrer/type_system.dart
+++ b/pkg/compiler/lib/src/inferrer/type_system.dart
@@ -99,7 +99,7 @@
     nonNullEmptyType = getConcreteTypeFor(commonMasks.emptyType);
   }
 
-  CommonMasks get commonMasks => closedWorld.commonMasks;
+  CommonMasks get commonMasks => closedWorld.abstractValueDomain;
 
   /// Used to group [TypeInformation] nodes by the element that triggered their
   /// creation.
diff --git a/pkg/compiler/lib/src/js_emitter/instantiation_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/instantiation_stub_generator.dart
index 35ff906..865fc15 100644
--- a/pkg/compiler/lib/src/js_emitter/instantiation_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/instantiation_stub_generator.dart
@@ -4,6 +4,7 @@
 
 library dart2js.js_emitter.instantiation_stub_generator;
 
+import '../common/names.dart';
 import '../common_elements.dart' show CommonElements;
 import '../elements/entities.dart';
 import '../io/source_information.dart';
@@ -147,22 +148,49 @@
     Map<Selector, SelectorConstraints> callSelectors =
         _codegenWorldBuilder.invocationsByName(call);
 
+    Set<ParameterStructure> computeLiveParameterStructures() {
+      Set<ParameterStructure> parameterStructures =
+          new Set<ParameterStructure>();
+
+      void process(Iterable<FunctionEntity> functions) {
+        for (FunctionEntity function in functions) {
+          if (function.parameterStructure.typeParameters == typeArgumentCount) {
+            parameterStructures.add(function.parameterStructure);
+          }
+        }
+      }
+
+      process(_codegenWorldBuilder.closurizedStatics);
+      process(_codegenWorldBuilder.closurizedMembers);
+      process(_codegenWorldBuilder.genericInstanceMethods.where(
+          (FunctionEntity function) =>
+              function.name == Identifiers.call &&
+              function.enclosingClass.isClosure));
+
+      return parameterStructures;
+    }
+
     List<StubMethod> stubs = <StubMethod>[];
 
     // For every call-selector generate a stub to the corresponding selector
     // with filled-in type arguments.
 
+    Set<ParameterStructure> parameterStructures;
     for (Selector selector in callSelectors.keys) {
       CallStructure callStructure = selector.callStructure;
       if (callStructure.typeArgumentCount != 0) continue;
-      // TODO(sra): Eliminate selectors that are not supported by any generic
-      // function with [typeArgumentCount] type arguments.
-      CallStructure genericCallStructrure =
+      CallStructure genericCallStructure =
           callStructure.withTypeArgumentCount(typeArgumentCount);
-      Selector genericSelector =
-          new Selector.call(selector.memberName, genericCallStructrure);
-      stubs.add(_generateStub(
-          instantiationClass, functionField, selector, genericSelector));
+      parameterStructures ??= computeLiveParameterStructures();
+      for (ParameterStructure parameterStructure in parameterStructures) {
+        if (genericCallStructure.signatureApplies(parameterStructure)) {
+          Selector genericSelector =
+              new Selector.call(selector.memberName, genericCallStructure);
+          stubs.add(_generateStub(
+              instantiationClass, functionField, selector, genericSelector));
+          break;
+        }
+      }
     }
 
     stubs.add(_generateSignatureStub(functionField));
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index 144e302..b47e96d 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -735,17 +735,10 @@
 
     // If there are many references to `this`, cache it in a local.
     if (cls.fields.length + (cls.hasRtiField ? 1 : 0) >= 4) {
-      // TODO(29455): Fix js_ast printer and minifier to avoid conflicts between
-      // js.Name and string-named variables, then use '_' in the js template
-      // text.
-
-      // We pick '_' in minified mode because no field minifies to '_'. This
-      // avoids a conflict with one of the parameters which are named the same
-      // as the fields.  Unminified, a field might have the name '_', so we pick
-      // '$_', which is an impossible member name since we escape '$'s in names.
-      js.Name underscore = compiler.options.enableMinification
-          ? new StringBackedName('_')
-          : new StringBackedName(r'$_');
+      // Parameters are named t0, t1, etc, so '_' will not conflict. Forcing '_'
+      // in minified mode works because no parameter or local also minifies to
+      // '_' (the minifier doesn't know '_' is available).
+      js.Name underscore = new StringBackedName('_');
       statements.add(js.js.statement('var # = this;', underscore));
       thisRef = underscore;
     } else {
diff --git a/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
index b575680..3c3f6bf 100644
--- a/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
@@ -149,7 +149,7 @@
   TypeMask typeOfListLiteral(
       MemberEntity owner, ir.ListLiteral listLiteral, ClosedWorld closedWorld) {
     return _resultOf(owner).typeOfListLiteral(listLiteral) ??
-        closedWorld.commonMasks.dynamicType;
+        closedWorld.abstractValueDomain.dynamicType;
   }
 
   TypeMask typeOfIterator(ir.ForInStatement node) {
@@ -183,7 +183,7 @@
         mask.containsOnly(
             closedWorld.commonElements.jsUnmodifiableArrayClass) ||
         mask.containsOnlyString(closedWorld) ||
-        closedWorld.commonMasks.isTypedArray(mask)) {
+        closedWorld.abstractValueDomain.isTypedArray(mask)) {
       return true;
     }
     return false;
diff --git a/pkg/compiler/lib/src/native/ssa.dart b/pkg/compiler/lib/src/native/ssa.dart
index 5fc3b5d..240df64 100644
--- a/pkg/compiler/lib/src/native/ssa.dart
+++ b/pkg/compiler/lib/src/native/ssa.dart
@@ -101,7 +101,7 @@
         effects: new SideEffects()));
     // TODO(johnniwinther): Provide source information.
     builder
-        .close(new HReturn(builder.pop(), null))
+        .close(new HReturn(builder.abstractValueDomain, builder.pop(), null))
         .addSuccessor(builder.graph.exit);
   } else {
     if (parameters.parameterCount != 0) {
diff --git a/pkg/compiler/lib/src/ordered_typeset.dart b/pkg/compiler/lib/src/ordered_typeset.dart
index 860d67f..52b4d61 100644
--- a/pkg/compiler/lib/src/ordered_typeset.dart
+++ b/pkg/compiler/lib/src/ordered_typeset.dart
@@ -36,8 +36,7 @@
   final Link<InterfaceType> types;
   final Link<InterfaceType> _supertypes;
 
-  OrderedTypeSet.internal(List<Link<InterfaceType>> this._levels,
-      Link<InterfaceType> this.types, Link<InterfaceType> this._supertypes);
+  OrderedTypeSet.internal(this._levels, this.types, this._supertypes);
 
   factory OrderedTypeSet.singleton(InterfaceType type) {
     Link<InterfaceType> types =
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index 8a75570..a18d29f 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -480,7 +480,7 @@
       // Don't inline operator== methods if the parameter can be null.
       if (function.name == '==') {
         if (function.enclosingClass != commonElements.objectClass &&
-            providedArguments[1].canBeNull()) {
+            providedArguments[1].canBeNull(abstractValueDomain)) {
           return false;
         }
       }
@@ -727,8 +727,8 @@
       push(invokeJsInteropFunction(functionElement, parameters.values.toList(),
           sourceInformationBuilder.buildGeneric(function)));
       var value = pop();
-      closeAndGotoExit(new HReturn(
-          value, sourceInformationBuilder.buildReturn(functionElement.node)));
+      closeAndGotoExit(new HReturn(abstractValueDomain, value,
+          sourceInformationBuilder.buildReturn(functionElement.node)));
       return closeFunction();
     }
     assert(!function.modifiers.isExternal, failedAt(functionElement));
@@ -747,6 +747,7 @@
             },
             visitThen: () {
               closeAndGotoExit(new HReturn(
+                  abstractValueDomain,
                   graph.addConstantBool(false, closedWorld),
                   sourceInformationBuilder
                       .buildImplicitReturn(functionElement)));
@@ -756,8 +757,8 @@
       }
     }
     if (const bool.fromEnvironment('unreachable-throw')) {
-      var emptyParameters =
-          parameters.values.where((p) => p.instructionType.isEmpty);
+      var emptyParameters = parameters.values
+          .where((p) => abstractValueDomain.isEmpty(p.instructionType));
       if (emptyParameters.length > 0) {
         addComment('${emptyParameters} inferred as [empty]');
         pushInvokeStatic(
@@ -796,7 +797,7 @@
     graph.entry.addBefore(graph.entry.last, parameter);
     HInstruction value = typeBuilder.potentiallyCheckOrTrustTypeOfParameter(
         parameter, field.type);
-    add(new HFieldSet(field, thisInstruction, value));
+    add(new HFieldSet(abstractValueDomain, field, thisInstruction, value));
     return closeFunction();
   }
 
@@ -827,8 +828,8 @@
       }
     }
 
-    closeAndGotoExit(new HReturn(
-        value, sourceInformationBuilder.buildReturn(sourceInfoNode)));
+    closeAndGotoExit(new HReturn(abstractValueDomain, value,
+        sourceInformationBuilder.buildReturn(sourceInfoNode)));
     return closeFunction();
   }
 
@@ -1358,7 +1359,8 @@
       add(new HFieldGet(null, newObject, commonMasks.dynamicType,
           isAssignable: false));
       for (int i = 0; i < fields.length; i++) {
-        add(new HFieldSet(fields[i], newObject, constructorArguments[i]));
+        add(new HFieldSet(abstractValueDomain, fields[i], newObject,
+            constructorArguments[i]));
       }
     }
     removeInlinedInstantiation(type);
@@ -1431,7 +1433,7 @@
       }
     }
     if (inliningStack.isEmpty) {
-      closeAndGotoExit(new HReturn(newObject,
+      closeAndGotoExit(new HReturn(abstractValueDomain, newObject,
           sourceInformationBuilder.buildImplicitReturn(functionElement)));
       return closeFunction();
     } else {
@@ -1466,7 +1468,7 @@
         parameters,
         sourceInformationBuilder.buildDeclaration(element),
         isGenerativeConstructorBody: element.isGenerativeConstructorBody);
-    close(new HGoto()).addSuccessor(block);
+    close(new HGoto(abstractValueDomain)).addSuccessor(block);
 
     open(block);
 
@@ -1598,8 +1600,8 @@
 
   HGraph closeFunction() {
     // TODO(kasperl): Make this goto an implicit return.
-    if (!isAborted()) closeAndGotoExit(new HGoto());
-    graph.finalize();
+    if (!isAborted()) closeAndGotoExit(new HGoto(abstractValueDomain));
+    graph.finalize(abstractValueDomain);
     return graph;
   }
 
@@ -1715,8 +1717,8 @@
     if (throwExpression != null && inliningStack.isEmpty) {
       visitThrowExpression(throwExpression.expression);
       handleInTryStatement();
-      closeAndGotoExit(
-          new HThrow(pop(), sourceInformationBuilder.buildThrow(node)));
+      closeAndGotoExit(new HThrow(abstractValueDomain, pop(),
+          sourceInformationBuilder.buildThrow(node)));
     } else {
       visit(node.expression);
       pop();
@@ -1813,7 +1815,7 @@
     HBasicBlock bodyExitBlock;
     bool isAbortingBody = false;
     if (current != null) {
-      bodyExitBlock = close(new HGoto());
+      bodyExitBlock = close(new HGoto(abstractValueDomain));
     } else {
       isAbortingBody = true;
       bodyExitBlock = lastOpenedBlock;
@@ -1858,13 +1860,13 @@
       visit(node.condition);
       assert(!isAborted());
       HInstruction conditionInstruction = popBoolified();
-      HBasicBlock conditionEndBlock = close(
-          new HLoopBranch(conditionInstruction, HLoopBranch.DO_WHILE_LOOP));
+      HBasicBlock conditionEndBlock = close(new HLoopBranch(abstractValueDomain,
+          conditionInstruction, HLoopBranch.DO_WHILE_LOOP));
 
       HBasicBlock avoidCriticalEdge = addNewBlock();
       conditionEndBlock.addSuccessor(avoidCriticalEdge);
       open(avoidCriticalEdge);
-      close(new HGoto());
+      close(new HGoto(abstractValueDomain));
       avoidCriticalEdge.addSuccessor(loopEntryBlock); // The back-edge.
 
       conditionExpression =
@@ -1873,7 +1875,7 @@
       // Avoid a critical edge from the condition to the loop-exit body.
       HBasicBlock conditionExitBlock = addNewBlock();
       open(conditionExitBlock);
-      close(new HGoto());
+      close(new HGoto(abstractValueDomain));
       conditionEndBlock.addSuccessor(conditionExitBlock);
 
       loopHandler.endLoop(
@@ -1913,7 +1915,8 @@
         loopEntryBlock.setBlockFlow(info, current);
         jumpHandler.forEachBreak((HBreak breakInstruction, _) {
           HBasicBlock block = breakInstruction.block;
-          block.addAtExit(new HBreak.toLabel(label, sourceInformation));
+          block.addAtExit(new HBreak.toLabel(
+              abstractValueDomain, label, sourceInformation));
           block.remove(breakInstruction);
         });
       }
@@ -2431,7 +2434,8 @@
         FieldElement field = element;
         value = typeBuilder.potentiallyCheckOrTrustTypeOfAssignment(
             value, field.type);
-        addWithPosition(new HStaticStore(field, value), location);
+        addWithPosition(
+            new HStaticStore(abstractValueDomain, field, value), location);
       }
       stack.add(value);
     } else if (Elements.isError(element)) {
@@ -2802,7 +2806,7 @@
     if (trustedMask != null) {
       // We only allow the type argument to narrow `dynamic`, which probably
       // comes from an unspecified return type in the NativeBehavior.
-      if (code.instructionType.containsAll(closedWorld)) {
+      if (abstractValueDomain.containsAll(code.instructionType)) {
         // Overwrite the type with the narrower type.
         code.instructionType = trustedMask;
       } else if (trustedMask.containsMask(code.instructionType, closedWorld)) {
@@ -3471,7 +3475,7 @@
       } else if (isGrowableListConstructorCall) {
         TypeMask inferred = _inferredTypeOfNewList(send);
         return inferred.containsAll(closedWorld)
-            ? commonMasks.extendableArrayType
+            ? commonMasks.growableListType
             : inferred;
       } else if (Elements.isConstructorOfTypedArraySubclass(
           originalElement, closedWorld)) {
@@ -3579,7 +3583,7 @@
 
     TypeMask elementType = computeType(constructor);
     if (isFixedListConstructorCall) {
-      if (!inputs[0].isNumber(closedWorld)) {
+      if (!inputs[0].isNumber(abstractValueDomain)) {
         HTypeConversion conversion = new HTypeConversion(
             null,
             HTypeConversion.ARGUMENT_TYPE_CHECK,
@@ -3598,7 +3602,7 @@
       // TODO(sra): Array allocation should be an instruction so that canThrow
       // can depend on a length type discovered in optimization.
       bool canThrow = true;
-      if (inputs[0].isInteger(closedWorld) && inputs[0] is HConstant) {
+      if (inputs[0].isInteger(abstractValueDomain) && inputs[0] is HConstant) {
         dynamic constant = inputs[0];
         IntConstantValue intConstant = constant.constant;
         int value = intConstant.intValue;
@@ -4359,7 +4363,7 @@
       type = TypeMaskFactory.inferredReturnTypeForElement(
           method, globalInferenceResults);
     } else {
-      type = closedWorld.commonMasks.dynamicType;
+      type = closedWorld.abstractValueDomain.dynamicType;
     }
     HInstruction instruction = new HInvokeSuper(
         element,
@@ -5219,8 +5223,8 @@
       reporter.internalError(node, 'rethrowableException should not be null.');
     }
     handleInTryStatement();
-    closeAndGotoExit(new HThrow(
-        exception, sourceInformationBuilder.buildThrow(node),
+    closeAndGotoExit(new HThrow(abstractValueDomain, exception,
+        sourceInformationBuilder.buildThrow(node),
         isRethrow: true));
   }
 
@@ -5361,8 +5365,8 @@
     visitThrowExpression(node.expression);
     if (isReachable) {
       handleInTryStatement();
-      push(new HThrowExpression(
-          pop(), sourceInformationBuilder.buildThrow(node)));
+      push(new HThrowExpression(abstractValueDomain, pop(),
+          sourceInformationBuilder.buildThrow(node)));
       isReachable = false;
     }
   }
@@ -5370,8 +5374,8 @@
   visitYield(ast.Yield node) {
     visit(node.expression);
     HInstruction yielded = pop();
-    add(new HYield(
-        yielded, node.hasStar, sourceInformationBuilder.buildYield(node)));
+    add(new HYield(abstractValueDomain, yielded, node.hasStar,
+        sourceInformationBuilder.buildYield(node)));
   }
 
   visitAwait(ast.Await node) {
@@ -5894,7 +5898,8 @@
 
       // We lift this common call pattern into a helper function to save space
       // in the output.
-      if (typeInputs.every((HInstruction input) => input.isNull())) {
+      if (typeInputs
+          .every((HInstruction input) => input.isNull(abstractValueDomain))) {
         if (listInputs.isEmpty) {
           createFunction = commonElements.mapLiteralUntypedEmptyMaker;
         } else {
@@ -6217,7 +6222,8 @@
       return;
     }
 
-    HSwitch switchInstruction = new HSwitch(<HInstruction>[expression]);
+    HSwitch switchInstruction =
+        new HSwitch(abstractValueDomain, <HInstruction>[expression]);
     HBasicBlock expressionEnd = close(switchInstruction);
     LocalsHandler savedLocals = localsHandler;
 
@@ -6248,7 +6254,8 @@
         if (caseIterator.hasNext && isReachable) {
           pushInvokeStatic(switchCase, commonElements.fallThroughError, []);
           HInstruction error = pop();
-          closeAndGotoExit(new HThrow(error, error.sourceInformation));
+          closeAndGotoExit(
+              new HThrow(abstractValueDomain, error, error.sourceInformation));
         } else if (!isDefaultCase(switchCase)) {
           // If there is no default, we will add one later to avoid
           // the critical edge. So we generate a break statement to make
@@ -6277,7 +6284,7 @@
       assert(false, failedAt(errorNode, 'Continue cannot target a switch.'));
     });
     if (!isAborted()) {
-      current.close(new HGoto());
+      current.close(new HGoto(abstractValueDomain));
       lastOpenedBlock.addSuccessor(joinBlock);
       caseHandlers.add(localsHandler);
     }
@@ -6287,7 +6294,7 @@
       HBasicBlock defaultCase = addNewBlock();
       expressionEnd.addSuccessor(defaultCase);
       open(defaultCase);
-      close(new HGoto());
+      close(new HGoto(abstractValueDomain));
       defaultCase.addSuccessor(joinBlock);
       caseHandlers.add(savedLocals);
       statements.add(new HSubGraphBlockInformation(
@@ -6340,7 +6347,7 @@
     // variables were used in a non-dominated block.
     LocalsHandler savedLocals = new LocalsHandler.from(localsHandler);
     HBasicBlock enterBlock = openNewBlock();
-    HTry tryInstruction = new HTry();
+    HTry tryInstruction = new HTry(abstractValueDomain);
     close(tryInstruction);
     bool oldInTryStatement = inTryStatement;
     inTryStatement = true;
@@ -6356,7 +6363,7 @@
     // We use a [HExitTry] instead of a [HGoto] for the try block
     // because it will have two successors: the join block, and
     // the finally block.
-    if (!isAborted()) endTryBlock = close(new HExitTry());
+    if (!isAborted()) endTryBlock = close(new HExitTry(abstractValueDomain));
     SubGraph bodyGraph = new SubGraph(startTryBlock, lastOpenedBlock);
 
     SubGraph finallyGraph = null;
@@ -6365,7 +6372,7 @@
     startFinallyBlock = graph.addNewBlock();
     open(startFinallyBlock);
     buildFinally();
-    if (!isAborted()) endFinallyBlock = close(new HGoto());
+    if (!isAborted()) endFinallyBlock = close(new HGoto(abstractValueDomain));
     tryInstruction.finallyBlock = startFinallyBlock;
     finallyGraph = new SubGraph(startFinallyBlock, lastOpenedBlock);
 
@@ -6430,7 +6437,7 @@
     // in a non-dominated block.
     LocalsHandler savedLocals = new LocalsHandler.from(localsHandler);
     HBasicBlock enterBlock = openNewBlock();
-    HTry tryInstruction = new HTry();
+    HTry tryInstruction = new HTry(abstractValueDomain);
     close(tryInstruction);
     bool oldInTryStatement = inTryStatement;
     inTryStatement = true;
@@ -6448,7 +6455,7 @@
     // We use a [HExitTry] instead of a [HGoto] for the try block
     // because it will have multiple successors: the join block, and
     // the catch or finally block.
-    if (!isAborted()) endTryBlock = close(new HExitTry());
+    if (!isAborted()) endTryBlock = close(new HExitTry(abstractValueDomain));
     SubGraph bodyGraph = new SubGraph(startTryBlock, lastOpenedBlock);
     SubGraph catchGraph = null;
     HLocalValue exception = null;
@@ -6530,7 +6537,8 @@
 
       void visitElse() {
         if (link.isEmpty) {
-          closeAndGotoExit(new HThrow(exception, exception.sourceInformation,
+          closeAndGotoExit(new HThrow(
+              abstractValueDomain, exception, exception.sourceInformation,
               isRethrow: true));
         } else {
           ast.CatchBlock newBlock = link.head;
@@ -6554,7 +6562,7 @@
           visitThen: visitThen,
           visitElse: visitElse,
           sourceInformation: sourceInformationBuilder.buildCatch(firstBlock));
-      if (!isAborted()) endCatchBlock = close(new HGoto());
+      if (!isAborted()) endCatchBlock = close(new HGoto(abstractValueDomain));
 
       rethrowableException = oldRethrowableException;
       tryInstruction.catchBlock = startCatchBlock;
@@ -6567,7 +6575,7 @@
       startFinallyBlock = graph.addNewBlock();
       open(startFinallyBlock);
       visit(node.finallyBlock);
-      if (!isAborted()) endFinallyBlock = close(new HGoto());
+      if (!isAborted()) endFinallyBlock = close(new HGoto(abstractValueDomain));
       tryInstruction.finallyBlock = startFinallyBlock;
       finallyGraph = new SubGraph(startFinallyBlock, lastOpenedBlock);
     }
@@ -6692,8 +6700,8 @@
 
   void emitReturn(HInstruction value, ast.Node node) {
     if (inliningStack.isEmpty) {
-      closeAndGotoExit(
-          new HReturn(value, sourceInformationBuilder.buildReturn(node)));
+      closeAndGotoExit(new HReturn(abstractValueDomain, value,
+          sourceInformationBuilder.buildReturn(node)));
     } else {
       localsHandler.updateLocal(returnLocal, value);
     }
@@ -6782,7 +6790,7 @@
     //      conversions.
     //   2. The value can be primitive, because the library stringifier has
     //      fast-path code for most primitives.
-    if (expression.canBePrimitive(builder.closedWorld)) {
+    if (expression.canBePrimitive(builder.abstractValueDomain)) {
       append(stringify(node, expression));
       return;
     }
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 3d8966f..b22a63e 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -323,7 +323,7 @@
       graph.entry.addBefore(graph.entry.last, parameter);
       HInstruction value = typeBuilder.potentiallyCheckOrTrustTypeOfParameter(
           parameter, _getDartTypeIfValid(node.type));
-      add(new HFieldSet(field, thisInstruction, value));
+      add(new HFieldSet(abstractValueDomain, field, thisInstruction, value));
     } else {
       if (node.initializer != null) {
         node.initializer.accept(this);
@@ -336,8 +336,8 @@
         stack.add(graph.addConstantNull(closedWorld));
       }
       HInstruction value = pop();
-      closeAndGotoExit(
-          new HReturn(value, _sourceInformationBuilder.buildReturn(node)));
+      closeAndGotoExit(new HReturn(abstractValueDomain, value,
+          _sourceInformationBuilder.buildReturn(node)));
     }
     closeFunction();
   }
@@ -496,7 +496,8 @@
       add(new HFieldGet(null, newObject, commonMasks.dynamicType,
           isAssignable: false));
       for (int i = 0; i < fields.length; i++) {
-        add(new HFieldSet(fields[i], newObject, constructorArguments[i]));
+        add(new HFieldSet(abstractValueDomain, fields[i], newObject,
+            constructorArguments[i]));
       }
     } else {
       // Create the runtime type information, if needed.
@@ -604,7 +605,8 @@
     }
 
     if (_inliningStack.isEmpty) {
-      closeAndGotoExit(new HReturn(newObject, sourceInformation));
+      closeAndGotoExit(
+          new HReturn(abstractValueDomain, newObject, sourceInformation));
       closeFunction();
     } else {
       localsHandler.updateLocal(_returnLocal, newObject,
@@ -920,8 +922,8 @@
         typeArguments,
         commonMasks.functionType));
     HInstruction value = pop();
-    close(new HReturn(
-            value, _sourceInformationBuilder.buildReturn(originalClosureNode)))
+    close(new HReturn(abstractValueDomain, value,
+            _sourceInformationBuilder.buildReturn(originalClosureNode)))
         .addSuccessor(graph.exit);
 
     closeFunction();
@@ -954,6 +956,7 @@
             },
             visitThen: () {
               closeAndGotoExit(new HReturn(
+                  abstractValueDomain,
                   graph.addConstantBool(false, closedWorld),
                   _sourceInformationBuilder.buildReturn(functionNode)));
             },
@@ -1083,8 +1086,8 @@
       if (targetElement.isSetter) {
         value = graph.addConstantNull(closedWorld);
       }
-      close(new HReturn(
-              value, _sourceInformationBuilder.buildReturn(functionNode)))
+      close(new HReturn(abstractValueDomain, value,
+              _sourceInformationBuilder.buildReturn(functionNode)))
           .addSuccessor(graph.exit);
     }
     // TODO(sra): Handle JS-interop methods.
@@ -1129,7 +1132,7 @@
         parameterMap,
         _sourceInformationBuilder.buildDeclaration(targetElement),
         isGenerativeConstructorBody: targetElement is ConstructorBodyEntity);
-    close(new HGoto()).addSuccessor(block);
+    close(new HGoto(abstractValueDomain)).addSuccessor(block);
 
     open(block);
 
@@ -1144,8 +1147,8 @@
   }
 
   void closeFunction() {
-    if (!isAborted()) closeAndGotoExit(new HGoto());
-    graph.finalize();
+    if (!isAborted()) closeAndGotoExit(new HGoto(abstractValueDomain));
+    graph.finalize(abstractValueDomain);
   }
 
   @override
@@ -1246,7 +1249,8 @@
       handleInTryStatement();
       SourceInformation sourceInformation =
           _sourceInformationBuilder.buildThrow(node.expression);
-      closeAndGotoExit(new HThrow(pop(), sourceInformation));
+      closeAndGotoExit(
+          new HThrow(abstractValueDomain, pop(), sourceInformation));
     } else {
       expression.accept(this);
       pop();
@@ -1571,12 +1575,25 @@
     HInstruction streamIterator;
 
     node.iterable.accept(this);
-    _pushStaticInvocation(
-        _commonElements.streamIteratorConstructor,
-        [pop(), graph.addConstantNull(closedWorld)],
-        _typeInferenceMap
-            .getReturnTypeOf(_commonElements.streamIteratorConstructor),
-        const <DartType>[]);
+
+    List<HInstruction> arguments = [pop()];
+    ClassEntity cls = _commonElements.streamIterator;
+    DartType typeArg = _elementMap.getDartType(node.variable.type);
+    InterfaceType instanceType =
+        localsHandler.substInContext(new InterfaceType(cls, [typeArg]));
+    addImplicitInstantiation(instanceType);
+    SourceInformation sourceInformation =
+        _sourceInformationBuilder.buildForInIterator(node);
+    // TODO(johnniwinther): Pass type arguments to constructors like calling
+    // a generic method.
+    if (rtiNeed.classNeedsTypeArguments(cls)) {
+      _addTypeArguments(arguments, [typeArg], sourceInformation);
+    }
+    ConstructorEntity constructor = _commonElements.streamIteratorConstructor;
+    _pushStaticInvocation(constructor, arguments,
+        _typeInferenceMap.getReturnTypeOf(constructor), const <DartType>[],
+        instanceType: instanceType, sourceInformation: sourceInformation);
+
     streamIterator = pop();
 
     void buildInitializer() {}
@@ -1591,7 +1608,7 @@
           const <DartType>[],
           _sourceInformationBuilder.buildForInMoveNext(node));
       HInstruction future = pop();
-      push(new HAwait(future, closedWorld.commonMasks.dynamicType));
+      push(new HAwait(future, abstractValueDomain.dynamicType));
       return popBoolified();
     }
 
@@ -1628,7 +1645,7 @@
     void finalizerFunction() {
       _pushDynamicInvocation(node, null, Selectors.cancel, [streamIterator],
           const <DartType>[], _sourceInformationBuilder.buildGeneric(node));
-      add(new HAwait(pop(), closedWorld.commonMasks.dynamicType));
+      add(new HAwait(pop(), abstractValueDomain.dynamicType));
     }
 
     tryBuilder
@@ -1713,7 +1730,7 @@
     HBasicBlock bodyExitBlock;
     bool isAbortingBody = false;
     if (current != null) {
-      bodyExitBlock = close(new HGoto());
+      bodyExitBlock = close(new HGoto(abstractValueDomain));
     } else {
       isAbortingBody = true;
       bodyExitBlock = lastOpenedBlock;
@@ -1758,13 +1775,13 @@
       node.condition.accept(this);
       assert(!isAborted());
       HInstruction conditionInstruction = popBoolified();
-      HBasicBlock conditionEndBlock = close(
-          new HLoopBranch(conditionInstruction, HLoopBranch.DO_WHILE_LOOP));
+      HBasicBlock conditionEndBlock = close(new HLoopBranch(abstractValueDomain,
+          conditionInstruction, HLoopBranch.DO_WHILE_LOOP));
 
       HBasicBlock avoidCriticalEdge = addNewBlock();
       conditionEndBlock.addSuccessor(avoidCriticalEdge);
       open(avoidCriticalEdge);
-      close(new HGoto());
+      close(new HGoto(abstractValueDomain));
       avoidCriticalEdge.addSuccessor(loopEntryBlock); // The back-edge.
 
       conditionExpression =
@@ -1773,7 +1790,7 @@
       // Avoid a critical edge from the condition to the loop-exit body.
       HBasicBlock conditionExitBlock = addNewBlock();
       open(conditionExitBlock);
-      close(new HGoto());
+      close(new HGoto(abstractValueDomain));
       conditionEndBlock.addSuccessor(conditionExitBlock);
 
       loopHandler.endLoop(
@@ -1813,7 +1830,8 @@
         loopEntryBlock.setBlockFlow(info, current);
         jumpHandler.forEachBreak((HBreak breakInstruction, _) {
           HBasicBlock block = breakInstruction.block;
-          block.addAtExit(new HBreak.toLabel(label, sourceInformation));
+          block.addAtExit(new HBreak.toLabel(
+              abstractValueDomain, label, sourceInformation));
           block.remove(breakInstruction);
         });
       }
@@ -2312,7 +2330,8 @@
       return;
     }
 
-    HSwitch switchInstruction = new HSwitch(<HInstruction>[expression]);
+    HSwitch switchInstruction =
+        new HSwitch(abstractValueDomain, <HInstruction>[expression]);
     HBasicBlock expressionEnd = close(switchInstruction);
     LocalsHandler savedLocals = localsHandler;
 
@@ -2372,7 +2391,7 @@
               'Continue cannot target a switch.'));
     });
     if (!isAborted()) {
-      current.close(new HGoto());
+      current.close(new HGoto(abstractValueDomain));
       lastOpenedBlock.addSuccessor(joinBlock);
       caseHandlers.add(localsHandler);
     }
@@ -2382,7 +2401,7 @@
       HBasicBlock defaultCase = addNewBlock();
       expressionEnd.addSuccessor(defaultCase);
       open(defaultCase);
-      close(new HGoto());
+      close(new HGoto(abstractValueDomain));
       defaultCase.addSuccessor(joinBlock);
       caseHandlers.add(savedLocals);
       statements.add(new HSubGraphBlockInformation(
@@ -2586,7 +2605,8 @@
 
       // We lift this common call pattern into a helper function to save space
       // in the output.
-      if (typeInputs.every((HInstruction input) => input.isNull())) {
+      if (typeInputs
+          .every((HInstruction input) => input.isNull(abstractValueDomain))) {
         if (constructorArgs.isEmpty) {
           constructor = _commonElements.mapLiteralUntypedEmptyMaker;
         } else {
@@ -2724,6 +2744,7 @@
       pop();
     } else {
       add(new HStaticStore(
+          abstractValueDomain,
           _elementMap.getMember(staticTarget),
           typeBuilder.potentiallyCheckOrTrustTypeOfAssignment(
               value, _getDartTypeIfValid(staticTarget.setterType))));
@@ -3176,7 +3197,7 @@
               "Unexpected arguments. "
               "Expected 1-2 argument, actual: $arguments."));
       HInstruction lengthInput = arguments.first;
-      if (!lengthInput.isNumber(closedWorld)) {
+      if (!lengthInput.isNumber(abstractValueDomain)) {
         HTypeConversion conversion = new HTypeConversion(
             null,
             HTypeConversion.ARGUMENT_TYPE_CHECK,
@@ -3199,7 +3220,7 @@
       // TODO(sra): Array allocation should be an instruction so that canThrow
       // can depend on a length type discovered in optimization.
       bool canThrow = true;
-      if (lengthInput.isUInt32(closedWorld)) {
+      if (lengthInput.isUInt32(abstractValueDomain)) {
         canThrow = false;
       }
 
@@ -3747,7 +3768,7 @@
     if (trustedMask != null) {
       // We only allow the type argument to narrow `dynamic`, which probably
       // comes from an unspecified return type in the NativeBehavior.
-      if (code.instructionType.containsAll(closedWorld)) {
+      if (abstractValueDomain.containsAll(code.instructionType)) {
         // Overwrite the type with the narrower type.
         code.instructionType = trustedMask;
       } else if (trustedMask.containsMask(code.instructionType, closedWorld)) {
@@ -4176,7 +4197,7 @@
     if (target is FunctionEntity) {
       typeMask = _typeInferenceMap.getReturnTypeOf(target);
     } else {
-      typeMask = closedWorld.commonMasks.dynamicType;
+      typeMask = abstractValueDomain.dynamicType;
     }
     HInstruction instruction = new HInvokeSuper(
         target,
@@ -4533,7 +4554,7 @@
       SourceInformation sourceInformation =
           _sourceInformationBuilder.buildThrow(node);
       handleInTryStatement();
-      push(new HThrowExpression(pop(), sourceInformation));
+      push(new HThrowExpression(abstractValueDomain, pop(), sourceInformation));
       isReachable = false;
     }
   }
@@ -4550,8 +4571,8 @@
 
   void visitYieldStatement(ir.YieldStatement node) {
     node.expression.accept(this);
-    add(new HYield(
-        pop(), node.isYieldStar, _sourceInformationBuilder.buildYield(node)));
+    add(new HYield(abstractValueDomain, pop(), node.isYieldStar,
+        _sourceInformationBuilder.buildYield(node)));
   }
 
   @override
@@ -4559,7 +4580,7 @@
     node.operand.accept(this);
     HInstruction awaited = pop();
     // TODO(herhut): Improve this type.
-    push(new HAwait(awaited, closedWorld.commonMasks.dynamicType)
+    push(new HAwait(awaited, abstractValueDomain.dynamicType)
       ..sourceInformation = _sourceInformationBuilder.buildAwait(node));
   }
 
@@ -4574,7 +4595,9 @@
     handleInTryStatement();
     SourceInformation sourceInformation =
         _sourceInformationBuilder.buildThrow(node);
-    closeAndGotoExit(new HThrow(exception, sourceInformation, isRethrow: true));
+    closeAndGotoExit(new HThrow(
+        abstractValueDomain, exception, sourceInformation,
+        isRethrow: true));
     // ir.Rethrow is an expression so we need to push a value - a constant with
     // no type.
     stack.add(graph.addConstantUnreachable(closedWorld));
@@ -4699,7 +4722,7 @@
       // Don't inline operator== methods if the parameter can be null.
       if (function.name == '==') {
         if (function.enclosingClass != commonElements.objectClass &&
-            providedArguments[1].canBeNull()) {
+            providedArguments[1].canBeNull(abstractValueDomain)) {
           return false;
         }
       }
@@ -5099,7 +5122,8 @@
 
   void _emitReturn(HInstruction value, SourceInformation sourceInformation) {
     if (_inliningStack.isEmpty) {
-      closeAndGotoExit(new HReturn(value, sourceInformation));
+      closeAndGotoExit(
+          new HReturn(abstractValueDomain, value, sourceInformation));
     } else {
       localsHandler.updateLocal(_returnLocal, value);
     }
@@ -5452,7 +5476,7 @@
   LocalsHandler originalSavedLocals;
 
   TryCatchFinallyBuilder(this.kernelBuilder, this.trySourceInformation) {
-    tryInstruction = new HTry();
+    tryInstruction = new HTry(kernelBuilder.abstractValueDomain);
     originalSavedLocals = new LocalsHandler.from(kernelBuilder.localsHandler);
     enterBlock = kernelBuilder.openNewBlock();
     kernelBuilder.close(tryInstruction);
@@ -5523,7 +5547,8 @@
     kernelBuilder.open(startFinallyBlock);
     buildFinalizer();
     if (!kernelBuilder.isAborted()) {
-      endFinallyBlock = kernelBuilder.close(new HGoto());
+      endFinallyBlock =
+          kernelBuilder.close(new HGoto(kernelBuilder.abstractValueDomain));
     }
     tryInstruction.finallyBlock = startFinallyBlock;
     finallyGraph =
@@ -5535,7 +5560,8 @@
     // because it will have multiple successors: the join block, and
     // the catch or finally block.
     if (!kernelBuilder.isAborted()) {
-      endTryBlock = kernelBuilder.close(new HExitTry());
+      endTryBlock =
+          kernelBuilder.close(new HExitTry(kernelBuilder.abstractValueDomain));
     }
     bodyGraph = new SubGraph(startTryBlock, kernelBuilder.lastOpenedBlock);
   }
@@ -5600,7 +5626,9 @@
     void visitElse() {
       if (catchesIndex >= tryCatch.catches.length) {
         kernelBuilder.closeAndGotoExit(new HThrow(
-            exception, exception.sourceInformation,
+            kernelBuilder.abstractValueDomain,
+            exception,
+            exception.sourceInformation,
             isRethrow: true));
       } else {
         ir.Catch nextCatch = tryCatch.catches[catchesIndex];
@@ -5625,7 +5653,8 @@
         sourceInformation:
             kernelBuilder._sourceInformationBuilder.buildCatch(firstBlock));
     if (!kernelBuilder.isAborted()) {
-      endCatchBlock = kernelBuilder.close(new HGoto());
+      endCatchBlock =
+          kernelBuilder.close(new HGoto(kernelBuilder.abstractValueDomain));
     }
 
     kernelBuilder.rethrowableException = oldRethrowableException;
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 2e4c056..fc0c71b 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -25,6 +25,7 @@
 import '../js_emitter/code_emitter_task.dart';
 import '../native/native.dart' as native;
 import '../options.dart';
+import '../types/abstract_value_domain.dart';
 import '../types/types.dart';
 import '../universe/call_structure.dart' show CallStructure;
 import '../universe/selector.dart' show Selector;
@@ -237,6 +238,9 @@
 
   InterceptorData get _interceptorData => _closedWorld.interceptorData;
 
+  AbstractValueDomain get _abstractValueDomain =>
+      _closedWorld.abstractValueDomain;
+
   bool isGenerateAtUseSite(HInstruction instruction) {
     return generateAtUseSite.contains(instruction);
   }
@@ -306,7 +310,7 @@
   }
 
   bool requiresUintConversion(HInstruction instruction) {
-    if (instruction.isUInt31(_closedWorld)) return false;
+    if (instruction.isUInt31(_abstractValueDomain)) return false;
     if (bitWidth(instruction) <= 31) return false;
     // If the result of a bit-operation is only used by other bit
     // operations, we do not have to convert to an unsigned integer.
@@ -353,7 +357,8 @@
         .visitGraph(graph);
     new SsaTypeKnownRemover().visitGraph(graph);
     new SsaTrustedCheckRemover(_options).visitGraph(graph);
-    new SsaInstructionMerger(generateAtUseSite, _superMemberData)
+    new SsaInstructionMerger(_closedWorld.abstractValueDomain,
+            generateAtUseSite, _superMemberData)
         .visitGraph(graph);
     new SsaConditionMerger(generateAtUseSite, controlFlowOperators)
         .visitGraph(graph);
@@ -1467,11 +1472,11 @@
   visitShiftRight(HShiftRight node) => visitBitInvokeBinary(node, '>>>');
 
   visitTruncatingDivide(HTruncatingDivide node) {
-    assert(node.isUInt31(_closedWorld));
+    assert(node.isUInt31(_abstractValueDomain));
     // TODO(karlklose): Enable this assertion again when type propagation is
     // fixed. Issue 23555.
 //    assert(node.left.isUInt32(compiler));
-    assert(node.right.isPositiveInteger(_closedWorld));
+    assert(node.right.isPositiveInteger(_abstractValueDomain));
     use(node.left);
     js.Expression jsLeft = pop();
     use(node.right);
@@ -1806,7 +1811,7 @@
       // invoke dynamic knows more than the receiver.
       ClassEntity enclosing = node.element.enclosingClass;
       if (_closedWorld.isInstantiated(enclosing)) {
-        return _closedWorld.commonMasks.createNonNullExact(enclosing);
+        return _closedWorld.abstractValueDomain.createNonNullExact(enclosing);
       } else {
         // The element is mixed in so a non-null subtype mask is the most
         // precise we have.
@@ -1816,7 +1821,7 @@
                 node,
                 "Element ${node.element} from $enclosing expected "
                 "to be mixed in."));
-        return _closedWorld.commonMasks.createNonNullSubtype(enclosing);
+        return _closedWorld.abstractValueDomain.createNonNullSubtype(enclosing);
       }
     }
     // If [JSInvocationMirror._invokeOn] is enabled, and this call
@@ -2207,14 +2212,15 @@
 
       HInstruction left = relational.left;
       HInstruction right = relational.right;
-      if (left.isStringOrNull(_closedWorld) &&
-          right.isStringOrNull(_closedWorld)) {
+      if (left.isStringOrNull(_abstractValueDomain) &&
+          right.isStringOrNull(_abstractValueDomain)) {
         return true;
       }
 
       // This optimization doesn't work for NaN, so we only do it if the
       // type is known to be an integer.
-      return left.isInteger(_closedWorld) && right.isInteger(_closedWorld);
+      return left.isInteger(_abstractValueDomain) &&
+          right.isInteger(_abstractValueDomain);
     }
 
     bool handledBySpecialCase = false;
@@ -2350,13 +2356,13 @@
       js.Expression over;
       if (node.staticChecks != HBoundsCheck.ALWAYS_ABOVE_ZERO) {
         use(node.index);
-        if (node.index.isInteger(_closedWorld)) {
+        if (node.index.isInteger(_abstractValueDomain)) {
           under = js.js("# < 0", pop());
         } else {
           js.Expression jsIndex = pop();
           under = js.js("# >>> 0 !== #", [jsIndex, jsIndex]);
         }
-      } else if (!node.index.isInteger(_closedWorld)) {
+      } else if (!node.index.isInteger(_abstractValueDomain)) {
         checkInt(node.index, '!==');
         under = pop();
       }
@@ -2486,9 +2492,10 @@
 
   void visitStringify(HStringify node) {
     HInstruction input = node.inputs.first;
-    if (input.isString(_closedWorld)) {
+    if (input.isString(_abstractValueDomain)) {
       use(input);
-    } else if (input.isInteger(_closedWorld) || input.isBoolean(_closedWorld)) {
+    } else if (input.isInteger(_abstractValueDomain) ||
+        input.isBoolean(_abstractValueDomain)) {
       // JavaScript's + operator with a string for the left operand will convert
       // the right operand to a string, and the conversion result is correct.
       use(input);
@@ -2879,9 +2886,9 @@
       } else if (type.isFunctionType) {
         checkType(input, interceptor, type, sourceInformation,
             negative: negative);
-      } else if ((input.canBePrimitive(_closedWorld) &&
-              !input.canBePrimitiveArray(_closedWorld)) ||
-          input.canBeNull()) {
+      } else if ((input.canBePrimitive(_abstractValueDomain) &&
+              !input.canBePrimitiveArray(_abstractValueDomain)) ||
+          input.canBeNull(_abstractValueDomain)) {
         checkObject(input, relation, node.sourceInformation);
         js.Expression objectTest = pop();
         checkType(input, interceptor, type, sourceInformation,
diff --git a/pkg/compiler/lib/src/ssa/codegen_helpers.dart b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
index 85be9f0..d7194b8 100644
--- a/pkg/compiler/lib/src/ssa/codegen_helpers.dart
+++ b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
@@ -7,6 +7,7 @@
 import '../js_backend/js_backend.dart';
 import '../js_backend/interceptor_data.dart';
 import '../options.dart';
+import '../types/abstract_value_domain.dart';
 import '../types/types.dart';
 import '../universe/selector.dart' show Selector;
 import '../world.dart' show ClosedWorld;
@@ -23,6 +24,9 @@
 
   SsaInstructionSelection(this._closedWorld, this._interceptorData);
 
+  AbstractValueDomain get _abstractValueDomain =>
+      _closedWorld.abstractValueDomain;
+
   void visitGraph(HGraph graph) {
     this.graph = graph;
     visitDominatorTree(graph);
@@ -68,7 +72,7 @@
       HInstruction interceptor = node.interceptor;
       if (interceptor != null) {
         return new HIsViaInterceptor(node.typeExpression, interceptor,
-            _closedWorld.commonMasks.boolType);
+            _closedWorld.abstractValueDomain.boolType);
       }
     }
     return node;
@@ -87,7 +91,7 @@
     if (leftType.isNullable && rightType.isNullable) {
       if (left.isConstantNull() ||
           right.isConstantNull() ||
-          (left.isPrimitive(_closedWorld) && leftType == rightType)) {
+          (left.isPrimitive(_abstractValueDomain) && leftType == rightType)) {
         return '==';
       }
       return null;
@@ -244,7 +248,7 @@
     HInstruction bitop(String assignOp) {
       // HBitAnd, HBitOr etc. are more difficult because HBitAnd(a.x, y)
       // sometimes needs to be forced to unsigned: a.x = (a.x & y) >>> 0.
-      if (op.isUInt31(_closedWorld)) return simpleBinary(assignOp);
+      if (op.isUInt31(_abstractValueDomain)) return simpleBinary(assignOp);
       return noMatchingRead();
     }
 
@@ -335,6 +339,7 @@
  *   t2 = add(4, 3);
  */
 class SsaInstructionMerger extends HBaseVisitor {
+  final AbstractValueDomain _abstractValueDomain;
   final SuperMemberData _superMemberData;
   /**
    * List of [HInstruction] that the instruction merger expects in
@@ -354,7 +359,8 @@
     generateAtUseSite.add(instruction);
   }
 
-  SsaInstructionMerger(this.generateAtUseSite, this._superMemberData);
+  SsaInstructionMerger(
+      this._abstractValueDomain, this.generateAtUseSite, this._superMemberData);
 
   void visitGraph(HGraph graph) {
     visitDominatorTree(graph);
@@ -404,7 +410,7 @@
   // construction always precede a use.
   bool isEffectivelyPure(HInstruction instruction) {
     if (instruction is HLocalGet) return !isAssignedLocal(instruction.local);
-    return instruction.isPure();
+    return instruction.isPure(_abstractValueDomain);
   }
 
   bool isAssignedLocal(HLocalValue local) {
diff --git a/pkg/compiler/lib/src/ssa/graph_builder.dart b/pkg/compiler/lib/src/ssa/graph_builder.dart
index 9abf34d..4215366 100644
--- a/pkg/compiler/lib/src/ssa/graph_builder.dart
+++ b/pkg/compiler/lib/src/ssa/graph_builder.dart
@@ -25,6 +25,7 @@
 import '../js_emitter/code_emitter_task.dart';
 import '../options.dart';
 import '../resolution/tree_elements.dart';
+import '../types/abstract_value_domain.dart';
 import '../types/types.dart';
 import '../world.dart' show ClosedWorld;
 import 'jump_handler.dart';
@@ -59,7 +60,10 @@
 
   ClosedWorld get closedWorld;
 
-  CommonMasks get commonMasks => closedWorld.commonMasks;
+  AbstractValueDomain get abstractValueDomain =>
+      closedWorld.abstractValueDomain;
+
+  CommonMasks get commonMasks => closedWorld.abstractValueDomain;
 
   DiagnosticReporter get reporter => backend.reporter;
 
@@ -135,7 +139,7 @@
   /// Pushes a boolean checking [expression] against null.
   pushCheckNull(HInstruction expression) {
     push(new HIdentity(expression, graph.addConstantNull(closedWorld), null,
-        closedWorld.commonMasks.boolType));
+        closedWorld.abstractValueDomain.boolType));
   }
 
   void dup() {
@@ -198,7 +202,7 @@
   }
 
   void goto(HBasicBlock from, HBasicBlock to) {
-    from.close(new HGoto());
+    from.close(new HGoto(abstractValueDomain));
     from.addSuccessor(to);
   }
 
@@ -246,7 +250,7 @@
   MemberEntity get sourceElement;
 
   HLiteralList buildLiteralList(List<HInstruction> inputs) {
-    return new HLiteralList(inputs, commonMasks.extendableArrayType);
+    return new HLiteralList(inputs, commonMasks.growableListType);
   }
 
   HInstruction callSetRuntimeTypeInfoWithTypeArguments(
@@ -262,7 +266,7 @@
         TypeInfoExpressionKind.INSTANCE,
         closedWorld.elementEnvironment.getThisType(type.element),
         rtiInputs,
-        closedWorld.commonMasks.dynamicType);
+        closedWorld.abstractValueDomain.dynamicType);
     add(typeInfo);
     return callSetRuntimeTypeInfo(typeInfo, newObject, sourceInformation);
   }
@@ -271,7 +275,7 @@
   /// specify special successors if we are already in a try/catch/finally block.
   void handleInTryStatement() {
     if (!inTryStatement) return;
-    HBasicBlock block = close(new HExitTry());
+    HBasicBlock block = close(new HExitTry(abstractValueDomain));
     HBasicBlock newBlock = graph.addNewBlock();
     block.addSuccessor(newBlock);
     open(newBlock);
diff --git a/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart b/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
index cb2948a..11b98a0 100644
--- a/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
+++ b/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
@@ -7,6 +7,7 @@
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../js_backend/interceptor_data.dart';
+import '../types/abstract_value_domain.dart';
 import '../types/types.dart';
 import '../universe/selector.dart' show Selector;
 import '../world.dart' show ClosedWorld;
@@ -48,6 +49,9 @@
 
   InterceptorData get interceptorData => closedWorld.interceptorData;
 
+  AbstractValueDomain get _abstractValueDomain =>
+      closedWorld.abstractValueDomain;
+
   void visitGraph(HGraph graph) {
     this.graph = graph;
     visitDominatorTree(graph);
@@ -94,11 +98,11 @@
 
   bool canUseSelfForInterceptor(
       HInstruction receiver, Set<ClassEntity> interceptedClasses) {
-    if (receiver.canBePrimitive(closedWorld)) {
+    if (receiver.canBePrimitive(_abstractValueDomain)) {
       // Primitives always need interceptors.
       return false;
     }
-    if (receiver.canBeNull() &&
+    if (receiver.canBeNull(_abstractValueDomain) &&
         interceptedClasses.contains(_commonElements.jsNullClass)) {
       // Need the JSNull interceptor.
       return false;
@@ -312,14 +316,15 @@
     // `NoSuchMethodError`s, and if the receiver was not null we would have a
     // constant interceptor `C`.  Then we can use `(receiver && C)` for the
     // interceptor.
-    if (receiver.canBeNull()) {
+    if (receiver.canBeNull(_abstractValueDomain)) {
       if (!interceptedClasses.contains(_commonElements.jsNullClass)) {
         // Can use `(receiver && C)` only if receiver is either null or truthy.
-        if (!(receiver.canBePrimitiveNumber(closedWorld) ||
-            receiver.canBePrimitiveBoolean(closedWorld) ||
-            receiver.canBePrimitiveString(closedWorld))) {
+        if (!(receiver.canBePrimitiveNumber(_abstractValueDomain) ||
+            receiver.canBePrimitiveBoolean(_abstractValueDomain) ||
+            receiver.canBePrimitiveString(_abstractValueDomain))) {
           ClassEntity interceptorClass = tryComputeConstantInterceptorFromType(
-              receiver.instructionType.nonNullable(), interceptedClasses);
+              _abstractValueDomain.excludeNull(receiver.instructionType),
+              interceptedClasses);
           if (interceptorClass != null) {
             HInstruction constantInstruction = graph.addConstant(
                 new InterceptorConstantValue(interceptorClass), closedWorld);
@@ -365,6 +370,7 @@
         List<HInstruction> inputs = new List<HInstruction>.from(user.inputs);
         inputs[0] = nullConstant;
         HOneShotInterceptor oneShotInterceptor = new HOneShotInterceptor(
+            closedWorld.abstractValueDomain,
             user.selector,
             user.mask,
             inputs,
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index f02b6c6..0ca17d5 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -124,8 +124,10 @@
       ClosedWorld closedWorld) {
     HInstruction receiver = instruction.inputs[1];
     HInstruction index = instruction.inputs[2];
-    if (!receiver.isMutableIndexable(closedWorld)) return null;
-    if (!index.isInteger(closedWorld) && options.enableTypeAssertions) {
+    if (!receiver.isMutableIndexable(closedWorld.abstractValueDomain))
+      return null;
+    if (!index.isInteger(closedWorld.abstractValueDomain) &&
+        options.enableTypeAssertions) {
       // We want the right checked mode error.
       return null;
     }
@@ -137,7 +139,8 @@
         return null;
       }
     }
-    return new HIndexAssign(receiver, index, value, instruction.selector);
+    return new HIndexAssign(closedWorld.abstractValueDomain, receiver, index,
+        value, instruction.selector);
   }
 
   /// Returns [true] if [value] meets the requirements for being stored into
@@ -153,9 +156,9 @@
     if (instruction.element != null) {
       ClassEntity cls = instruction.element.enclosingClass;
       if (cls == commonElements.typedArrayOfIntClass) {
-        return value.isInteger(closedWorld);
+        return value.isInteger(closedWorld.abstractValueDomain);
       } else if (cls == commonElements.typedArrayOfDoubleClass) {
-        return value.isNumber(closedWorld);
+        return value.isNumber(closedWorld.abstractValueDomain);
       }
     }
 
@@ -181,8 +184,9 @@
       CompilerOptions options,
       CommonElements commonElements,
       ClosedWorld closedWorld) {
-    if (!instruction.inputs[1].isIndexablePrimitive(closedWorld)) return null;
-    if (!instruction.inputs[2].isInteger(closedWorld) &&
+    if (!instruction.inputs[1]
+        .isIndexablePrimitive(closedWorld.abstractValueDomain)) return null;
+    if (!instruction.inputs[2].isInteger(closedWorld.abstractValueDomain) &&
         options.enableTypeAssertions) {
       // We want the right checked mode error.
       return null;
@@ -210,8 +214,9 @@
       ClosedWorld closedWorld) {
     // All bitwise operations on primitive types either produce an
     // integer or throw an error.
-    if (instruction.inputs[1].isPrimitiveOrNull(closedWorld)) {
-      return closedWorld.commonMasks.uint32Type;
+    if (instruction.inputs[1]
+        .isPrimitiveOrNull(closedWorld.abstractValueDomain)) {
+      return closedWorld.abstractValueDomain.uint32Type;
     }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
@@ -225,7 +230,7 @@
       CommonElements commonElements,
       ClosedWorld closedWorld) {
     HInstruction input = instruction.inputs[1];
-    if (input.isNumber(closedWorld)) {
+    if (input.isNumber(closedWorld.abstractValueDomain)) {
       return new HBitNot(
           input,
           instruction.selector,
@@ -249,16 +254,16 @@
       CompilerOptions options,
       ClosedWorld closedWorld) {
     HInstruction operand = instruction.inputs[1];
-    if (operand.isNumberOrNull(closedWorld)) {
+    if (operand.isNumberOrNull(closedWorld.abstractValueDomain)) {
       // We have integer subclasses that represent ranges, so widen any int
       // subclass to full integer.
-      if (operand.isIntegerOrNull(closedWorld)) {
-        return closedWorld.commonMasks.intType;
+      if (operand.isIntegerOrNull(closedWorld.abstractValueDomain)) {
+        return closedWorld.abstractValueDomain.intType;
       }
-      if (operand.isDoubleOrNull(closedWorld)) {
-        return closedWorld.commonMasks.doubleType;
+      if (operand.isDoubleOrNull(closedWorld.abstractValueDomain)) {
+        return closedWorld.abstractValueDomain.doubleType;
       }
-      return closedWorld.commonMasks.numType;
+      return closedWorld.abstractValueDomain.numType;
     }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
@@ -272,7 +277,7 @@
       CommonElements commonElements,
       ClosedWorld closedWorld) {
     HInstruction input = instruction.inputs[1];
-    if (input.isNumber(closedWorld)) {
+    if (input.isNumber(closedWorld.abstractValueDomain)) {
       return new HNegate(
           input,
           instruction.selector,
@@ -296,8 +301,8 @@
       CompilerOptions options,
       ClosedWorld closedWorld) {
     HInstruction input = instruction.inputs[1];
-    if (input.isNumberOrNull(closedWorld)) {
-      return input.instructionType.nonNullable();
+    if (input.isNumberOrNull(closedWorld.abstractValueDomain)) {
+      return closedWorld.abstractValueDomain.excludeNull(input.instructionType);
     }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
@@ -311,7 +316,7 @@
       CommonElements commonElements,
       ClosedWorld closedWorld) {
     HInstruction input = instruction.inputs[1];
-    if (input.isNumber(closedWorld)) {
+    if (input.isNumber(closedWorld.abstractValueDomain)) {
       return new HAbs(
           input,
           instruction.selector,
@@ -332,24 +337,24 @@
       ClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    if (left.isIntegerOrNull(closedWorld) &&
-        right.isIntegerOrNull(closedWorld)) {
-      return closedWorld.commonMasks.intType;
+    if (left.isIntegerOrNull(closedWorld.abstractValueDomain) &&
+        right.isIntegerOrNull(closedWorld.abstractValueDomain)) {
+      return closedWorld.abstractValueDomain.intType;
     }
-    if (left.isNumberOrNull(closedWorld)) {
-      if (left.isDoubleOrNull(closedWorld) ||
-          right.isDoubleOrNull(closedWorld)) {
-        return closedWorld.commonMasks.doubleType;
+    if (left.isNumberOrNull(closedWorld.abstractValueDomain)) {
+      if (left.isDoubleOrNull(closedWorld.abstractValueDomain) ||
+          right.isDoubleOrNull(closedWorld.abstractValueDomain)) {
+        return closedWorld.abstractValueDomain.doubleType;
       }
-      return closedWorld.commonMasks.numType;
+      return closedWorld.abstractValueDomain.numType;
     }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
   }
 
   bool isBuiltin(HInvokeDynamic instruction, ClosedWorld closedWorld) {
-    return instruction.inputs[1].isNumber(closedWorld) &&
-        instruction.inputs[2].isNumber(closedWorld);
+    return instruction.inputs[1].isNumber(closedWorld.abstractValueDomain) &&
+        instruction.inputs[2].isNumber(closedWorld.abstractValueDomain);
   }
 
   HInstruction tryConvertToBuiltin(
@@ -375,14 +380,15 @@
       HInstruction instruction, ClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    return left.isPositiveIntegerOrNull(closedWorld) &&
-        right.isPositiveIntegerOrNull(closedWorld);
+    return left.isPositiveIntegerOrNull(closedWorld.abstractValueDomain) &&
+        right.isPositiveIntegerOrNull(closedWorld.abstractValueDomain);
   }
 
   bool inputsAreUInt31(HInstruction instruction, ClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    return left.isUInt31(closedWorld) && right.isUInt31(closedWorld);
+    return left.isUInt31(closedWorld.abstractValueDomain) &&
+        right.isUInt31(closedWorld.abstractValueDomain);
   }
 
   HInstruction newBuiltinVariant(
@@ -401,10 +407,10 @@
       CompilerOptions options,
       ClosedWorld closedWorld) {
     if (inputsAreUInt31(instruction, closedWorld)) {
-      return closedWorld.commonMasks.uint32Type;
+      return closedWorld.abstractValueDomain.uint32Type;
     }
     if (inputsArePositiveIntegers(instruction, closedWorld)) {
-      return closedWorld.commonMasks.positiveIntType;
+      return closedWorld.abstractValueDomain.positiveIntType;
     }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
@@ -440,8 +446,8 @@
       CompilerOptions options,
       ClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
-    if (left.isNumberOrNull(closedWorld)) {
-      return closedWorld.commonMasks.doubleType;
+    if (left.isNumberOrNull(closedWorld.abstractValueDomain)) {
+      return closedWorld.abstractValueDomain.doubleType;
     }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
@@ -453,7 +459,7 @@
       CompilerOptions options,
       ClosedWorld closedWorld) {
     return new HDivide(instruction.inputs[1], instruction.inputs[2],
-        instruction.selector, closedWorld.commonMasks.doubleType);
+        instruction.selector, closedWorld.abstractValueDomain.doubleType);
   }
 }
 
@@ -466,7 +472,7 @@
       CompilerOptions options,
       ClosedWorld closedWorld) {
     if (inputsArePositiveIntegers(instruction, closedWorld)) {
-      return closedWorld.commonMasks.positiveIntType;
+      return closedWorld.abstractValueDomain.positiveIntType;
     }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
@@ -552,7 +558,7 @@
       CompilerOptions options,
       ClosedWorld closedWorld) {
     if (inputsArePositiveIntegers(instruction, closedWorld)) {
-      return closedWorld.commonMasks.positiveIntType;
+      return closedWorld.abstractValueDomain.positiveIntType;
     }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
@@ -588,7 +594,7 @@
       CompilerOptions options,
       ClosedWorld closedWorld) {
     if (inputsArePositiveIntegers(instruction, closedWorld)) {
-      return closedWorld.commonMasks.positiveIntType;
+      return closedWorld.abstractValueDomain.positiveIntType;
     }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
@@ -640,10 +646,10 @@
       CompilerOptions options,
       ClosedWorld closedWorld) {
     if (hasUint31Result(instruction, closedWorld)) {
-      return closedWorld.commonMasks.uint31Type;
+      return closedWorld.abstractValueDomain.uint31Type;
     }
     if (inputsArePositiveIntegers(instruction, closedWorld)) {
-      return closedWorld.commonMasks.positiveIntType;
+      return closedWorld.abstractValueDomain.positiveIntType;
     }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
@@ -668,11 +674,12 @@
   bool hasUint31Result(HInstruction instruction, ClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    if (right.isPositiveInteger(closedWorld)) {
-      if (left.isUInt31(closedWorld) && isNotZero(right)) {
+    if (right.isPositiveInteger(closedWorld.abstractValueDomain)) {
+      if (left.isUInt31(closedWorld.abstractValueDomain) && isNotZero(right)) {
         return true;
       }
-      if (left.isUInt32(closedWorld) && isTwoOrGreater(right)) {
+      if (left.isUInt32(closedWorld.abstractValueDomain) &&
+          isTwoOrGreater(right)) {
         return true;
       }
     }
@@ -688,7 +695,8 @@
       ClosedWorld closedWorld) {
     HInstruction right = instruction.inputs[2];
     if (isBuiltin(instruction, closedWorld)) {
-      if (right.isPositiveInteger(closedWorld) && isNotZero(right)) {
+      if (right.isPositiveInteger(closedWorld.abstractValueDomain) &&
+          isNotZero(right)) {
         if (hasUint31Result(instruction, closedWorld)) {
           return newBuiltinVariant(instruction, results, options, closedWorld);
         }
@@ -726,8 +734,8 @@
     // All bitwise operations on primitive types either produce an
     // integer or throw an error.
     HInstruction left = instruction.inputs[1];
-    if (left.isPrimitiveOrNull(closedWorld)) {
-      return closedWorld.commonMasks.uint32Type;
+    if (left.isPrimitiveOrNull(closedWorld.abstractValueDomain)) {
+      return closedWorld.abstractValueDomain.uint32Type;
     }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
@@ -756,7 +764,7 @@
   bool isPositive(HInstruction instruction, ClosedWorld closedWorld) {
     // TODO: We should use the value range analysis. Currently, ranges
     // are discarded just after the analysis.
-    return instruction.isPositiveInteger(closedWorld);
+    return instruction.isPositiveInteger(closedWorld.abstractValueDomain);
   }
 }
 
@@ -776,7 +784,7 @@
       ClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    if (left.isNumber(closedWorld)) {
+    if (left.isNumber(closedWorld.abstractValueDomain)) {
       if (argumentLessThan32(right)) {
         return newBuiltinVariant(instruction, results, options, closedWorld);
       }
@@ -814,7 +822,8 @@
       CompilerOptions options,
       ClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
-    if (left.isUInt32(closedWorld)) return left.instructionType;
+    if (left.isUInt32(closedWorld.abstractValueDomain))
+      return left.instructionType;
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
   }
@@ -828,7 +837,7 @@
       ClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    if (left.isNumber(closedWorld)) {
+    if (left.isNumber(closedWorld.abstractValueDomain)) {
       if (argumentLessThan32(right) && isPositive(left, closedWorld)) {
         return newBuiltinVariant(instruction, results, options, closedWorld);
       }
@@ -839,7 +848,8 @@
       if (isPositive(right, closedWorld) && isPositive(left, closedWorld)) {
         instruction.selector = renameToOptimizedSelector(
             '_shrBothPositive', instruction.selector, commonElements);
-      } else if (isPositive(left, closedWorld) && right.isNumber(closedWorld)) {
+      } else if (isPositive(left, closedWorld) &&
+          right.isNumber(closedWorld.abstractValueDomain)) {
         instruction.selector = renameToOptimizedSelector(
             '_shrReceiverPositive', instruction.selector, commonElements);
       } else if (isPositive(right, closedWorld)) {
@@ -881,8 +891,9 @@
       ClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    if (left.isUInt31(closedWorld) && right.isUInt31(closedWorld)) {
-      return closedWorld.commonMasks.uint31Type;
+    if (left.isUInt31(closedWorld.abstractValueDomain) &&
+        right.isUInt31(closedWorld.abstractValueDomain)) {
+      return closedWorld.abstractValueDomain.uint31Type;
     }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
@@ -915,9 +926,10 @@
       ClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    if (left.isPrimitiveOrNull(closedWorld) &&
-        (left.isUInt31(closedWorld) || right.isUInt31(closedWorld))) {
-      return closedWorld.commonMasks.uint31Type;
+    if (left.isPrimitiveOrNull(closedWorld.abstractValueDomain) &&
+        (left.isUInt31(closedWorld.abstractValueDomain) ||
+            right.isUInt31(closedWorld.abstractValueDomain))) {
+      return closedWorld.abstractValueDomain.uint31Type;
     }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
@@ -950,8 +962,9 @@
       ClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    if (left.isUInt31(closedWorld) && right.isUInt31(closedWorld)) {
-      return closedWorld.commonMasks.uint31Type;
+    if (left.isUInt31(closedWorld.abstractValueDomain) &&
+        right.isUInt31(closedWorld.abstractValueDomain)) {
+      return closedWorld.abstractValueDomain.uint31Type;
     }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
@@ -978,8 +991,9 @@
       GlobalTypeInferenceResults results,
       CompilerOptions options,
       ClosedWorld closedWorld) {
-    if (instruction.inputs[1].isPrimitiveOrNull(closedWorld)) {
-      return closedWorld.commonMasks.boolType;
+    if (instruction.inputs[1]
+        .isPrimitiveOrNull(closedWorld.abstractValueDomain)) {
+      return closedWorld.abstractValueDomain.boolType;
     }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
@@ -994,7 +1008,8 @@
       ClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    if (left.isNumber(closedWorld) && right.isNumber(closedWorld)) {
+    if (left.isNumber(closedWorld.abstractValueDomain) &&
+        right.isNumber(closedWorld.abstractValueDomain)) {
       return newBuiltinVariant(instruction, closedWorld);
     }
     return null;
@@ -1017,7 +1032,8 @@
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
     TypeMask instructionType = left.instructionType;
-    if (right.isConstantNull() || left.isPrimitiveOrNull(closedWorld)) {
+    if (right.isConstantNull() ||
+        left.isPrimitiveOrNull(closedWorld.abstractValueDomain)) {
       return newBuiltinVariant(instruction, closedWorld);
     }
     if (closedWorld.includesClosureCall(
@@ -1043,7 +1059,7 @@
   HInstruction newBuiltinVariant(
       HInvokeDynamic instruction, ClosedWorld closedWorld) {
     return new HIdentity(instruction.inputs[1], instruction.inputs[2],
-        instruction.selector, closedWorld.commonMasks.boolType);
+        instruction.selector, closedWorld.abstractValueDomain.boolType);
   }
 }
 
@@ -1057,7 +1073,7 @@
   HInstruction newBuiltinVariant(
       HInvokeDynamic instruction, ClosedWorld closedWorld) {
     return new HLess(instruction.inputs[1], instruction.inputs[2],
-        instruction.selector, closedWorld.commonMasks.boolType);
+        instruction.selector, closedWorld.abstractValueDomain.boolType);
   }
 }
 
@@ -1071,7 +1087,7 @@
   HInstruction newBuiltinVariant(
       HInvokeDynamic instruction, ClosedWorld closedWorld) {
     return new HGreater(instruction.inputs[1], instruction.inputs[2],
-        instruction.selector, closedWorld.commonMasks.boolType);
+        instruction.selector, closedWorld.abstractValueDomain.boolType);
   }
 }
 
@@ -1085,7 +1101,7 @@
   HInstruction newBuiltinVariant(
       HInvokeDynamic instruction, ClosedWorld closedWorld) {
     return new HGreaterEqual(instruction.inputs[1], instruction.inputs[2],
-        instruction.selector, closedWorld.commonMasks.boolType);
+        instruction.selector, closedWorld.abstractValueDomain.boolType);
   }
 }
 
@@ -1099,7 +1115,7 @@
   HInstruction newBuiltinVariant(
       HInvokeDynamic instruction, ClosedWorld closedWorld) {
     return new HLessEqual(instruction.inputs[1], instruction.inputs[2],
-        instruction.selector, closedWorld.commonMasks.boolType);
+        instruction.selector, closedWorld.abstractValueDomain.boolType);
   }
 }
 
@@ -1120,12 +1136,13 @@
     // TODO(sra): Implement a builtin HCodeUnitAt instruction and the same index
     // bounds checking optimizations as for HIndex.
     HInstruction receiver = instruction.getDartReceiver(closedWorld);
-    if (receiver.isStringOrNull(closedWorld)) {
+    if (receiver.isStringOrNull(closedWorld.abstractValueDomain)) {
       // Even if there is no builtin equivalent instruction, we know
       // String.codeUnitAt does not have any side effect (other than throwing),
       // and that it can be GVN'ed.
       clearAllSideEffects(instruction);
-      if (instruction.inputs.last.isPositiveInteger(closedWorld)) {
+      if (instruction.inputs.last
+          .isPositiveInteger(closedWorld.abstractValueDomain)) {
         instruction.selector = renameToOptimizedSelector(
             '_codeUnitAt', instruction.selector, commonElements);
       }
@@ -1147,13 +1164,15 @@
     HInstruction receiver = instruction.getDartReceiver(closedWorld);
     // `compareTo` has no side-effect (other than throwing) and can be GVN'ed
     // for some known types.
-    if (receiver.isStringOrNull(closedWorld) ||
-        receiver.isNumberOrNull(closedWorld)) {
+    if (receiver.isStringOrNull(closedWorld.abstractValueDomain) ||
+        receiver.isNumberOrNull(closedWorld.abstractValueDomain)) {
       // Replace `a.compareTo(a)` with `0`, but only if receiver and argument
       // are such that no exceptions can be thrown.
       HInstruction argument = instruction.inputs.last;
-      if ((receiver.isNumber(closedWorld) && argument.isNumber(closedWorld)) ||
-          (receiver.isString(closedWorld) && argument.isString(closedWorld))) {
+      if ((receiver.isNumber(closedWorld.abstractValueDomain) &&
+              argument.isNumber(closedWorld.abstractValueDomain)) ||
+          (receiver.isString(closedWorld.abstractValueDomain) &&
+              argument.isString(closedWorld.abstractValueDomain))) {
         if (identical(receiver.nonCheck(), argument.nonCheck())) {
           return graph.addConstantInt(0, closedWorld);
         }
@@ -1175,7 +1194,7 @@
       CommonElements commonElements,
       ClosedWorld closedWorld) {
     HInstruction receiver = instruction.getDartReceiver(closedWorld);
-    if (receiver.isStringOrNull(closedWorld)) {
+    if (receiver.isStringOrNull(closedWorld.abstractValueDomain)) {
       // String.xxx does not have any side effect (other than throwing), and it
       // can be GVN'ed.
       clearAllSideEffects(instruction);
@@ -1204,8 +1223,8 @@
       ClosedWorld closedWorld) {
     HInstruction receiver = instruction.getDartReceiver(closedWorld);
     HInstruction pattern = instruction.inputs[2];
-    if (receiver.isStringOrNull(closedWorld) &&
-        pattern.isStringOrNull(closedWorld)) {
+    if (receiver.isStringOrNull(closedWorld.abstractValueDomain) &&
+        pattern.isStringOrNull(closedWorld.abstractValueDomain)) {
       // String.contains(String s) does not have any side effect (other than
       // throwing), and it can be GVN'ed.
       clearAllSideEffects(instruction);
@@ -1229,7 +1248,7 @@
       CommonElements commonElements,
       ClosedWorld closedWorld) {
     HInstruction receiver = instruction.getDartReceiver(closedWorld);
-    if (receiver.isNumberOrNull(closedWorld)) {
+    if (receiver.isNumberOrNull(closedWorld.abstractValueDomain)) {
       // Even if there is no builtin equivalent instruction, we know the
       // instruction does not have any side effect, and that it can be GVN'ed.
       clearAllSideEffects(instruction);
diff --git a/pkg/compiler/lib/src/ssa/jump_handler.dart b/pkg/compiler/lib/src/ssa/jump_handler.dart
index d8dc2ee..3687961 100644
--- a/pkg/compiler/lib/src/ssa/jump_handler.dart
+++ b/pkg/compiler/lib/src/ssa/jump_handler.dart
@@ -88,9 +88,11 @@
       [LabelDefinition label]) {
     HInstruction breakInstruction;
     if (label == null) {
-      breakInstruction = new HBreak(target, sourceInformation);
+      breakInstruction =
+          new HBreak(builder.abstractValueDomain, target, sourceInformation);
     } else {
-      breakInstruction = new HBreak.toLabel(label, sourceInformation);
+      breakInstruction = new HBreak.toLabel(
+          builder.abstractValueDomain, label, sourceInformation);
     }
     LocalsHandler locals = new LocalsHandler.from(builder.localsHandler);
     builder.close(breakInstruction);
@@ -101,9 +103,11 @@
       [LabelDefinition label]) {
     HInstruction continueInstruction;
     if (label == null) {
-      continueInstruction = new HContinue(target, sourceInformation);
+      continueInstruction =
+          new HContinue(builder.abstractValueDomain, target, sourceInformation);
     } else {
-      continueInstruction = new HContinue.toLabel(label, sourceInformation);
+      continueInstruction = new HContinue.toLabel(
+          builder.abstractValueDomain, label, sourceInformation);
       // Switch case continue statements must be handled by the
       // [SwitchCaseJumpHandler].
       assert(!label.target.isSwitchCase);
@@ -171,8 +175,9 @@
       // for a switch statement with continue statements. See
       // [SsaFromAstMixin.buildComplexSwitchStatement] for detail.
 
-      HInstruction breakInstruction =
-          new HBreak(target, sourceInformation, breakSwitchContinueLoop: true);
+      HInstruction breakInstruction = new HBreak(
+          builder.abstractValueDomain, target, sourceInformation,
+          breakSwitchContinueLoop: true);
       LocalsHandler locals = new LocalsHandler.from(builder.localsHandler);
       builder.close(breakInstruction);
       jumps.add(new _JumpHandlerEntry(breakInstruction, locals));
@@ -199,7 +204,7 @@
 
       assert(label.target.labels.contains(label));
       HInstruction continueInstruction =
-          new HContinue(target, sourceInformation);
+          new HContinue(builder.abstractValueDomain, target, sourceInformation);
       LocalsHandler locals = new LocalsHandler.from(builder.localsHandler);
       builder.close(continueInstruction);
       jumps.add(new _JumpHandlerEntry(continueInstruction, locals));
diff --git a/pkg/compiler/lib/src/ssa/kernel_string_builder.dart b/pkg/compiler/lib/src/ssa/kernel_string_builder.dart
index 090d77b..92e4b4d 100644
--- a/pkg/compiler/lib/src/ssa/kernel_string_builder.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_string_builder.dart
@@ -33,7 +33,7 @@
     //      conversions.
     //   2. The value can be primitive, because the library stringifier has
     //      fast-path code for most primitives.
-    if (expression.canBePrimitive(builder.closedWorld)) {
+    if (expression.canBePrimitive(builder.abstractValueDomain)) {
       append(stringify(expression));
       return;
     }
diff --git a/pkg/compiler/lib/src/ssa/locals_handler.dart b/pkg/compiler/lib/src/ssa/locals_handler.dart
index 6626095..2f3973b 100644
--- a/pkg/compiler/lib/src/ssa/locals_handler.dart
+++ b/pkg/compiler/lib/src/ssa/locals_handler.dart
@@ -68,7 +68,7 @@
 
   ClosedWorld get closedWorld => builder.closedWorld;
 
-  CommonMasks get commonMasks => closedWorld.commonMasks;
+  CommonMasks get commonMasks => closedWorld.abstractValueDomain;
 
   GlobalTypeInferenceResults get _globalInferenceResults =>
       builder.globalInferenceResults;
@@ -443,13 +443,15 @@
       // Inside the closure the box is stored in a closure-field and cannot
       // be accessed directly.
       HInstruction box = readLocal(localBox);
-      builder.add(new HFieldSet(redirect, box, value)
-        ..sourceInformation = sourceInformation);
+      builder.add(
+          new HFieldSet(builder.abstractValueDomain, redirect, box, value)
+            ..sourceInformation = sourceInformation);
     } else {
       assert(_isUsedInTryOrGenerator(local));
       HLocalValue localValue = getLocal(local);
-      builder.add(new HLocalSet(local, localValue, value)
-        ..sourceInformation = sourceInformation);
+      builder.add(
+          new HLocalSet(builder.abstractValueDomain, local, localValue, value)
+            ..sourceInformation = sourceInformation);
     }
   }
 
diff --git a/pkg/compiler/lib/src/ssa/loop_handler.dart b/pkg/compiler/lib/src/ssa/loop_handler.dart
index 4bace0e..89ea833 100644
--- a/pkg/compiler/lib/src/ssa/loop_handler.dart
+++ b/pkg/compiler/lib/src/ssa/loop_handler.dart
@@ -65,8 +65,8 @@
     if (startBlock == null) startBlock = conditionBlock;
 
     HInstruction conditionInstruction = condition();
-    HBasicBlock conditionEndBlock =
-        builder.close(new HLoopBranch(conditionInstruction));
+    HBasicBlock conditionEndBlock = builder.close(
+        new HLoopBranch(builder.abstractValueDomain, conditionInstruction));
     SubExpression conditionExpression =
         new SubExpression(conditionBlock, conditionEndBlock);
 
@@ -85,7 +85,8 @@
 
     SubGraph bodyGraph = new SubGraph(beginBodyBlock, builder.lastOpenedBlock);
     HBasicBlock bodyBlock = builder.current;
-    if (builder.current != null) builder.close(new HGoto());
+    if (builder.current != null)
+      builder.close(new HGoto(builder.abstractValueDomain));
 
     SubExpression updateGraph;
 
@@ -133,7 +134,8 @@
 
       update();
 
-      HBasicBlock updateEndBlock = builder.close(new HGoto());
+      HBasicBlock updateEndBlock =
+          builder.close(new HGoto(builder.abstractValueDomain));
       // The back-edge completing the cycle.
       updateEndBlock.addSuccessor(conditionBlock);
       updateGraph = new SubExpression(updateBlock, updateEndBlock);
@@ -141,7 +143,7 @@
       // Avoid a critical edge from the condition to the loop-exit body.
       HBasicBlock conditionExitBlock = builder.addNewBlock();
       builder.open(conditionExitBlock);
-      builder.close(new HGoto());
+      builder.close(new HGoto(builder.abstractValueDomain));
       conditionEndBlock.addSuccessor(conditionExitBlock);
 
       endLoop(conditionBlock, conditionExitBlock, jumpHandler, savedLocals);
@@ -172,7 +174,7 @@
       // label to the if.
       HBasicBlock elseBlock = builder.addNewBlock();
       builder.open(elseBlock);
-      builder.close(new HGoto());
+      builder.close(new HGoto(builder.abstractValueDomain));
       // Pass the elseBlock as the branchBlock, because that's the block we go
       // to just before leaving the 'loop'.
       endLoop(conditionBlock, elseBlock, jumpHandler, savedLocals);
@@ -184,7 +186,8 @@
       // Remove the [HLoopBranch] instruction and replace it with
       // [HIf].
       HInstruction condition = conditionEndBlock.last.inputs[0];
-      conditionEndBlock.addAtExit(new HIf(condition));
+      conditionEndBlock
+          .addAtExit(new HIf(builder.abstractValueDomain, condition));
       conditionEndBlock.addSuccessor(elseBlock);
       conditionEndBlock.remove(conditionEndBlock.last);
       HIfBlockInformation info = new HIfBlockInformation(
@@ -210,7 +213,8 @@
 
         jumpHandler.forEachBreak((HBreak breakInstruction, _) {
           HBasicBlock block = breakInstruction.block;
-          block.addAtExit(new HBreak.toLabel(label, sourceInformation));
+          block.addAtExit(new HBreak.toLabel(
+              builder.abstractValueDomain, label, sourceInformation));
           block.remove(breakInstruction);
         });
       }
@@ -224,7 +228,8 @@
   /// Also notifies the locals handler that we're entering a loop.
   JumpHandler beginLoopHeader(T node, JumpTarget jumpTarget) {
     assert(!builder.isAborted());
-    HBasicBlock previousBlock = builder.close(new HGoto());
+    HBasicBlock previousBlock =
+        builder.close(new HGoto(builder.abstractValueDomain));
 
     JumpHandler jumpHandler =
         createJumpHandler(node, jumpTarget, isLoopJump: true);
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index fbe8edd..a42c238 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -4,7 +4,6 @@
 
 import '../closure.dart';
 import '../common.dart';
-import '../common_elements.dart' show CommonElements;
 import '../compiler.dart' show Compiler;
 import '../constants/constant_system.dart';
 import '../constants/values.dart';
@@ -16,8 +15,7 @@
 import '../js/js.dart' as js;
 import '../js_backend/js_backend.dart';
 import '../native/native.dart' as native;
-import '../types/constants.dart' show computeTypeMask;
-import '../types/types.dart';
+import '../types/abstract_value_domain.dart';
 import '../universe/selector.dart' show Selector;
 import '../universe/side_effects.dart' show SideEffects;
 import '../util/util.dart';
@@ -261,7 +259,8 @@
         // We use `null` as the value for invalid constant expressions.
         constant = const NullConstantValue();
       }
-      TypeMask type = computeTypeMask(closedWorld, constant);
+      AbstractValue type = closedWorld.abstractValueDomain
+          .computeAbstractValueForConstant(constant);
       result = new HConstant.internal(constant, type)
         ..sourceInformation = sourceInformation;
       entry.addAtExit(result);
@@ -318,15 +317,15 @@
     // A constant with an empty type used as the HInstruction of an expression
     // in an unreachable context.
     return addConstant(
-        new SyntheticConstantValue(
-            SyntheticConstantKind.EMPTY_VALUE, const TypeMask.nonNullEmpty()),
+        new SyntheticConstantValue(SyntheticConstantKind.EMPTY_VALUE,
+            closedWorld.abstractValueDomain.emptyType),
         closedWorld);
   }
 
-  void finalize() {
+  void finalize(AbstractValueDomain domain) {
     addBlock(exit);
     exit.open();
-    exit.close(new HExit());
+    exit.close(new HExit(domain));
     assignDominators();
   }
 
@@ -975,225 +974,118 @@
    * effect, nor any dependency. They can be moved anywhere in the
    * graph.
    */
-  bool isPure() {
+  bool isPure(AbstractValueDomain domain) {
     return !sideEffects.hasSideEffects() &&
         !sideEffects.dependsOnSomething() &&
-        !canThrow();
+        !canThrow(domain);
   }
 
   /// An instruction is an 'allocation' is it is the sole alias for an object.
   /// This applies to instructions that allocate new objects and can be extended
   /// to methods that return other allocations without escaping them.
-  bool get isAllocation => false;
+  bool isAllocation(AbstractValueDomain domain) => false;
 
   /// Overridden by [HCheck] to return the actual non-[HCheck]
   /// instruction it checks against.
   HInstruction nonCheck() => this;
 
   /// Can this node throw an exception?
-  bool canThrow() => false;
+  bool canThrow(AbstractValueDomain domain) => false;
 
   /// Does this node potentially affect control flow.
   bool isControlFlow() => false;
 
-  bool isExact() => instructionType.isExact || isNull();
+  bool isExact(AbstractValueDomain domain) => domain.isExact(instructionType);
 
-  bool isValue() => instructionType.isValue;
+  bool isValue(AbstractValueDomain domain) => domain.isValue(instructionType);
 
-  bool canBeNull() => instructionType.isNullable;
+  bool canBeNull(AbstractValueDomain domain) =>
+      domain.canBeNull(instructionType);
 
-  bool isNull() => instructionType.isNull;
+  bool isNull(AbstractValueDomain domain) => domain.isNull(instructionType);
 
-  bool isConflicting() => instructionType.isEmpty;
+  bool isConflicting(AbstractValueDomain domain) =>
+      domain.isEmpty(instructionType);
 
-  /// Returns `true` if [typeMask] contains [cls].
-  static bool containsType(
-      TypeMask typeMask, ClassEntity cls, ClosedWorld closedWorld) {
-    return closedWorld.isInstantiated(cls) &&
-        typeMask.contains(cls, closedWorld);
-  }
+  bool canBePrimitive(AbstractValueDomain domain) =>
+      domain.canBePrimitive(instructionType);
 
-  /// Returns `true` if [typeMask] contains only [cls].
-  static bool containsOnlyType(
-      TypeMask typeMask, ClassEntity cls, ClosedWorld closedWorld) {
-    return closedWorld.isInstantiated(cls) && typeMask.containsOnly(cls);
-  }
+  bool canBePrimitiveNumber(AbstractValueDomain domain) =>
+      domain.canBePrimitiveNumber(instructionType);
 
-  /// Returns `true` if [typeMask] is an instance of [cls].
-  static bool isInstanceOf(
-      TypeMask typeMask, ClassEntity cls, ClosedWorld closedWorld) {
-    return closedWorld.isImplemented(cls) &&
-        typeMask.satisfies(cls, closedWorld);
-  }
+  bool canBePrimitiveBoolean(AbstractValueDomain domain) =>
+      domain.canBePrimitiveBoolean(instructionType);
 
-  bool canBePrimitive(ClosedWorld closedWorld) {
-    return canBePrimitiveNumber(closedWorld) ||
-        canBePrimitiveArray(closedWorld) ||
-        canBePrimitiveBoolean(closedWorld) ||
-        canBePrimitiveString(closedWorld) ||
-        isNull();
-  }
+  bool canBePrimitiveArray(AbstractValueDomain domain) =>
+      domain.canBePrimitiveArray(instructionType);
 
-  bool canBePrimitiveNumber(ClosedWorld closedWorld) {
-    CommonElements commonElements = closedWorld.commonElements;
-    // TODO(sra): It should be possible to test only jsDoubleClass and
-    // jsUInt31Class, since all others are superclasses of these two.
-    return containsType(
-            instructionType, commonElements.jsNumberClass, closedWorld) ||
-        containsType(instructionType, commonElements.jsIntClass, closedWorld) ||
-        containsType(
-            instructionType, commonElements.jsPositiveIntClass, closedWorld) ||
-        containsType(
-            instructionType, commonElements.jsUInt32Class, closedWorld) ||
-        containsType(
-            instructionType, commonElements.jsUInt31Class, closedWorld) ||
-        containsType(
-            instructionType, commonElements.jsDoubleClass, closedWorld);
-  }
+  bool isIndexablePrimitive(AbstractValueDomain domain) =>
+      domain.isIndexablePrimitive(instructionType);
 
-  bool canBePrimitiveBoolean(ClosedWorld closedWorld) {
-    return containsType(
-        instructionType, closedWorld.commonElements.jsBoolClass, closedWorld);
-  }
+  bool isFixedArray(AbstractValueDomain domain) =>
+      domain.isFixedArray(instructionType);
 
-  bool canBePrimitiveArray(ClosedWorld closedWorld) {
-    CommonElements commonElements = closedWorld.commonElements;
-    return containsType(
-            instructionType, commonElements.jsArrayClass, closedWorld) ||
-        containsType(
-            instructionType, commonElements.jsFixedArrayClass, closedWorld) ||
-        containsType(instructionType, commonElements.jsExtendableArrayClass,
-            closedWorld) ||
-        containsType(instructionType, commonElements.jsUnmodifiableArrayClass,
-            closedWorld);
-  }
+  bool isExtendableArray(AbstractValueDomain domain) =>
+      domain.isExtendableArray(instructionType);
 
-  bool isIndexablePrimitive(ClosedWorld closedWorld) {
-    return instructionType.containsOnlyString(closedWorld) ||
-        isInstanceOf(instructionType,
-            closedWorld.commonElements.jsIndexableClass, closedWorld);
-  }
+  bool isMutableArray(AbstractValueDomain domain) =>
+      domain.isMutableArray(instructionType);
 
-  bool isFixedArray(ClosedWorld closedWorld) {
-    CommonElements commonElements = closedWorld.commonElements;
-    // TODO(sra): Recognize the union of these types as well.
-    return containsOnlyType(
-            instructionType, commonElements.jsFixedArrayClass, closedWorld) ||
-        containsOnlyType(instructionType,
-            commonElements.jsUnmodifiableArrayClass, closedWorld);
-  }
+  bool isMutableIndexable(AbstractValueDomain domain) =>
+      domain.isMutableIndexable(instructionType);
 
-  bool isExtendableArray(ClosedWorld closedWorld) {
-    return containsOnlyType(instructionType,
-        closedWorld.commonElements.jsExtendableArrayClass, closedWorld);
-  }
+  bool isArray(AbstractValueDomain domain) => domain.isArray(instructionType);
 
-  bool isMutableArray(ClosedWorld closedWorld) {
-    return isInstanceOf(instructionType,
-        closedWorld.commonElements.jsMutableArrayClass, closedWorld);
-  }
+  bool canBePrimitiveString(AbstractValueDomain domain) =>
+      domain.canBePrimitiveString(instructionType);
 
-  bool isReadableArray(ClosedWorld closedWorld) {
-    return isInstanceOf(
-        instructionType, closedWorld.commonElements.jsArrayClass, closedWorld);
-  }
+  bool isInteger(AbstractValueDomain domain) =>
+      domain.isInteger(instructionType);
 
-  bool isMutableIndexable(ClosedWorld closedWorld) {
-    return isInstanceOf(instructionType,
-        closedWorld.commonElements.jsMutableIndexableClass, closedWorld);
-  }
+  bool isUInt32(AbstractValueDomain domain) => domain.isUInt32(instructionType);
 
-  bool isArray(ClosedWorld closedWorld) => isReadableArray(closedWorld);
+  bool isUInt31(AbstractValueDomain domain) => domain.isUInt31(instructionType);
 
-  bool canBePrimitiveString(ClosedWorld closedWorld) {
-    return containsType(
-        instructionType, closedWorld.commonElements.jsStringClass, closedWorld);
-  }
+  bool isPositiveInteger(AbstractValueDomain domain) =>
+      domain.isPositiveInteger(instructionType);
 
-  bool isInteger(ClosedWorld closedWorld) {
-    return instructionType.containsOnlyInt(closedWorld) &&
-        !instructionType.isNullable;
-  }
+  bool isPositiveIntegerOrNull(AbstractValueDomain domain) =>
+      domain.isPositiveIntegerOrNull(instructionType);
 
-  bool isUInt32(ClosedWorld closedWorld) {
-    return !instructionType.isNullable &&
-        isInstanceOf(instructionType, closedWorld.commonElements.jsUInt32Class,
-            closedWorld);
-  }
+  bool isIntegerOrNull(AbstractValueDomain domain) =>
+      domain.isIntegerOrNull(instructionType);
 
-  bool isUInt31(ClosedWorld closedWorld) {
-    return !instructionType.isNullable &&
-        isInstanceOf(instructionType, closedWorld.commonElements.jsUInt31Class,
-            closedWorld);
-  }
+  bool isNumber(AbstractValueDomain domain) => domain.isNumber(instructionType);
 
-  bool isPositiveInteger(ClosedWorld closedWorld) {
-    return !instructionType.isNullable &&
-        isInstanceOf(instructionType,
-            closedWorld.commonElements.jsPositiveIntClass, closedWorld);
-  }
+  bool isNumberOrNull(AbstractValueDomain domain) =>
+      domain.isNumberOrNull(instructionType);
 
-  bool isPositiveIntegerOrNull(ClosedWorld closedWorld) {
-    return isInstanceOf(instructionType,
-        closedWorld.commonElements.jsPositiveIntClass, closedWorld);
-  }
+  bool isDouble(AbstractValueDomain domain) => domain.isDouble(instructionType);
 
-  bool isIntegerOrNull(ClosedWorld closedWorld) {
-    return instructionType.containsOnlyInt(closedWorld);
-  }
+  bool isDoubleOrNull(AbstractValueDomain domain) =>
+      domain.isDoubleOrNull(instructionType);
 
-  bool isNumber(ClosedWorld closedWorld) {
-    return instructionType.containsOnlyNum(closedWorld) &&
-        !instructionType.isNullable;
-  }
+  bool isBoolean(AbstractValueDomain domain) =>
+      domain.isBoolean(instructionType);
 
-  bool isNumberOrNull(ClosedWorld closedWorld) {
-    return instructionType.containsOnlyNum(closedWorld);
-  }
+  bool isBooleanOrNull(AbstractValueDomain domain) =>
+      domain.isBooleanOrNull(instructionType);
 
-  bool isDouble(ClosedWorld closedWorld) {
-    return instructionType.containsOnlyDouble(closedWorld) &&
-        !instructionType.isNullable;
-  }
+  bool isString(AbstractValueDomain domain) => domain.isString(instructionType);
 
-  bool isDoubleOrNull(ClosedWorld closedWorld) {
-    return instructionType.containsOnlyDouble(closedWorld);
-  }
+  bool isStringOrNull(AbstractValueDomain domain) =>
+      domain.isStringOrNull(instructionType);
 
-  bool isBoolean(ClosedWorld closedWorld) {
-    return instructionType.containsOnlyBool(closedWorld) &&
-        !instructionType.isNullable;
-  }
+  bool isPrimitive(AbstractValueDomain domain) =>
+      domain.isPrimitive(instructionType);
 
-  bool isBooleanOrNull(ClosedWorld closedWorld) {
-    return instructionType.containsOnlyBool(closedWorld);
-  }
-
-  bool isString(ClosedWorld closedWorld) {
-    return instructionType.containsOnlyString(closedWorld) &&
-        !instructionType.isNullable;
-  }
-
-  bool isStringOrNull(ClosedWorld closedWorld) {
-    return instructionType.containsOnlyString(closedWorld);
-  }
-
-  bool isPrimitive(ClosedWorld closedWorld) {
-    return (isPrimitiveOrNull(closedWorld) && !instructionType.isNullable) ||
-        isNull();
-  }
-
-  bool isPrimitiveOrNull(ClosedWorld closedWorld) {
-    return isIndexablePrimitive(closedWorld) ||
-        isNumberOrNull(closedWorld) ||
-        isBooleanOrNull(closedWorld) ||
-        isNull();
-  }
+  bool isPrimitiveOrNull(AbstractValueDomain domain) =>
+      domain.isPrimitiveOrNull(instructionType);
 
   /**
    * Type of the instruction.
    */
-  TypeMask instructionType;
+  AbstractValue instructionType;
 
   Selector get selector => null;
   HInstruction getDartReceiver(ClosedWorld closedWorld) => null;
@@ -1367,19 +1259,19 @@
     if (type == closedWorld.commonElements.objectType) return this;
     if (type.isFunctionType || type.isMalformed || type.isFutureOr) {
       return new HTypeConversion(type, kind,
-          closedWorld.commonMasks.dynamicType, this, sourceInformation);
+          closedWorld.abstractValueDomain.dynamicType, this, sourceInformation);
     }
     assert(type.isInterfaceType);
     if (kind == HTypeConversion.BOOLEAN_CONVERSION_CHECK) {
       // Boolean conversion checks work on non-nullable booleans.
-      return new HTypeConversion(type, kind, closedWorld.commonMasks.boolType,
-          this, sourceInformation);
+      return new HTypeConversion(type, kind,
+          closedWorld.abstractValueDomain.boolType, this, sourceInformation);
     } else if (kind == HTypeConversion.CHECKED_MODE_CHECK && !type.treatAsRaw) {
       throw 'creating compound check to $type (this = ${this})';
     } else {
       InterfaceType interfaceType = type;
-      TypeMask subtype =
-          new TypeMask.subtype(interfaceType.element, closedWorld);
+      AbstractValue subtype = closedWorld.abstractValueDomain
+          .createNullableSubtype(interfaceType.element);
       return new HTypeConversion(type, kind, subtype, this, sourceInformation);
     }
   }
@@ -1556,12 +1448,12 @@
  * codegen decisions just prior to generating JavaScript.
  */
 abstract class HLateInstruction extends HInstruction {
-  HLateInstruction(List<HInstruction> inputs, TypeMask type)
+  HLateInstruction(List<HInstruction> inputs, AbstractValue type)
       : super(inputs, type);
 }
 
 class HBoolify extends HInstruction {
-  HBoolify(HInstruction value, TypeMask type)
+  HBoolify(HInstruction value, AbstractValue type)
       : super(<HInstruction>[value], type) {
     setUseGvn();
     sourceInformation = value.sourceInformation;
@@ -1586,7 +1478,7 @@
   }
   HInstruction get checkedInput => inputs[0];
   bool isJsStatement() => true;
-  bool canThrow() => true;
+  bool canThrow(AbstractValueDomain domain) => true;
 
   HInstruction nonCheck() => checkedInput.nonCheck();
 }
@@ -1621,14 +1513,19 @@
 }
 
 abstract class HConditionalBranch extends HControlFlow {
-  HConditionalBranch(inputs) : super(inputs);
+  HConditionalBranch(AbstractValueDomain domain, List<HInstruction> inputs)
+      : super(domain, inputs);
   HInstruction get condition => inputs[0];
   HBasicBlock get trueBranch => block.successors[0];
   HBasicBlock get falseBranch => block.successors[1];
 }
 
 abstract class HControlFlow extends HInstruction {
-  HControlFlow(inputs) : super(inputs, const TypeMask.nonNullEmpty());
+  HControlFlow(AbstractValueDomain domain, List<HInstruction> inputs)
+      // TODO(johnniwinther): May only expression-like [HInstruction]s should
+      // have an `instructionType`, or statement-like [HInstruction]s should
+      // have a throwing getter.
+      : super(inputs, domain.emptyType);
   bool isControlFlow() => true;
   bool isJsStatement() => true;
 }
@@ -1650,14 +1547,14 @@
   /// the closure class.
   FunctionEntity callMethod;
 
-  HCreate(this.element, List<HInstruction> inputs, TypeMask type,
+  HCreate(this.element, List<HInstruction> inputs, AbstractValue type,
       SourceInformation sourceInformation,
       {this.instantiatedTypes, this.hasRtiInput: false, this.callMethod})
       : super(inputs, type) {
     this.sourceInformation = sourceInformation;
   }
 
-  bool get isAllocation => true;
+  bool isAllocation(AbstractValueDomain domain) => true;
 
   HInstruction get rtiInput {
     assert(hasRtiInput);
@@ -1671,9 +1568,9 @@
 
 // Allocates a box to hold mutated captured variables.
 class HCreateBox extends HInstruction {
-  HCreateBox(TypeMask type) : super(<HInstruction>[], type);
+  HCreateBox(AbstractValue type) : super(<HInstruction>[], type);
 
-  bool get isAllocation => true;
+  bool isAllocation(AbstractValueDomain domain) => true;
 
   accept(HVisitor visitor) => visitor.visitCreateBox(this);
 
@@ -1681,7 +1578,7 @@
 }
 
 abstract class HInvoke extends HInstruction {
-  bool isAllocation = false;
+  bool _isAllocation = false;
 
   /// [isInterceptedCall] is true if this invocation uses the interceptor
   /// calling convention where the first input is the methods and the second
@@ -1692,17 +1589,21 @@
     sideEffects.setDependsOnSomething();
   }
   static const int ARGUMENTS_OFFSET = 1;
-  bool canThrow() => true;
+  bool canThrow(AbstractValueDomain domain) => true;
+  bool isAllocation(AbstractValueDomain domain) => _isAllocation;
+  void setAllocation(bool value) {
+    _isAllocation = value;
+  }
 }
 
 abstract class HInvokeDynamic extends HInvoke {
   final InvokeDynamicSpecializer specializer;
   Selector selector;
-  TypeMask mask;
+  AbstractValue mask;
   MemberEntity element;
 
   HInvokeDynamic(Selector selector, this.mask, this.element,
-      List<HInstruction> inputs, bool isIntercepted, TypeMask type)
+      List<HInstruction> inputs, bool isIntercepted, AbstractValue type)
       : this.selector = selector,
         specializer = isIntercepted
             ? InvokeDynamicSpecializer.lookupSpecializer(selector)
@@ -1741,8 +1642,8 @@
 class HInvokeClosure extends HInvokeDynamic {
   final List<DartType> typeArguments;
 
-  HInvokeClosure(Selector selector, List<HInstruction> inputs, TypeMask type,
-      this.typeArguments)
+  HInvokeClosure(Selector selector, List<HInstruction> inputs,
+      AbstractValue type, this.typeArguments)
       : super(selector, null, null, inputs, false, type) {
     assert(selector.isClosureCall);
     assert(selector.callStructure.typeArgumentCount == typeArguments.length);
@@ -1756,9 +1657,9 @@
 
   HInvokeDynamicMethod(
       Selector selector,
-      TypeMask mask,
+      AbstractValue mask,
       List<HInstruction> inputs,
-      TypeMask type,
+      AbstractValue type,
       this.typeArguments,
       SourceInformation sourceInformation,
       {bool isIntercepted: false})
@@ -1772,8 +1673,13 @@
 }
 
 abstract class HInvokeDynamicField extends HInvokeDynamic {
-  HInvokeDynamicField(Selector selector, TypeMask mask, MemberEntity element,
-      List<HInstruction> inputs, bool isIntercepted, TypeMask type)
+  HInvokeDynamicField(
+      Selector selector,
+      AbstractValue mask,
+      MemberEntity element,
+      List<HInstruction> inputs,
+      bool isIntercepted,
+      AbstractValue type)
       : super(selector, mask, element, inputs, isIntercepted, type);
 
   String toString() => 'invoke dynamic field: selector=$selector, mask=$mask';
@@ -1782,11 +1688,11 @@
 class HInvokeDynamicGetter extends HInvokeDynamicField {
   HInvokeDynamicGetter(
       Selector selector,
-      TypeMask mask,
+      AbstractValue mask,
       MemberEntity element,
       List<HInstruction> inputs,
       bool isIntercepted,
-      TypeMask type,
+      AbstractValue type,
       SourceInformation sourceInformation)
       : super(selector, mask, element, inputs, isIntercepted, type) {
     this.sourceInformation = sourceInformation;
@@ -1799,7 +1705,8 @@
   List<DartType> get typeArguments => const <DartType>[];
 
   // There might be an interceptor input, so `inputs.last` is the dart receiver.
-  bool canThrow() => isTearOff ? inputs.last.canBeNull() : super.canThrow();
+  bool canThrow(AbstractValueDomain domain) =>
+      isTearOff ? inputs.last.canBeNull(domain) : super.canThrow(domain);
 
   String toString() => 'invoke dynamic getter: selector=$selector, mask=$mask';
 }
@@ -1807,11 +1714,11 @@
 class HInvokeDynamicSetter extends HInvokeDynamicField {
   HInvokeDynamicSetter(
       Selector selector,
-      TypeMask mask,
+      AbstractValue mask,
       MemberEntity element,
       List<HInstruction> inputs,
       bool isIntercepted,
-      TypeMask type,
+      AbstractValue type,
       SourceInformation sourceInformation)
       : super(selector, mask, element, inputs, isIntercepted, type) {
     this.sourceInformation = sourceInformation;
@@ -1832,7 +1739,7 @@
 
   final bool targetCanThrow;
 
-  bool canThrow() => targetCanThrow;
+  bool canThrow(AbstractValueDomain domain) => targetCanThrow;
 
   /// If this instruction is a call to a constructor, [instantiatedTypes]
   /// contains the type(s) used in the (Dart) `New` expression(s). The
@@ -1841,7 +1748,7 @@
   List<DartType> instantiatedTypes;
 
   /** The first input must be the target. */
-  HInvokeStatic(this.element, inputs, TypeMask type, this.typeArguments,
+  HInvokeStatic(this.element, inputs, AbstractValue type, this.typeArguments,
       {this.targetCanThrow: true, bool isIntercepted: false})
       : super(inputs, type) {
     isInterceptedCall = isIntercepted;
@@ -1866,7 +1773,7 @@
       this.selector,
       List<HInstruction> inputs,
       bool isIntercepted,
-      TypeMask type,
+      AbstractValue type,
       List<DartType> typeArguments,
       SourceInformation sourceInformation,
       {this.isSetter})
@@ -1904,7 +1811,7 @@
   HInvokeConstructorBody(
       ConstructorBodyEntity element,
       List<HInstruction> inputs,
-      TypeMask type,
+      AbstractValue type,
       SourceInformation sourceInformation)
       : super(element, inputs, type, const <DartType>[]) {
     this.sourceInformation = sourceInformation;
@@ -1917,7 +1824,7 @@
 abstract class HFieldAccess extends HInstruction {
   final FieldEntity element;
 
-  HFieldAccess(this.element, List<HInstruction> inputs, TypeMask type)
+  HFieldAccess(this.element, List<HInstruction> inputs, AbstractValue type)
       : super(inputs, type);
 
   HInstruction get receiver => inputs[0];
@@ -1926,7 +1833,7 @@
 class HFieldGet extends HFieldAccess {
   final bool isAssignable;
 
-  HFieldGet(FieldEntity element, HInstruction receiver, TypeMask type,
+  HFieldGet(FieldEntity element, HInstruction receiver, AbstractValue type,
       {bool isAssignable})
       : this.isAssignable =
             (isAssignable != null) ? isAssignable : element.isAssignable,
@@ -1952,7 +1859,7 @@
     return false;
   }
 
-  bool canThrow() => receiver.canBeNull();
+  bool canThrow(AbstractValueDomain domain) => receiver.canBeNull(domain);
 
   HInstruction getDartReceiver(ClosedWorld closedWorld) => receiver;
   bool onlyThrowsNSM() => true;
@@ -1967,15 +1874,15 @@
 }
 
 class HFieldSet extends HFieldAccess {
-  HFieldSet(FieldEntity element, HInstruction receiver, HInstruction value)
-      : super(element, <HInstruction>[receiver, value],
-            const TypeMask.nonNullEmpty()) {
+  HFieldSet(AbstractValueDomain domain, FieldEntity element,
+      HInstruction receiver, HInstruction value)
+      : super(element, <HInstruction>[receiver, value], domain.emptyType) {
     sideEffects.clearAllSideEffects();
     sideEffects.clearAllDependencies();
     sideEffects.setChangesInstanceProperty();
   }
 
-  bool canThrow() => receiver.canBeNull();
+  bool canThrow(AbstractValueDomain domain) => receiver.canBeNull(domain);
 
   HInstruction getDartReceiver(ClosedWorld closedWorld) => receiver;
   bool onlyThrowsNSM() => true;
@@ -1989,7 +1896,8 @@
 
 class HGetLength extends HInstruction {
   final bool isAssignable;
-  HGetLength(HInstruction receiver, TypeMask type, {bool this.isAssignable})
+  HGetLength(HInstruction receiver, AbstractValue type,
+      {bool this.isAssignable})
       : super(<HInstruction>[receiver], type) {
     assert(isAssignable != null);
     sideEffects.clearAllSideEffects();
@@ -2002,7 +1910,7 @@
 
   HInstruction get receiver => inputs.single;
 
-  bool canThrow() => receiver.canBeNull();
+  bool canThrow(AbstractValueDomain domain) => receiver.canBeNull(domain);
 
   HInstruction getDartReceiver(ClosedWorld closedWorld) => receiver;
   bool onlyThrowsNSM() => true;
@@ -2028,7 +1936,7 @@
   final int opKind;
 
   HReadModifyWrite._(this.element, this.jsOp, this.opKind,
-      List<HInstruction> inputs, TypeMask type)
+      List<HInstruction> inputs, AbstractValue type)
       : super(inputs, type) {
     sideEffects.clearAllSideEffects();
     sideEffects.clearAllDependencies();
@@ -2037,16 +1945,16 @@
   }
 
   HReadModifyWrite.assignOp(FieldEntity element, String jsOp,
-      HInstruction receiver, HInstruction operand, TypeMask type)
+      HInstruction receiver, HInstruction operand, AbstractValue type)
       : this._(
             element, jsOp, ASSIGN_OP, <HInstruction>[receiver, operand], type);
 
-  HReadModifyWrite.preOp(
-      FieldEntity element, String jsOp, HInstruction receiver, TypeMask type)
+  HReadModifyWrite.preOp(FieldEntity element, String jsOp,
+      HInstruction receiver, AbstractValue type)
       : this._(element, jsOp, PRE_OP, <HInstruction>[receiver], type);
 
-  HReadModifyWrite.postOp(
-      FieldEntity element, String jsOp, HInstruction receiver, TypeMask type)
+  HReadModifyWrite.postOp(FieldEntity element, String jsOp,
+      HInstruction receiver, AbstractValue type)
       : this._(element, jsOp, POST_OP, <HInstruction>[receiver], type);
 
   HInstruction get receiver => inputs[0];
@@ -2055,7 +1963,7 @@
   bool get isPostOp => opKind == POST_OP;
   bool get isAssignOp => opKind == ASSIGN_OP;
 
-  bool canThrow() => receiver.canBeNull();
+  bool canThrow(AbstractValueDomain domain) => receiver.canBeNull(domain);
 
   HInstruction getDartReceiver(ClosedWorld closedWorld) => receiver;
   bool onlyThrowsNSM() => true;
@@ -2070,7 +1978,7 @@
 abstract class HLocalAccess extends HInstruction {
   final Local variable;
 
-  HLocalAccess(this.variable, List<HInstruction> inputs, TypeMask type)
+  HLocalAccess(this.variable, List<HInstruction> inputs, AbstractValue type)
       : super(inputs, type);
 
   HInstruction get receiver => inputs[0];
@@ -2079,7 +1987,7 @@
 class HLocalGet extends HLocalAccess {
   // No need to use GVN for a [HLocalGet], it is just a local
   // access.
-  HLocalGet(Local variable, HLocalValue local, TypeMask type,
+  HLocalGet(Local variable, HLocalValue local, AbstractValue type,
       SourceInformation sourceInformation)
       : super(variable, <HInstruction>[local], type) {
     this.sourceInformation = sourceInformation;
@@ -2091,9 +1999,9 @@
 }
 
 class HLocalSet extends HLocalAccess {
-  HLocalSet(Local variable, HLocalValue local, HInstruction value)
-      : super(variable, <HInstruction>[local, value],
-            const TypeMask.nonNullEmpty());
+  HLocalSet(AbstractValueDomain domain, Local variable, HLocalValue local,
+      HInstruction value)
+      : super(variable, <HInstruction>[local, value], domain.emptyType);
 
   accept(HVisitor visitor) => visitor.visitLocalSet(this);
 
@@ -2103,12 +2011,12 @@
 }
 
 abstract class HForeign extends HInstruction {
-  HForeign(TypeMask type, List<HInstruction> inputs) : super(inputs, type);
+  HForeign(AbstractValue type, List<HInstruction> inputs) : super(inputs, type);
 
   bool get isStatement => false;
   native.NativeBehavior get nativeBehavior => null;
 
-  bool canThrow() {
+  bool canThrow(AbstractValueDomain domain) {
     return sideEffects.hasSideEffects() || sideEffects.dependsOnSomething();
   }
 }
@@ -2120,7 +2028,7 @@
   native.NativeThrowBehavior throwBehavior;
   final FunctionEntity foreignFunction;
 
-  HForeignCode(this.codeTemplate, TypeMask type, List<HInstruction> inputs,
+  HForeignCode(this.codeTemplate, AbstractValue type, List<HInstruction> inputs,
       {this.isStatement: false,
       SideEffects effects,
       native.NativeBehavior nativeBehavior,
@@ -2146,8 +2054,12 @@
     }
   }
 
-  HForeignCode.statement(js.Template codeTemplate, List<HInstruction> inputs,
-      SideEffects effects, native.NativeBehavior nativeBehavior, TypeMask type)
+  HForeignCode.statement(
+      js.Template codeTemplate,
+      List<HInstruction> inputs,
+      SideEffects effects,
+      native.NativeBehavior nativeBehavior,
+      AbstractValue type)
       : this(codeTemplate, type, inputs,
             isStatement: true,
             effects: effects,
@@ -2156,9 +2068,9 @@
   accept(HVisitor visitor) => visitor.visitForeignCode(this);
 
   bool isJsStatement() => isStatement;
-  bool canThrow() {
+  bool canThrow(AbstractValueDomain domain) {
     if (inputs.length > 0) {
-      return inputs.first.canBeNull()
+      return inputs.first.canBeNull(domain)
           ? throwBehavior.canThrow
           : throwBehavior.onNonNull.canThrow;
     }
@@ -2167,8 +2079,10 @@
 
   bool onlyThrowsNSM() => throwBehavior.isOnlyNullNSMGuard;
 
-  bool get isAllocation =>
-      nativeBehavior != null && nativeBehavior.isAllocation && !canBeNull();
+  bool isAllocation(AbstractValueDomain domain) =>
+      nativeBehavior != null &&
+      nativeBehavior.isAllocation &&
+      !canBeNull(domain);
 
   int typeCode() => HInstruction.FOREIGN_CODE_TYPECODE;
   bool typeEquals(other) => other is HForeignCode;
@@ -2183,7 +2097,7 @@
 abstract class HInvokeBinary extends HInstruction {
   final Selector selector;
   HInvokeBinary(
-      HInstruction left, HInstruction right, this.selector, TypeMask type)
+      HInstruction left, HInstruction right, this.selector, AbstractValue type)
       : super(<HInstruction>[left, right], type) {
     sideEffects.clearAllSideEffects();
     sideEffects.clearAllDependencies();
@@ -2197,14 +2111,15 @@
 }
 
 abstract class HBinaryArithmetic extends HInvokeBinary {
-  HBinaryArithmetic(
-      HInstruction left, HInstruction right, Selector selector, TypeMask type)
+  HBinaryArithmetic(HInstruction left, HInstruction right, Selector selector,
+      AbstractValue type)
       : super(left, right, selector, type);
   BinaryOperation operation(ConstantSystem constantSystem);
 }
 
 class HAdd extends HBinaryArithmetic {
-  HAdd(HInstruction left, HInstruction right, Selector selector, TypeMask type)
+  HAdd(HInstruction left, HInstruction right, Selector selector,
+      AbstractValue type)
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitAdd(this);
 
@@ -2216,8 +2131,8 @@
 }
 
 class HDivide extends HBinaryArithmetic {
-  HDivide(
-      HInstruction left, HInstruction right, Selector selector, TypeMask type)
+  HDivide(HInstruction left, HInstruction right, Selector selector,
+      AbstractValue type)
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitDivide(this);
 
@@ -2229,8 +2144,8 @@
 }
 
 class HMultiply extends HBinaryArithmetic {
-  HMultiply(
-      HInstruction left, HInstruction right, Selector selector, TypeMask type)
+  HMultiply(HInstruction left, HInstruction right, Selector selector,
+      AbstractValue type)
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitMultiply(this);
 
@@ -2241,8 +2156,8 @@
 }
 
 class HSubtract extends HBinaryArithmetic {
-  HSubtract(
-      HInstruction left, HInstruction right, Selector selector, TypeMask type)
+  HSubtract(HInstruction left, HInstruction right, Selector selector,
+      AbstractValue type)
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitSubtract(this);
 
@@ -2254,8 +2169,8 @@
 }
 
 class HTruncatingDivide extends HBinaryArithmetic {
-  HTruncatingDivide(
-      HInstruction left, HInstruction right, Selector selector, TypeMask type)
+  HTruncatingDivide(HInstruction left, HInstruction right, Selector selector,
+      AbstractValue type)
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitTruncatingDivide(this);
 
@@ -2267,8 +2182,8 @@
 }
 
 class HRemainder extends HBinaryArithmetic {
-  HRemainder(
-      HInstruction left, HInstruction right, Selector selector, TypeMask type)
+  HRemainder(HInstruction left, HInstruction right, Selector selector,
+      AbstractValue type)
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitRemainder(this);
 
@@ -2285,7 +2200,8 @@
  * Its block has one successor per constant, and one for the default.
  */
 class HSwitch extends HControlFlow {
-  HSwitch(List<HInstruction> inputs) : super(inputs);
+  HSwitch(AbstractValueDomain domain, List<HInstruction> inputs)
+      : super(domain, inputs);
 
   HConstant constant(int index) => inputs[index + 1];
   HInstruction get expression => inputs[0];
@@ -2303,14 +2219,14 @@
 }
 
 abstract class HBinaryBitOp extends HInvokeBinary {
-  HBinaryBitOp(
-      HInstruction left, HInstruction right, Selector selector, TypeMask type)
+  HBinaryBitOp(HInstruction left, HInstruction right, Selector selector,
+      AbstractValue type)
       : super(left, right, selector, type);
 }
 
 class HShiftLeft extends HBinaryBitOp {
-  HShiftLeft(
-      HInstruction left, HInstruction right, Selector selector, TypeMask type)
+  HShiftLeft(HInstruction left, HInstruction right, Selector selector,
+      AbstractValue type)
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitShiftLeft(this);
 
@@ -2322,8 +2238,8 @@
 }
 
 class HShiftRight extends HBinaryBitOp {
-  HShiftRight(
-      HInstruction left, HInstruction right, Selector selector, TypeMask type)
+  HShiftRight(HInstruction left, HInstruction right, Selector selector,
+      AbstractValue type)
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitShiftRight(this);
 
@@ -2335,8 +2251,8 @@
 }
 
 class HBitOr extends HBinaryBitOp {
-  HBitOr(
-      HInstruction left, HInstruction right, Selector selector, TypeMask type)
+  HBitOr(HInstruction left, HInstruction right, Selector selector,
+      AbstractValue type)
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitBitOr(this);
 
@@ -2348,8 +2264,8 @@
 }
 
 class HBitAnd extends HBinaryBitOp {
-  HBitAnd(
-      HInstruction left, HInstruction right, Selector selector, TypeMask type)
+  HBitAnd(HInstruction left, HInstruction right, Selector selector,
+      AbstractValue type)
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitBitAnd(this);
 
@@ -2361,8 +2277,8 @@
 }
 
 class HBitXor extends HBinaryBitOp {
-  HBitXor(
-      HInstruction left, HInstruction right, Selector selector, TypeMask type)
+  HBitXor(HInstruction left, HInstruction right, Selector selector,
+      AbstractValue type)
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitBitXor(this);
 
@@ -2388,7 +2304,7 @@
 }
 
 class HNegate extends HInvokeUnary {
-  HNegate(HInstruction input, Selector selector, TypeMask type)
+  HNegate(HInstruction input, Selector selector, AbstractValue type)
       : super(input, selector, type);
   accept(HVisitor visitor) => visitor.visitNegate(this);
 
@@ -2400,7 +2316,7 @@
 }
 
 class HAbs extends HInvokeUnary {
-  HAbs(HInstruction input, Selector selector, TypeMask type)
+  HAbs(HInstruction input, Selector selector, AbstractValue type)
       : super(input, selector, type);
   accept(HVisitor visitor) => visitor.visitAbs(this);
 
@@ -2411,7 +2327,7 @@
 }
 
 class HBitNot extends HInvokeUnary {
-  HBitNot(HInstruction input, Selector selector, TypeMask type)
+  HBitNot(HInstruction input, Selector selector, AbstractValue type)
       : super(input, selector, type);
   accept(HVisitor visitor) => visitor.visitBitNot(this);
 
@@ -2423,13 +2339,13 @@
 }
 
 class HExit extends HControlFlow {
-  HExit() : super(const <HInstruction>[]);
+  HExit(AbstractValueDomain domain) : super(domain, const <HInstruction>[]);
   toString() => 'exit';
   accept(HVisitor visitor) => visitor.visitExit(this);
 }
 
 class HGoto extends HControlFlow {
-  HGoto() : super(const <HInstruction>[]);
+  HGoto(AbstractValueDomain domain) : super(domain, const <HInstruction>[]);
   toString() => 'goto';
   accept(HVisitor visitor) => visitor.visitGoto(this);
 }
@@ -2437,15 +2353,17 @@
 abstract class HJump extends HControlFlow {
   final JumpTarget target;
   final LabelDefinition label;
-  HJump(this.target, SourceInformation sourceInformation)
+  HJump(AbstractValueDomain domain, this.target,
+      SourceInformation sourceInformation)
       : label = null,
-        super(const <HInstruction>[]) {
+        super(domain, const <HInstruction>[]) {
     this.sourceInformation = sourceInformation;
   }
-  HJump.toLabel(LabelDefinition label, SourceInformation sourceInformation)
+  HJump.toLabel(AbstractValueDomain domain, LabelDefinition label,
+      SourceInformation sourceInformation)
       : label = label,
         target = label.target,
-        super(const <HInstruction>[]) {
+        super(domain, const <HInstruction>[]) {
     this.sourceInformation = sourceInformation;
   }
 }
@@ -2456,13 +2374,15 @@
   /// [SsaFromAstMixin.buildComplexSwitchStatement] for detail.
   final bool breakSwitchContinueLoop;
 
-  HBreak(JumpTarget target, SourceInformation sourceInformation,
+  HBreak(AbstractValueDomain domain, JumpTarget target,
+      SourceInformation sourceInformation,
       {bool this.breakSwitchContinueLoop: false})
-      : super(target, sourceInformation);
+      : super(domain, target, sourceInformation);
 
-  HBreak.toLabel(LabelDefinition label, SourceInformation sourceInformation)
+  HBreak.toLabel(AbstractValueDomain domain, LabelDefinition label,
+      SourceInformation sourceInformation)
       : breakSwitchContinueLoop = false,
-        super.toLabel(label, sourceInformation);
+        super.toLabel(domain, label, sourceInformation);
 
   String toString() => (label != null) ? 'break ${label.labelName}' : 'break';
 
@@ -2470,11 +2390,13 @@
 }
 
 class HContinue extends HJump {
-  HContinue(JumpTarget target, SourceInformation sourceInformation)
-      : super(target, sourceInformation);
+  HContinue(AbstractValueDomain domain, JumpTarget target,
+      SourceInformation sourceInformation)
+      : super(domain, target, sourceInformation);
 
-  HContinue.toLabel(LabelDefinition label, SourceInformation sourceInformation)
-      : super.toLabel(label, sourceInformation);
+  HContinue.toLabel(AbstractValueDomain domain, LabelDefinition label,
+      SourceInformation sourceInformation)
+      : super.toLabel(domain, label, sourceInformation);
 
   String toString() =>
       (label != null) ? 'continue ${label.labelName}' : 'continue';
@@ -2486,7 +2408,7 @@
   HLocalValue exception;
   HBasicBlock catchBlock;
   HBasicBlock finallyBlock;
-  HTry() : super(const <HInstruction>[]);
+  HTry(AbstractValueDomain domain) : super(domain, const <HInstruction>[]);
   toString() => 'try';
   accept(HVisitor visitor) => visitor.visitTry(this);
   HBasicBlock get joinBlock => this.block.successors.last;
@@ -2498,7 +2420,7 @@
 // leads to one of this instruction a predecessor of catch and
 // finally.
 class HExitTry extends HControlFlow {
-  HExitTry() : super(const <HInstruction>[]);
+  HExitTry(AbstractValueDomain domain) : super(domain, const <HInstruction>[]);
   toString() => 'exit try';
   accept(HVisitor visitor) => visitor.visitExitTry(this);
   HBasicBlock get bodyTrySuccessor => block.successors[0];
@@ -2506,7 +2428,8 @@
 
 class HIf extends HConditionalBranch {
   HBlockFlow blockInformation = null;
-  HIf(HInstruction condition) : super(<HInstruction>[condition]);
+  HIf(AbstractValueDomain domain, HInstruction condition)
+      : super(domain, <HInstruction>[condition]);
   toString() => 'if';
   accept(HVisitor visitor) => visitor.visitIf(this);
 
@@ -2528,15 +2451,16 @@
   static const int DO_WHILE_LOOP = 1;
 
   final int kind;
-  HLoopBranch(HInstruction condition, [this.kind = CONDITION_FIRST_LOOP])
-      : super(<HInstruction>[condition]);
+  HLoopBranch(AbstractValueDomain domain, HInstruction condition,
+      [this.kind = CONDITION_FIRST_LOOP])
+      : super(domain, <HInstruction>[condition]);
   toString() => 'loop-branch';
   accept(HVisitor visitor) => visitor.visitLoopBranch(this);
 }
 
 class HConstant extends HInstruction {
   final ConstantValue constant;
-  HConstant.internal(this.constant, TypeMask constantType)
+  HConstant.internal(this.constant, AbstractValue constantType)
       : super(<HInstruction>[], constantType);
 
   toString() => 'literal: ${constant.toStructuredText()}';
@@ -2568,7 +2492,8 @@
 }
 
 class HNot extends HInstruction {
-  HNot(HInstruction value, TypeMask type) : super(<HInstruction>[value], type) {
+  HNot(HInstruction value, AbstractValue type)
+      : super(<HInstruction>[value], type) {
     setUseGvn();
   }
 
@@ -2584,7 +2509,8 @@
   * value from the start, whereas [HLocalValue]s need to be initialized first.
   */
 class HLocalValue extends HInstruction {
-  HLocalValue(Entity variable, TypeMask type) : super(<HInstruction>[], type) {
+  HLocalValue(Entity variable, AbstractValue type)
+      : super(<HInstruction>[], type) {
     sourceElement = variable;
   }
 
@@ -2611,7 +2537,7 @@
 }
 
 class HThis extends HParameterValue {
-  HThis(ThisLocal element, TypeMask type) : super(element, type);
+  HThis(ThisLocal element, AbstractValue type) : super(element, type);
 
   ThisLocal get sourceElement => super.sourceElement;
   void set sourceElement(covariant ThisLocal local) {
@@ -2640,15 +2566,15 @@
   // The order of the [inputs] must correspond to the order of the
   // predecessor-edges. That is if an input comes from the first predecessor
   // of the surrounding block, then the input must be the first in the [HPhi].
-  HPhi(Local variable, List<HInstruction> inputs, TypeMask type)
+  HPhi(Local variable, List<HInstruction> inputs, AbstractValue type)
       : super(inputs, type) {
     sourceElement = variable;
   }
-  HPhi.noInputs(Local variable, TypeMask type)
+  HPhi.noInputs(Local variable, AbstractValue type)
       : this(variable, <HInstruction>[], type);
-  HPhi.singleInput(Local variable, HInstruction input, TypeMask type)
+  HPhi.singleInput(Local variable, HInstruction input, AbstractValue type)
       : this(variable, <HInstruction>[input], type);
-  HPhi.manyInputs(Local variable, List<HInstruction> inputs, TypeMask type)
+  HPhi.manyInputs(Local variable, List<HInstruction> inputs, AbstractValue type)
       : this(variable, inputs, type);
 
   void addInput(HInstruction input) {
@@ -2727,8 +2653,9 @@
 }
 
 class HReturn extends HControlFlow {
-  HReturn(HInstruction value, SourceInformation sourceInformation)
-      : super(<HInstruction>[value]) {
+  HReturn(AbstractValueDomain domain, HInstruction value,
+      SourceInformation sourceInformation)
+      : super(domain, <HInstruction>[value]) {
     this.sourceInformation = sourceInformation;
   }
   toString() => 'return';
@@ -2736,42 +2663,45 @@
 }
 
 class HThrowExpression extends HInstruction {
-  HThrowExpression(HInstruction value, SourceInformation sourceInformation)
-      : super(<HInstruction>[value], const TypeMask.nonNullEmpty()) {
+  HThrowExpression(AbstractValueDomain domain, HInstruction value,
+      SourceInformation sourceInformation)
+      : super(<HInstruction>[value], domain.emptyType) {
     this.sourceInformation = sourceInformation;
   }
   toString() => 'throw expression';
   accept(HVisitor visitor) => visitor.visitThrowExpression(this);
-  bool canThrow() => true;
+  bool canThrow(AbstractValueDomain domain) => true;
 }
 
 class HAwait extends HInstruction {
-  HAwait(HInstruction value, TypeMask type)
+  HAwait(HInstruction value, AbstractValue type)
       : super(<HInstruction>[value], type);
   toString() => 'await';
   accept(HVisitor visitor) => visitor.visitAwait(this);
   // An await will throw if its argument is not a real future.
-  bool canThrow() => true;
+  bool canThrow(AbstractValueDomain domain) => true;
   SideEffects sideEffects = new SideEffects();
 }
 
 class HYield extends HInstruction {
-  HYield(HInstruction value, this.hasStar, SourceInformation sourceInformation)
-      : super(<HInstruction>[value], const TypeMask.nonNullEmpty()) {
+  HYield(AbstractValueDomain domain, HInstruction value, this.hasStar,
+      SourceInformation sourceInformation)
+      : super(<HInstruction>[value], domain.emptyType) {
     this.sourceInformation = sourceInformation;
   }
   bool hasStar;
   toString() => 'yield';
   accept(HVisitor visitor) => visitor.visitYield(this);
-  bool canThrow() => false;
+  bool canThrow(AbstractValueDomain domain) => false;
   SideEffects sideEffects = new SideEffects();
 }
 
 class HThrow extends HControlFlow {
   final bool isRethrow;
-  HThrow(HInstruction value, SourceInformation sourceInformation,
+  HThrow(AbstractValueDomain domain, HInstruction value,
+      SourceInformation sourceInformation,
       {this.isRethrow: false})
-      : super(<HInstruction>[value]) {
+      : super(domain, <HInstruction>[value]) {
     this.sourceInformation = sourceInformation;
   }
   toString() => 'throw';
@@ -2780,7 +2710,7 @@
 
 class HStatic extends HInstruction {
   final MemberEntity element;
-  HStatic(this.element, TypeMask type, SourceInformation sourceInformation)
+  HStatic(this.element, AbstractValue type, SourceInformation sourceInformation)
       : super(<HInstruction>[], type) {
     assert(element != null);
     sideEffects.clearAllSideEffects();
@@ -2815,7 +2745,7 @@
   //     (a && C.JSArray_methods).get$first(a)
   //
 
-  HInterceptor(HInstruction receiver, TypeMask type)
+  HInterceptor(HInstruction receiver, AbstractValue type)
       : super(<HInstruction>[receiver], type) {
     this.sourceInformation = receiver.sourceInformation;
     sideEffects.clearAllSideEffects();
@@ -2858,15 +2788,16 @@
   List<DartType> typeArguments;
   Set<ClassEntity> interceptedClasses;
   HOneShotInterceptor(
+      AbstractValueDomain domain,
       Selector selector,
-      TypeMask mask,
+      AbstractValue mask,
       List<HInstruction> inputs,
-      TypeMask type,
+      AbstractValue type,
       this.typeArguments,
       this.interceptedClasses)
       : super(selector, mask, null, inputs, true, type) {
     assert(inputs[0] is HConstant);
-    assert(inputs[0].isNull());
+    assert(inputs[0].isNull(domain));
     assert(selector.callStructure.typeArgumentCount == typeArguments.length);
   }
   bool isCallOnInterceptor(ClosedWorld closedWorld) => true;
@@ -2879,7 +2810,8 @@
 class HLazyStatic extends HInstruction {
   final FieldEntity element;
 
-  HLazyStatic(this.element, TypeMask type, SourceInformation sourceInformation)
+  HLazyStatic(
+      this.element, AbstractValue type, SourceInformation sourceInformation)
       : super(<HInstruction>[], type) {
     // TODO(4931): The first access has side-effects, but we afterwards we
     // should be able to GVN.
@@ -2894,13 +2826,13 @@
   int typeCode() => 30;
   // TODO(4931): can we do better here?
   bool isCodeMotionInvariant() => false;
-  bool canThrow() => true;
+  bool canThrow(AbstractValueDomain domain) => true;
 }
 
 class HStaticStore extends HInstruction {
   MemberEntity element;
-  HStaticStore(this.element, HInstruction value)
-      : super(<HInstruction>[value], const TypeMask.nonNullEmpty()) {
+  HStaticStore(AbstractValueDomain domain, this.element, HInstruction value)
+      : super(<HInstruction>[value], domain.emptyType) {
     sideEffects.clearAllSideEffects();
     sideEffects.clearAllDependencies();
     sideEffects.setChangesStaticProperty();
@@ -2915,11 +2847,12 @@
 }
 
 class HLiteralList extends HInstruction {
-  HLiteralList(List<HInstruction> inputs, TypeMask type) : super(inputs, type);
+  HLiteralList(List<HInstruction> inputs, AbstractValue type)
+      : super(inputs, type);
   toString() => 'literal list';
   accept(HVisitor visitor) => visitor.visitLiteralList(this);
 
-  bool get isAllocation => true;
+  bool isAllocation(AbstractValueDomain domain) => true;
 }
 
 /**
@@ -2928,8 +2861,8 @@
  */
 class HIndex extends HInstruction {
   final Selector selector;
-  HIndex(
-      HInstruction receiver, HInstruction index, this.selector, TypeMask type)
+  HIndex(HInstruction receiver, HInstruction index, this.selector,
+      AbstractValue type)
       : super(<HInstruction>[receiver, index], type) {
     sideEffects.clearAllSideEffects();
     sideEffects.clearAllDependencies();
@@ -2949,7 +2882,7 @@
 
   HInstruction getDartReceiver(ClosedWorld closedWorld) => receiver;
   bool onlyThrowsNSM() => true;
-  bool canThrow() => receiver.canBeNull();
+  bool canThrow(AbstractValueDomain domain) => receiver.canBeNull(domain);
 
   int typeCode() => HInstruction.INDEX_TYPECODE;
   bool typeEquals(HInstruction other) => other is HIndex;
@@ -2962,10 +2895,9 @@
  */
 class HIndexAssign extends HInstruction {
   final Selector selector;
-  HIndexAssign(HInstruction receiver, HInstruction index, HInstruction value,
-      this.selector)
-      : super(<HInstruction>[receiver, index, value],
-            const TypeMask.nonNullEmpty()) {
+  HIndexAssign(AbstractValueDomain domain, HInstruction receiver,
+      HInstruction index, HInstruction value, this.selector)
+      : super(<HInstruction>[receiver, index, value], domain.emptyType) {
     sideEffects.clearAllSideEffects();
     sideEffects.clearAllDependencies();
     sideEffects.setChangesIndex();
@@ -2983,7 +2915,7 @@
 
   HInstruction getDartReceiver(ClosedWorld closedWorld) => receiver;
   bool onlyThrowsNSM() => true;
-  bool canThrow() => receiver.canBeNull();
+  bool canThrow(AbstractValueDomain domain) => receiver.canBeNull(domain);
 }
 
 class HIs extends HInstruction {
@@ -3000,14 +2932,14 @@
   final int kind;
   final bool useInstanceOf;
 
-  HIs.direct(DartType typeExpression, HInstruction expression, TypeMask type,
-      SourceInformation sourceInformation)
+  HIs.direct(DartType typeExpression, HInstruction expression,
+      AbstractValue type, SourceInformation sourceInformation)
       : this.internal(
             typeExpression, [expression], RAW_CHECK, type, sourceInformation);
 
   // Pre-verified that the check can be done using 'instanceof'.
   HIs.instanceOf(DartType typeExpression, HInstruction expression,
-      TypeMask type, SourceInformation sourceInformation)
+      AbstractValue type, SourceInformation sourceInformation)
       : this.internal(
             typeExpression, [expression], RAW_CHECK, type, sourceInformation,
             useInstanceOf: true);
@@ -3016,7 +2948,7 @@
       DartType typeExpression,
       HInstruction expression,
       HInterceptor interceptor,
-      TypeMask type,
+      AbstractValue type,
       SourceInformation sourceInformation) {
     assert(
         (typeExpression.isFunctionType || typeExpression.isInterfaceType) &&
@@ -3026,18 +2958,26 @@
         RAW_CHECK, type, sourceInformation);
   }
 
-  HIs.compound(DartType typeExpression, HInstruction expression,
-      HInstruction call, TypeMask type, SourceInformation sourceInformation)
+  HIs.compound(
+      DartType typeExpression,
+      HInstruction expression,
+      HInstruction call,
+      AbstractValue type,
+      SourceInformation sourceInformation)
       : this.internal(typeExpression, [expression, call], COMPOUND_CHECK, type,
             sourceInformation);
 
-  HIs.variable(DartType typeExpression, HInstruction expression,
-      HInstruction call, TypeMask type, SourceInformation sourceInformation)
+  HIs.variable(
+      DartType typeExpression,
+      HInstruction expression,
+      HInstruction call,
+      AbstractValue type,
+      SourceInformation sourceInformation)
       : this.internal(typeExpression, [expression, call], VARIABLE_CHECK, type,
             sourceInformation);
 
   HIs.internal(this.typeExpression, List<HInstruction> inputs, this.kind,
-      TypeMask type, SourceInformation sourceInformation,
+      AbstractValue type, SourceInformation sourceInformation,
       {bool this.useInstanceOf: false})
       : super(inputs, type) {
     assert(kind >= RAW_CHECK && kind <= VARIABLE_CHECK);
@@ -3082,7 +3022,7 @@
 class HIsViaInterceptor extends HLateInstruction {
   final DartType typeExpression;
   HIsViaInterceptor(
-      this.typeExpression, HInstruction interceptor, TypeMask type)
+      this.typeExpression, HInstruction interceptor, AbstractValue type)
       : super(<HInstruction>[interceptor], type) {
     setUseGvn();
   }
@@ -3116,10 +3056,11 @@
   //
   final Selector receiverTypeCheckSelector;
 
-  TypeMask checkedType; // Not final because we refine it.
-  TypeMask inputType; // Holds input type for codegen after HTypeKnown removal.
+  AbstractValue checkedType; // Not final because we refine it.
+  AbstractValue
+      inputType; // Holds input type for codegen after HTypeKnown removal.
 
-  HTypeConversion(this.typeExpression, this.kind, TypeMask type,
+  HTypeConversion(this.typeExpression, this.kind, AbstractValue type,
       HInstruction input, SourceInformation sourceInformation,
       {this.receiverTypeCheckSelector})
       : checkedType = type,
@@ -3131,7 +3072,7 @@
   }
 
   HTypeConversion.withTypeRepresentation(this.typeExpression, this.kind,
-      TypeMask type, HInstruction input, HInstruction typeRepresentation)
+      AbstractValue type, HInstruction input, HInstruction typeRepresentation)
       : checkedType = type,
         receiverTypeCheckSelector = null,
         super(<HInstruction>[input, typeRepresentation], type) {
@@ -3139,8 +3080,8 @@
     sourceElement = input.sourceElement;
   }
 
-  HTypeConversion.viaMethodOnType(this.typeExpression, this.kind, TypeMask type,
-      HInstruction reifiedType, HInstruction input)
+  HTypeConversion.viaMethodOnType(this.typeExpression, this.kind,
+      AbstractValue type, HInstruction reifiedType, HInstruction input)
       : checkedType = type,
         receiverTypeCheckSelector = null,
         super(<HInstruction>[reifiedType, input], type) {
@@ -3203,16 +3144,16 @@
 
 /// The [HTypeKnown] instruction marks a value with a refined type.
 class HTypeKnown extends HCheck {
-  TypeMask knownType;
+  AbstractValue knownType;
   final bool _isMovable;
 
-  HTypeKnown.pinned(TypeMask knownType, HInstruction input)
+  HTypeKnown.pinned(AbstractValue knownType, HInstruction input)
       : this.knownType = knownType,
         this._isMovable = false,
         super(<HInstruction>[input], knownType);
 
   HTypeKnown.witnessed(
-      TypeMask knownType, HInstruction input, HInstruction witness)
+      AbstractValue knownType, HInstruction input, HInstruction witness)
       : this.knownType = knownType,
         this._isMovable = true,
         super(<HInstruction>[input, witness], knownType);
@@ -3222,7 +3163,7 @@
 
   bool isJsStatement() => false;
   bool isControlFlow() => false;
-  bool canThrow() => false;
+  bool canThrow(AbstractValueDomain domain) => false;
 
   bool get isPinned => inputs.length == 1;
 
@@ -3251,7 +3192,7 @@
 }
 
 class HStringConcat extends HInstruction {
-  HStringConcat(HInstruction left, HInstruction right, TypeMask type)
+  HStringConcat(HInstruction left, HInstruction right, AbstractValue type)
       : super(<HInstruction>[left, right], type) {
     // TODO(sra): Until Issue 9293 is fixed, this false dependency keeps the
     // concats bunched with stringified inputs for much better looking code with
@@ -3271,7 +3212,7 @@
  * into a String value.
  */
 class HStringify extends HInstruction {
-  HStringify(HInstruction input, TypeMask type)
+  HStringify(HInstruction input, AbstractValue type)
       : super(<HInstruction>[input], type) {
     sideEffects.setAllSideEffects();
     sideEffects.setDependsOnSomething();
@@ -3561,14 +3502,14 @@
 
 /// Reads raw reified type info from an object.
 class HTypeInfoReadRaw extends HInstruction {
-  HTypeInfoReadRaw(HInstruction receiver, TypeMask instructionType)
+  HTypeInfoReadRaw(HInstruction receiver, AbstractValue instructionType)
       : super(<HInstruction>[receiver], instructionType) {
     setUseGvn();
   }
 
   accept(HVisitor visitor) => visitor.visitTypeInfoReadRaw(this);
 
-  bool canThrow() => false;
+  bool canThrow(AbstractValueDomain domain) => false;
 
   int typeCode() => HInstruction.TYPE_INFO_READ_RAW_TYPECODE;
   bool typeEquals(HInstruction other) => other is HTypeInfoReadRaw;
@@ -3587,14 +3528,14 @@
   final bool isIntercepted;
 
   HTypeInfoReadVariable.intercepted(this.variable, HInstruction interceptor,
-      HInstruction receiver, TypeMask instructionType)
+      HInstruction receiver, AbstractValue instructionType)
       : isIntercepted = true,
         super(<HInstruction>[interceptor, receiver], instructionType) {
     setUseGvn();
   }
 
   HTypeInfoReadVariable.noInterceptor(
-      this.variable, HInstruction receiver, TypeMask instructionType)
+      this.variable, HInstruction receiver, AbstractValue instructionType)
       : isIntercepted = false,
         super(<HInstruction>[receiver], instructionType) {
     setUseGvn();
@@ -3609,7 +3550,7 @@
 
   accept(HVisitor visitor) => visitor.visitTypeInfoReadVariable(this);
 
-  bool canThrow() => false;
+  bool canThrow(AbstractValueDomain domain) => false;
 
   int typeCode() => HInstruction.TYPE_INFO_READ_VARIABLE_TYPECODE;
   bool typeEquals(HInstruction other) => other is HTypeInfoReadVariable;
@@ -3677,14 +3618,14 @@
   final TypeInfoExpressionKind kind;
   final DartType dartType;
   HTypeInfoExpression(this.kind, this.dartType, List<HInstruction> inputs,
-      TypeMask instructionType)
+      AbstractValue instructionType)
       : super(inputs, instructionType) {
     setUseGvn();
   }
 
   accept(HVisitor visitor) => visitor.visitTypeInfoExpression(this);
 
-  bool canThrow() => false;
+  bool canThrow(AbstractValueDomain domain) => false;
 
   int typeCode() => HInstruction.TYPE_INFO_EXPRESSION_TYPECODE;
   bool typeEquals(HInstruction other) => other is HTypeInfoExpression;
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index dd8bea5..170afb3 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -17,6 +17,7 @@
 import '../js_backend/runtime_types.dart';
 import '../native/native.dart' as native;
 import '../options.dart';
+import '../types/abstract_value_domain.dart';
 import '../types/types.dart';
 import '../universe/selector.dart' show Selector;
 import '../universe/side_effects.dart' show SideEffects;
@@ -88,12 +89,12 @@
         // Run a dead code eliminator before LICM because dead
         // interceptors are often in the way of LICM'able instructions.
         new SsaDeadCodeEliminator(closedWorld, this),
-        new SsaGlobalValueNumberer(),
+        new SsaGlobalValueNumberer(closedWorld.abstractValueDomain),
         // After GVN, some instructions might need their type to be
         // updated because they now have different inputs.
         new SsaTypePropagator(
             _results, _options, closedWorld.commonElements, closedWorld),
-        codeMotion = new SsaCodeMotion(),
+        codeMotion = new SsaCodeMotion(closedWorld.abstractValueDomain),
         loadElimination = new SsaLoadElimination(_compiler, closedWorld),
         new SsaRedundantPhiEliminator(),
         new SsaDeadPhiEliminator(),
@@ -126,8 +127,8 @@
         phases = <OptimizationPhase>[
           new SsaTypePropagator(
               _results, _options, closedWorld.commonElements, closedWorld),
-          new SsaGlobalValueNumberer(),
-          new SsaCodeMotion(),
+          new SsaGlobalValueNumberer(closedWorld.abstractValueDomain),
+          new SsaCodeMotion(closedWorld.abstractValueDomain),
           new SsaValueRangeAnalyzer(closedWorld, this),
           new SsaInstructionSimplifier(
               _results, _options, _rtiSubstitutions, closedWorld, registry),
@@ -163,7 +164,7 @@
   if (mask.containsOnly(closedWorld.commonElements.jsFixedArrayClass) ||
       mask.containsOnly(closedWorld.commonElements.jsUnmodifiableArrayClass) ||
       mask.containsOnlyString(closedWorld) ||
-      closedWorld.commonMasks.isTypedArray(mask)) {
+      closedWorld.abstractValueDomain.isTypedArray(mask)) {
     return true;
   }
   return false;
@@ -195,6 +196,9 @@
 
   ConstantSystem get constantSystem => _closedWorld.constantSystem;
 
+  AbstractValueDomain get _abstractValueDomain =>
+      _closedWorld.abstractValueDomain;
+
   NativeData get _nativeData => _closedWorld.nativeData;
 
   void visitGraph(HGraph visitee) {
@@ -215,12 +219,12 @@
         // might be that an operation thought to return double, can be
         // simplified to an int. For example:
         // `2.5 * 10`.
-        if (!(replacement.isNumberOrNull(_closedWorld) &&
-            instruction.isNumberOrNull(_closedWorld))) {
+        if (!(replacement.isNumberOrNull(_abstractValueDomain) &&
+            instruction.isNumberOrNull(_abstractValueDomain))) {
           // If we can replace [instruction] with [replacement], then
           // [replacement]'s type can be narrowed.
-          TypeMask newType = replacement.instructionType
-              .intersection(instruction.instructionType, _closedWorld);
+          TypeMask newType = _abstractValueDomain.intersection(
+              replacement.instructionType, instruction.instructionType);
           replacement.instructionType = newType;
         }
 
@@ -249,7 +253,8 @@
   }
 
   ConstantValue getConstantFromType(HInstruction node) {
-    if (node.isValue() && !node.canBeNull()) {
+    if (node.isValue(_abstractValueDomain) &&
+        !node.canBeNull(_abstractValueDomain)) {
       ValueTypeMask valueMask = node.instructionType;
       if (valueMask.value.isBool) {
         return valueMask.value;
@@ -299,13 +304,13 @@
     List<HInstruction> inputs = node.inputs;
     assert(inputs.length == 1);
     HInstruction input = inputs[0];
-    if (input.isBoolean(_closedWorld)) return input;
+    if (input.isBoolean(_abstractValueDomain)) return input;
 
     // If the code is unreachable, remove the HBoolify.  This can happen when
     // there is a throw expression in a short-circuit conditional.  Removing the
     // unreachable HBoolify makes it easier to reconstruct the short-circuit
     // operation.
-    if (input.instructionType.isEmpty) return input;
+    if (_abstractValueDomain.isEmpty(input.instructionType)) return input;
 
     // All values that cannot be 'true' are boolified to false.
     TypeMask mask = input.instructionType;
@@ -346,7 +351,7 @@
 
   HInstruction tryOptimizeLengthInterceptedGetter(HInvokeDynamic node) {
     HInstruction actualReceiver = node.inputs[1];
-    if (actualReceiver.isIndexablePrimitive(_closedWorld)) {
+    if (actualReceiver.isIndexablePrimitive(_abstractValueDomain)) {
       if (actualReceiver.isConstantString()) {
         HConstant constantInput = actualReceiver;
         StringConstantValue constant = constantInput.constant;
@@ -359,14 +364,14 @@
       bool isFixed =
           isFixedLength(actualReceiver.instructionType, _closedWorld);
       TypeMask actualType = node.instructionType;
-      TypeMask resultType = _closedWorld.commonMasks.positiveIntType;
+      TypeMask resultType = _abstractValueDomain.positiveIntType;
       // If we already have computed a more specific type, keep that type.
-      if (HInstruction.isInstanceOf(
-          actualType, commonElements.jsUInt31Class, _closedWorld)) {
-        resultType = _closedWorld.commonMasks.uint31Type;
-      } else if (HInstruction.isInstanceOf(
-          actualType, commonElements.jsUInt32Class, _closedWorld)) {
-        resultType = _closedWorld.commonMasks.uint32Type;
+      if (_abstractValueDomain.isInstanceOf(
+          actualType, commonElements.jsUInt31Class)) {
+        resultType = _abstractValueDomain.uint31Type;
+      } else if (_abstractValueDomain.isInstanceOf(
+          actualType, commonElements.jsUInt32Class)) {
+        resultType = _abstractValueDomain.uint32Type;
       }
       HGetLength result =
           new HGetLength(actualReceiver, resultType, isAssignable: !isFixed);
@@ -410,7 +415,7 @@
 
     if (selector.isCall || selector.isOperator) {
       FunctionEntity target;
-      if (input.isExtendableArray(_closedWorld)) {
+      if (input.isExtendableArray(_abstractValueDomain)) {
         if (applies(commonElements.jsArrayRemoveLast)) {
           target = commonElements.jsArrayRemoveLast;
         } else if (applies(commonElements.jsArrayAdd)) {
@@ -420,7 +425,7 @@
             target = commonElements.jsArrayAdd;
           }
         }
-      } else if (input.isStringOrNull(_closedWorld)) {
+      } else if (input.isStringOrNull(_abstractValueDomain)) {
         if (commonElements.appliesToJsStringSplit(
             selector, mask, _closedWorld)) {
           return handleStringSplit(node);
@@ -429,11 +434,12 @@
           // make sure the receiver and the argument are not null.
           // TODO(sra): Do this via [node.specializer].
           HInstruction argument = node.inputs[2];
-          if (argument.isString(_closedWorld) && !input.canBeNull()) {
+          if (argument.isString(_abstractValueDomain) &&
+              !input.canBeNull(_abstractValueDomain)) {
             return new HStringConcat(input, argument, node.instructionType);
           }
         } else if (applies(commonElements.jsStringToString) &&
-            !input.canBeNull()) {
+            !input.canBeNull(_abstractValueDomain)) {
           return input;
         }
       }
@@ -469,7 +475,7 @@
 
   HInstruction handleStringSplit(HInvokeDynamic node) {
     HInstruction argument = node.inputs[2];
-    if (!argument.isString(_closedWorld)) return node;
+    if (!argument.isString(_abstractValueDomain)) return node;
 
     // Replace `s.split$1(pattern)` with
     //
@@ -479,7 +485,7 @@
     //     t4 = setRuntimeTypeInfo(t1, t3);
     //
 
-    TypeMask resultMask = _closedWorld.commonMasks.growableListType;
+    TypeMask resultMask = _abstractValueDomain.growableListType;
 
     HInvokeDynamicMethod splitInstruction = new HInvokeDynamicMethod(
         node.selector,
@@ -490,7 +496,7 @@
         node.sourceInformation,
         isIntercepted: false)
       ..element = commonElements.jsStringSplit
-      ..isAllocation = true;
+      ..setAllocation(true);
 
     if (!_closedWorld.rtiNeed
         .classNeedsTypeArguments(commonElements.jsArrayClass)) {
@@ -503,7 +509,7 @@
         TypeInfoExpressionKind.COMPLETE,
         _closedWorld.elementEnvironment.getThisType(commonElements.stringClass),
         <HInstruction>[],
-        _closedWorld.commonMasks.dynamicType);
+        _abstractValueDomain.dynamicType);
     node.block.addBefore(node, stringTypeInfo);
 
     HInstruction typeInfo = new HTypeInfoExpression(
@@ -511,7 +517,7 @@
         _closedWorld.elementEnvironment
             .getThisType(commonElements.jsArrayClass),
         <HInstruction>[stringTypeInfo],
-        _closedWorld.commonMasks.dynamicType);
+        _abstractValueDomain.dynamicType);
     node.block.addBefore(node, typeInfo);
 
     HInvokeStatic tagInstruction = new HInvokeStatic(
@@ -522,7 +528,7 @@
     // 'Linear typing' trick: [tagInstruction] is the only use of the
     // [splitInstruction], so it becomes the sole alias.
     // TODO(sra): Build this knowledge into alias analysis.
-    tagInstruction.isAllocation = true;
+    tagInstruction.setAllocation(true);
 
     return tagInstruction;
   }
@@ -660,7 +666,7 @@
 
   HInstruction visitBoundsCheck(HBoundsCheck node) {
     HInstruction index = node.index;
-    if (index.isInteger(_closedWorld)) return node;
+    if (index.isInteger(_abstractValueDomain)) return node;
     if (index.isConstant()) {
       HConstant constantInstruction = index;
       assert(!constantInstruction.constant.isInt);
@@ -688,7 +694,8 @@
     HInstruction right = node.right;
     // We can only perform this rewriting on Integer, as it is not
     // valid for -0.0.
-    if (left.isInteger(_closedWorld) && right.isInteger(_closedWorld)) {
+    if (left.isInteger(_abstractValueDomain) &&
+        right.isInteger(_abstractValueDomain)) {
       if (left is HConstant && left.constant.isZero) return right;
       if (right is HConstant && right.constant.isZero) return left;
     }
@@ -698,7 +705,8 @@
   HInstruction visitMultiply(HMultiply node) {
     HInstruction left = node.left;
     HInstruction right = node.right;
-    if (left.isNumber(_closedWorld) && right.isNumber(_closedWorld)) {
+    if (left.isNumber(_abstractValueDomain) &&
+        right.isNumber(_abstractValueDomain)) {
       if (left is HConstant && left.constant.isOne) return right;
       if (right is HConstant && right.constant.isOne) return left;
     }
@@ -744,14 +752,15 @@
 
     // Intersection of int and double return conflicting, so
     // we don't optimize on numbers to preserve the runtime semantics.
-    if (!(left.isNumberOrNull(_closedWorld) &&
-        right.isNumberOrNull(_closedWorld))) {
+    if (!(left.isNumberOrNull(_abstractValueDomain) &&
+        right.isNumberOrNull(_abstractValueDomain))) {
       if (leftType.isDisjoint(rightType, _closedWorld)) {
         return makeFalse();
       }
     }
 
-    if (left.isNull() && right.isNull()) {
+    if (left.isNull(_abstractValueDomain) &&
+        right.isNull(_abstractValueDomain)) {
       return makeTrue();
     }
 
@@ -759,15 +768,15 @@
       if (constant.constant.isTrue) {
         return input;
       } else {
-        return new HNot(input, _closedWorld.commonMasks.boolType);
+        return new HNot(input, _abstractValueDomain.boolType);
       }
     }
 
-    if (left.isConstantBoolean() && right.isBoolean(_closedWorld)) {
+    if (left.isConstantBoolean() && right.isBoolean(_abstractValueDomain)) {
       return compareConstant(left, right);
     }
 
-    if (right.isConstantBoolean() && left.isBoolean(_closedWorld)) {
+    if (right.isConstantBoolean() && left.isBoolean(_abstractValueDomain)) {
       return compareConstant(right, left);
     }
 
@@ -776,8 +785,8 @@
       // dart2js runtime has not always been consistent with the Dart
       // specification (section 16.0.1), which makes distinctions on NaNs and
       // -0.0 that are hard to implement efficiently.
-      if (left.isIntegerOrNull(_closedWorld)) return makeTrue();
-      if (!left.canBePrimitiveNumber(_closedWorld)) return makeTrue();
+      if (left.isIntegerOrNull(_abstractValueDomain)) return makeTrue();
+      if (!left.canBePrimitiveNumber(_abstractValueDomain)) return makeTrue();
     }
 
     return null;
@@ -859,7 +868,7 @@
     InterfaceType interfaceType = type;
     ClassEntity element = interfaceType.element;
     HInstruction expression = node.expression;
-    if (expression.isInteger(_closedWorld)) {
+    if (expression.isInteger(_abstractValueDomain)) {
       if (element == commonElements.intClass ||
           element == commonElements.numClass ||
           commonElements.isNumberOrStringSupertype(element)) {
@@ -871,7 +880,7 @@
       } else {
         return _graph.addConstantBool(false, _closedWorld);
       }
-    } else if (expression.isDouble(_closedWorld)) {
+    } else if (expression.isDouble(_abstractValueDomain)) {
       if (element == commonElements.doubleClass ||
           element == commonElements.numClass ||
           commonElements.isNumberOrStringSupertype(element)) {
@@ -884,14 +893,14 @@
       } else {
         return _graph.addConstantBool(false, _closedWorld);
       }
-    } else if (expression.isNumber(_closedWorld)) {
+    } else if (expression.isNumber(_abstractValueDomain)) {
       if (element == commonElements.numClass) {
         return _graph.addConstantBool(true, _closedWorld);
       } else {
         // We cannot just return false, because the expression may be of
         // type int or double.
       }
-    } else if (expression.canBePrimitiveNumber(_closedWorld) &&
+    } else if (expression.canBePrimitiveNumber(_abstractValueDomain) &&
         element == commonElements.intClass) {
       // We let the JS semantics decide for that check.
       return node;
@@ -928,14 +937,14 @@
       if (type.isFutureOr) {
         HInstruction input = node.checkedInput;
         // `null` always passes type conversion.
-        if (input.isNull()) return input;
+        if (input.isNull(_abstractValueDomain)) return input;
         // TODO(johnniwinther): Optimize FutureOr type conversions.
         return node;
       }
       if (!type.treatAsRaw) {
         HInstruction input = node.checkedInput;
         // `null` always passes type conversion.
-        if (input.isNull()) return input;
+        if (input.isNull(_abstractValueDomain)) return input;
         // TODO(sra): We can statically check [input] if it is a constructor.
         // TODO(sra): We can statically check [input] if it is load from a field
         // of the same ground type, or load from a field of a parameterized type
@@ -945,7 +954,7 @@
       if (type.isFunctionType) {
         HInstruction input = node.checkedInput;
         // `null` always passes type conversion.
-        if (input.isNull()) return input;
+        if (input.isNull(_abstractValueDomain)) return input;
         // TODO(johnniwinther): Optimize function type conversions.
         // TODO(sra): We can statically check [input] if it is a closure getter.
         return node;
@@ -999,7 +1008,7 @@
       // should not be necessary but it currently makes it easier for
       // other optimizations to reason about a fixed length constructor
       // that we know takes an int.
-      if (receiver.inputs[0].isInteger(_closedWorld)) {
+      if (receiver.inputs[0].isInteger(_abstractValueDomain)) {
         return receiver.inputs[0];
       }
     } else if (receiver.isConstantList() || receiver.isConstantString()) {
@@ -1121,7 +1130,7 @@
         value = other;
       }
     }
-    return new HFieldSet(field, receiver, value);
+    return new HFieldSet(_abstractValueDomain, field, receiver, value);
   }
 
   HInstruction visitInvokeClosure(HInvokeClosure node) {
@@ -1151,8 +1160,8 @@
 
     if (element == commonElements.identicalFunction) {
       if (node.inputs.length == 2) {
-        return new HIdentity(node.inputs[0], node.inputs[1], null,
-            _closedWorld.commonMasks.boolType)
+        return new HIdentity(
+            node.inputs[0], node.inputs[1], null, _abstractValueDomain.boolType)
           ..sourceInformation = node.sourceInformation;
       }
     } else if (element == commonElements.setRuntimeTypeInfo) {
@@ -1170,17 +1179,17 @@
     } else if (commonElements.isCheckInt(element)) {
       if (node.inputs.length == 1) {
         HInstruction argument = node.inputs[0];
-        if (argument.isInteger(_closedWorld)) return argument;
+        if (argument.isInteger(_abstractValueDomain)) return argument;
       }
     } else if (commonElements.isCheckNum(element)) {
       if (node.inputs.length == 1) {
         HInstruction argument = node.inputs[0];
-        if (argument.isNumber(_closedWorld)) return argument;
+        if (argument.isNumber(_abstractValueDomain)) return argument;
       }
     } else if (commonElements.isCheckString(element)) {
       if (node.inputs.length == 1) {
         HInstruction argument = node.inputs[0];
-        if (argument.isString(_closedWorld)) return argument;
+        if (argument.isString(_abstractValueDomain)) return argument;
       }
     }
     return node;
@@ -1190,7 +1199,7 @@
     // If type information is not needed, use the raw Array.
     HInstruction source = node.inputs[0];
     if (source.usedBy.length != 1) return node;
-    if (!source.isArray(_closedWorld)) return node;
+    if (!source.isArray(_abstractValueDomain)) return node;
     for (HInstruction user in node.usedBy) {
       if (user is HGetLength) continue;
       if (user is HIndex) continue;
@@ -1263,13 +1272,12 @@
             .createString(leftString.stringValue + rightString.stringValue),
         _closedWorld);
     if (prefix == null) return folded;
-    return new HStringConcat(
-        prefix, folded, _closedWorld.commonMasks.stringType);
+    return new HStringConcat(prefix, folded, _abstractValueDomain.stringType);
   }
 
   HInstruction visitStringify(HStringify node) {
     HInstruction input = node.inputs[0];
-    if (input.isString(_closedWorld)) return input;
+    if (input.isString(_abstractValueDomain)) return input;
 
     HInstruction asString(String string) =>
         _graph.addConstant(constantSystem.createString(string), _closedWorld);
@@ -1305,8 +1313,8 @@
       // it directly. Keep the stringifier for primitives (since they have fast
       // path code in the stringifier) and for classes requiring interceptors
       // (since SsaInstructionSimplifier runs after SsaSimplifyInterceptors).
-      if (input.canBePrimitive(_closedWorld)) return null;
-      if (input.canBeNull()) return null;
+      if (input.canBePrimitive(_abstractValueDomain)) return null;
+      if (input.canBeNull(_abstractValueDomain)) return null;
       Selector selector = Selectors.toString_;
       TypeMask toStringType = TypeMaskFactory.inferredTypeForSelector(
           selector, input.instructionType, _globalInferenceResults);
@@ -1394,7 +1402,7 @@
       }
 
       if (source == null) return null;
-      return new HTypeInfoReadRaw(source, _closedWorld.commonMasks.dynamicType);
+      return new HTypeInfoReadRaw(source, _abstractValueDomain.dynamicType);
     }
 
     // TODO(sra): Consider fusing type expression trees with no type variables,
@@ -1418,7 +1426,7 @@
             TypeInfoExpressionKind.COMPLETE,
             typeArgument,
             const <HInstruction>[],
-            _closedWorld.commonMasks.dynamicType);
+            _abstractValueDomain.dynamicType);
         return replacement;
       }
       return node;
@@ -1450,7 +1458,7 @@
           TypeInfoExpressionKind.COMPLETE,
           type,
           arguments,
-          _closedWorld.commonMasks.dynamicType);
+          _abstractValueDomain.dynamicType);
       return replacement;
     }
 
@@ -1543,6 +1551,9 @@
 
   SsaCheckInserter(this.trustPrimitives, this.closedWorld, this.boundsChecked);
 
+  AbstractValueDomain get _abstractValueDomain =>
+      closedWorld.abstractValueDomain;
+
   void visitGraph(HGraph graph) {
     this.graph = graph;
 
@@ -1566,13 +1577,13 @@
   HBoundsCheck insertBoundsCheck(
       HInstruction indexNode, HInstruction array, HInstruction indexArgument) {
     HGetLength length = new HGetLength(
-        array, closedWorld.commonMasks.positiveIntType,
+        array, closedWorld.abstractValueDomain.positiveIntType,
         isAssignable: !isFixedLength(array.instructionType, closedWorld));
     indexNode.block.addBefore(indexNode, length);
 
-    TypeMask type = indexArgument.isPositiveInteger(closedWorld)
+    TypeMask type = indexArgument.isPositiveInteger(_abstractValueDomain)
         ? indexArgument.instructionType
-        : closedWorld.commonMasks.positiveIntType;
+        : closedWorld.abstractValueDomain.positiveIntType;
     HBoundsCheck check = new HBoundsCheck(indexArgument, length, array, type)
       ..sourceInformation = indexNode.sourceInformation;
     indexNode.block.addBefore(indexNode, check);
@@ -1583,7 +1594,7 @@
     // the index eg. if it is a constant.  The range information from the
     // BoundsCheck instruction is attached to the input directly by
     // visitBoundsCheck in the SsaValueRangeAnalyzer.
-    if (!indexArgument.isInteger(closedWorld)) {
+    if (!indexArgument.isInteger(_abstractValueDomain)) {
       indexArgument.replaceAllUsersDominatedBy(indexNode, check);
     }
     boundsChecked.add(indexNode);
@@ -1630,6 +1641,9 @@
 
   SsaDeadCodeEliminator(this.closedWorld, this.optimizer);
 
+  AbstractValueDomain get _abstractValueDomain =>
+      closedWorld.abstractValueDomain;
+
   HInstruction zapInstructionCache;
   HInstruction get zapInstruction {
     if (zapInstructionCache == null) {
@@ -1683,14 +1697,15 @@
     HInstruction current = instruction.next;
     do {
       if ((current.getDartReceiver(closedWorld) == receiver) &&
-          current.canThrow()) {
+          current.canThrow(_abstractValueDomain)) {
         return true;
       }
       if (current is HForeignCode &&
           templateThrowsNSMonNull(current, receiver)) {
         return true;
       }
-      if (current.canThrow() || current.sideEffects.hasSideEffects()) {
+      if (current.canThrow(_abstractValueDomain) ||
+          current.sideEffects.hasSideEffects()) {
         return false;
       }
       HInstruction next = current.next;
@@ -1734,8 +1749,8 @@
       return false;
     }
 
-    return instruction.isAllocation &&
-        instruction.isPure() &&
+    return instruction.isAllocation(_abstractValueDomain) &&
+        instruction.isPure(_abstractValueDomain) &&
         trivialDeadStoreReceivers.putIfAbsent(
             instruction, () => instruction.usedBy.every(isDeadUse));
   }
@@ -1749,12 +1764,12 @@
     if (!instruction.usedBy.isEmpty) return false;
     if (isTrivialDeadStore(instruction)) return true;
     if (instruction.sideEffects.hasSideEffects()) return false;
-    if (instruction.canThrow() &&
+    if (instruction.canThrow(_abstractValueDomain) &&
         instruction.onlyThrowsNSM() &&
         hasFollowingThrowingNSM(instruction)) {
       return true;
     }
-    return !instruction.canThrow() &&
+    return !instruction.canThrow(_abstractValueDomain) &&
         instruction is! HParameterValue &&
         instruction is! HLocalSet;
   }
@@ -1966,6 +1981,9 @@
 
   SsaLiveBlockAnalyzer(this.graph, this.closedWorld, this.optimizer);
 
+  AbstractValueDomain get _abstractValueDomain =>
+      closedWorld.abstractValueDomain;
+
   Map<HInstruction, Range> get ranges => optimizer.ranges;
 
   bool isDeadBlock(HBasicBlock block) => !live.contains(block);
@@ -2003,7 +2021,7 @@
   }
 
   void visitSwitch(HSwitch node) {
-    if (node.expression.isInteger(closedWorld)) {
+    if (node.expression.isInteger(_abstractValueDomain)) {
       Range switchRange = ranges[node.expression];
       if (switchRange != null &&
           switchRange.lower is IntValue &&
@@ -2149,13 +2167,14 @@
 }
 
 class SsaGlobalValueNumberer implements OptimizationPhase {
+  final AbstractValueDomain _abstractValueDomain;
   final String name = "SsaGlobalValueNumberer";
   final Set<int> visited;
 
   List<int> blockChangesFlags;
   List<int> loopChangesFlags;
 
-  SsaGlobalValueNumberer() : visited = new Set<int>();
+  SsaGlobalValueNumberer(this._abstractValueDomain) : visited = new Set<int>();
 
   void visitGraph(HGraph graph) {
     computeChangesFlags(graph);
@@ -2210,7 +2229,8 @@
       HInstruction next = instruction.next;
       if (instruction.useGvn() &&
           instruction.isMovable &&
-          (!instruction.canThrow() || firstInstructionInLoop) &&
+          (!instruction.canThrow(_abstractValueDomain) ||
+              firstInstructionInLoop) &&
           !instruction.sideEffects.dependsOn(dependsFlags)) {
         bool loopInvariantInputs = true;
         List<HInstruction> inputs = instruction.inputs;
@@ -2369,11 +2389,15 @@
 // these computed ValueSet. It moves all instructions of the
 // intersection into its own list of instructions.
 class SsaCodeMotion extends HBaseVisitor implements OptimizationPhase {
+  final AbstractValueDomain _abstractValueDomain;
+
   final String name = "SsaCodeMotion";
 
   bool movedCode = false;
   List<ValueSet> values;
 
+  SsaCodeMotion(this._abstractValueDomain);
+
   void visitGraph(HGraph graph) {
     values = new List<ValueSet>(graph.blocks.length);
     for (int i = 0; i < graph.blocks.length; i++) {
@@ -2434,7 +2458,7 @@
       // TODO(sra): We could move throwing instructions provided we keep the
       // exceptions in the same order.  This requires they are in the same order
       // in all successors, which is not tracked by the ValueSet.
-      if (current.canThrow()) continue;
+      if (current.canThrow(_abstractValueDomain)) continue;
       if (current.sideEffects.dependsOn(dependsFlags)) continue;
 
       bool canBeMoved = true;
@@ -2465,6 +2489,9 @@
 
   SsaTypeConversionInserter(this.closedWorld);
 
+  AbstractValueDomain get _abstractValueDomain =>
+      closedWorld.abstractValueDomain;
+
   void visitGraph(HGraph graph) {
     visitDominatorTree(graph);
   }
@@ -2537,7 +2564,7 @@
       return;
     }
 
-    if (!input.instructionType.isNullable) return;
+    if (!_abstractValueDomain.canBeNull(input.instructionType)) return;
 
     List<HBasicBlock> trueTargets = <HBasicBlock>[];
     List<HBasicBlock> falseTargets = <HBasicBlock>[];
@@ -2546,7 +2573,8 @@
 
     if (trueTargets.isEmpty && falseTargets.isEmpty) return;
 
-    TypeMask nonNullType = input.instructionType.nonNullable();
+    TypeMask nonNullType =
+        _abstractValueDomain.excludeNull(input.instructionType);
 
     for (HBasicBlock block in falseTargets) {
       insertTypePropagationForDominatedUsers(block, input, nonNullType);
@@ -2607,6 +2635,9 @@
 
   SsaLoadElimination(this.compiler, this.closedWorld);
 
+  AbstractValueDomain get _abstractValueDomain =>
+      closedWorld.abstractValueDomain;
+
   void visitGraph(HGraph graph) {
     memories = new List<MemorySet>(graph.blocks.length);
     List<HBasicBlock> blocks = graph.blocks;
@@ -2764,7 +2795,7 @@
   }
 
   void visitInstruction(HInstruction instruction) {
-    if (instruction.isAllocation) {
+    if (instruction.isAllocation(_abstractValueDomain)) {
       memorySet.registerAllocation(instruction);
     }
     memorySet.killAffectedBy(instruction);
@@ -2877,6 +2908,9 @@
 
   MemorySet(this.closedWorld);
 
+  AbstractValueDomain get _abstractValueDomain =>
+      closedWorld.abstractValueDomain;
+
   /// Returns whether [first] and [second] always alias to the same object.
   bool mustAlias(HInstruction first, HInstruction second) {
     return first == second;
@@ -2890,8 +2924,8 @@
     if (nonEscapingReceivers.contains(second)) return false;
     // Typed arrays of different types might have a shared buffer.
     if (couldBeTypedArray(first) && couldBeTypedArray(second)) return true;
-    return !first.instructionType
-        .isDisjoint(second.instructionType, closedWorld);
+    return !_abstractValueDomain.areDisjoint(
+        first.instructionType, second.instructionType);
   }
 
   bool isFinal(Object element) {
@@ -2905,7 +2939,8 @@
   }
 
   bool couldBeTypedArray(HInstruction receiver) {
-    return closedWorld.commonMasks.couldBeTypedArray(receiver.instructionType);
+    return closedWorld.abstractValueDomain
+        .couldBeTypedArray(receiver.instructionType);
   }
 
   /// Returns whether [receiver] escapes the current function.
@@ -3090,8 +3125,8 @@
         }
       }
     }
-    TypeMask phiType =
-        second.instructionType.union(first.instructionType, closedWorld);
+    TypeMask phiType = _abstractValueDomain.union(
+        second.instructionType, first.instructionType);
     if (first is HPhi && first.block == block) {
       HPhi phi = first;
       phi.addInput(second);
diff --git a/pkg/compiler/lib/src/ssa/ssa_branch_builder.dart b/pkg/compiler/lib/src/ssa/ssa_branch_builder.dart
index 537fd50..f628a1e 100644
--- a/pkg/compiler/lib/src/ssa/ssa_branch_builder.dart
+++ b/pkg/compiler/lib/src/ssa/ssa_branch_builder.dart
@@ -42,7 +42,8 @@
     checkNotAborted();
     assert(identical(builder.current, builder.lastOpenedBlock));
     HInstruction conditionValue = builder.popBoolified();
-    HIf branch = new HIf(conditionValue)..sourceInformation = sourceInformation;
+    HIf branch = new HIf(builder.abstractValueDomain, conditionValue)
+      ..sourceInformation = sourceInformation;
     HBasicBlock conditionExitBlock = builder.current;
     builder.close(branch);
     conditionBranch.exitLocals = builder.localsHandler;
diff --git a/pkg/compiler/lib/src/ssa/ssa_tracer.dart b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
index 02bdb6b..f7956fb 100644
--- a/pkg/compiler/lib/src/ssa/ssa_tracer.dart
+++ b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
@@ -7,6 +7,7 @@
 import '../../compiler_new.dart' show OutputSink;
 import '../diagnostics/invariant.dart' show DEBUG_MODE;
 import '../js_backend/namer.dart' show Namer;
+import '../types/abstract_value_domain.dart';
 import '../tracer.dart';
 import '../world.dart' show ClosedWorld;
 import 'nodes.dart';
@@ -118,35 +119,38 @@
 
   HInstructionStringifier(this.currentBlock, this.closedWorld, this.namer);
 
+  AbstractValueDomain get _abstractValueDomain =>
+      closedWorld.abstractValueDomain;
+
   visit(HInstruction node) => '${node.accept(this)} ${node.instructionType}';
 
   String temporaryId(HInstruction instruction) {
     String prefix;
-    if (instruction.isNull()) {
+    if (instruction.isNull(_abstractValueDomain)) {
       prefix = 'u';
-    } else if (instruction.isConflicting()) {
+    } else if (instruction.isConflicting(_abstractValueDomain)) {
       prefix = 'c';
-    } else if (instruction.isExtendableArray(closedWorld)) {
+    } else if (instruction.isExtendableArray(_abstractValueDomain)) {
       prefix = 'e';
-    } else if (instruction.isFixedArray(closedWorld)) {
+    } else if (instruction.isFixedArray(_abstractValueDomain)) {
       prefix = 'f';
-    } else if (instruction.isMutableArray(closedWorld)) {
+    } else if (instruction.isMutableArray(_abstractValueDomain)) {
       prefix = 'm';
-    } else if (instruction.isReadableArray(closedWorld)) {
+    } else if (instruction.isArray(_abstractValueDomain)) {
       prefix = 'a';
-    } else if (instruction.isString(closedWorld)) {
+    } else if (instruction.isString(_abstractValueDomain)) {
       prefix = 's';
-    } else if (instruction.isIndexablePrimitive(closedWorld)) {
+    } else if (instruction.isIndexablePrimitive(_abstractValueDomain)) {
       prefix = 'r';
-    } else if (instruction.isBoolean(closedWorld)) {
+    } else if (instruction.isBoolean(_abstractValueDomain)) {
       prefix = 'b';
-    } else if (instruction.isInteger(closedWorld)) {
+    } else if (instruction.isInteger(_abstractValueDomain)) {
       prefix = 'i';
-    } else if (instruction.isDouble(closedWorld)) {
+    } else if (instruction.isDouble(_abstractValueDomain)) {
       prefix = 'd';
-    } else if (instruction.isNumber(closedWorld)) {
+    } else if (instruction.isNumber(_abstractValueDomain)) {
       prefix = 'n';
-    } else if (instruction.instructionType.containsAll(closedWorld)) {
+    } else if (_abstractValueDomain.containsAll(instruction.instructionType)) {
       prefix = 'v';
     } else {
       prefix = 'U';
diff --git a/pkg/compiler/lib/src/ssa/types.dart b/pkg/compiler/lib/src/ssa/types.dart
index d973ef6..d93488d 100644
--- a/pkg/compiler/lib/src/ssa/types.dart
+++ b/pkg/compiler/lib/src/ssa/types.dart
@@ -13,30 +13,30 @@
   static TypeMask inferredReturnTypeForElement(
       FunctionEntity element, GlobalTypeInferenceResults results) {
     return results.resultOfMember(element).returnType ??
-        results.closedWorld.commonMasks.dynamicType;
+        results.closedWorld.abstractValueDomain.dynamicType;
   }
 
   static TypeMask inferredTypeForMember(
       MemberEntity element, GlobalTypeInferenceResults results) {
     return results.resultOfMember(element).type ??
-        results.closedWorld.commonMasks.dynamicType;
+        results.closedWorld.abstractValueDomain.dynamicType;
   }
 
   static TypeMask inferredTypeForParameter(
       Local element, GlobalTypeInferenceResults results) {
     return results.resultOfParameter(element).type ??
-        results.closedWorld.commonMasks.dynamicType;
+        results.closedWorld.abstractValueDomain.dynamicType;
   }
 
   static TypeMask inferredTypeForSelector(
       Selector selector, TypeMask mask, GlobalTypeInferenceResults results) {
     return results.typeOfSelector(selector, mask) ??
-        results.closedWorld.commonMasks.dynamicType;
+        results.closedWorld.abstractValueDomain.dynamicType;
   }
 
   static TypeMask fromNativeBehavior(
       native.NativeBehavior nativeBehavior, ClosedWorld closedWorld) {
-    CommonMasks commonMasks = closedWorld.commonMasks;
+    CommonMasks commonMasks = closedWorld.abstractValueDomain;
     var typesReturned = nativeBehavior.typesReturned;
     if (typesReturned.isEmpty) return commonMasks.dynamicType;
 
diff --git a/pkg/compiler/lib/src/ssa/types_propagation.dart b/pkg/compiler/lib/src/ssa/types_propagation.dart
index 1d4a182..f5e50bb 100644
--- a/pkg/compiler/lib/src/ssa/types_propagation.dart
+++ b/pkg/compiler/lib/src/ssa/types_propagation.dart
@@ -5,6 +5,7 @@
 import '../common_elements.dart' show CommonElements;
 import '../elements/entities.dart';
 import '../options.dart';
+import '../types/abstract_value_domain.dart';
 import '../types/types.dart';
 import '../universe/selector.dart' show Selector;
 import '../world.dart' show ClosedWorld;
@@ -42,6 +43,9 @@
   SsaTypePropagator(
       this.results, this.options, this.commonElements, this.closedWorld);
 
+  AbstractValueDomain get abstractValueDomain =>
+      closedWorld.abstractValueDomain;
+
   TypeMask computeType(HInstruction instruction) {
     return instruction.accept(this);
   }
@@ -125,21 +129,22 @@
   TypeMask visitBinaryArithmetic(HBinaryArithmetic instruction) {
     HInstruction left = instruction.left;
     HInstruction right = instruction.right;
-    if (left.isInteger(closedWorld) && right.isInteger(closedWorld)) {
-      return closedWorld.commonMasks.intType;
+    if (left.isInteger(closedWorld.abstractValueDomain) &&
+        right.isInteger(closedWorld.abstractValueDomain)) {
+      return closedWorld.abstractValueDomain.intType;
     }
-    if (left.isDouble(closedWorld)) {
-      return closedWorld.commonMasks.doubleType;
+    if (left.isDouble(closedWorld.abstractValueDomain)) {
+      return closedWorld.abstractValueDomain.doubleType;
     }
-    return closedWorld.commonMasks.numType;
+    return closedWorld.abstractValueDomain.numType;
   }
 
   TypeMask checkPositiveInteger(HBinaryArithmetic instruction) {
     HInstruction left = instruction.left;
     HInstruction right = instruction.right;
-    if (left.isPositiveInteger(closedWorld) &&
-        right.isPositiveInteger(closedWorld)) {
-      return closedWorld.commonMasks.positiveIntType;
+    if (left.isPositiveInteger(closedWorld.abstractValueDomain) &&
+        right.isPositiveInteger(closedWorld.abstractValueDomain)) {
+      return closedWorld.abstractValueDomain.positiveIntType;
     }
     return visitBinaryArithmetic(instruction);
   }
@@ -171,8 +176,8 @@
     HInstruction operand = instruction.operand;
     // We have integer subclasses that represent ranges, so widen any int
     // subclass to full integer.
-    if (operand.isInteger(closedWorld)) {
-      return closedWorld.commonMasks.intType;
+    if (operand.isInteger(closedWorld.abstractValueDomain)) {
+      return closedWorld.abstractValueDomain.intType;
     }
     return instruction.operand.instructionType;
   }
@@ -188,7 +193,7 @@
   }
 
   TypeMask visitPhi(HPhi phi) {
-    TypeMask candidateType = closedWorld.commonMasks.emptyType;
+    TypeMask candidateType = closedWorld.abstractValueDomain.emptyType;
     for (int i = 0, length = phi.inputs.length; i < length; i++) {
       TypeMask inputType = phi.inputs[i].instructionType;
       candidateType = candidateType.union(inputType, closedWorld);
@@ -206,11 +211,11 @@
       // We only do an int check if the input is integer or null.
       if (checkedType.containsOnlyNum(closedWorld) &&
           !checkedType.containsOnlyDouble(closedWorld) &&
-          input.isIntegerOrNull(closedWorld)) {
-        instruction.checkedType = closedWorld.commonMasks.intType;
+          input.isIntegerOrNull(closedWorld.abstractValueDomain)) {
+        instruction.checkedType = closedWorld.abstractValueDomain.intType;
       } else if (checkedType.containsOnlyInt(closedWorld) &&
-          !input.isIntegerOrNull(closedWorld)) {
-        instruction.checkedType = closedWorld.commonMasks.numType;
+          !input.isIntegerOrNull(closedWorld.abstractValueDomain)) {
+        instruction.checkedType = closedWorld.abstractValueDomain.numType;
       }
     }
 
@@ -224,9 +229,10 @@
       if (inputType.containsOnlyInt(closedWorld) &&
           checkedType.containsOnlyDouble(closedWorld)) {
         if (inputType.isNullable && checkedType.isNullable) {
-          outputType = closedWorld.commonMasks.doubleType.nullable();
+          outputType =
+              abstractValueDomain.includeNull(abstractValueDomain.doubleType);
         } else {
-          outputType = closedWorld.commonMasks.doubleType;
+          outputType = abstractValueDomain.doubleType;
         }
       }
     }
@@ -252,7 +258,7 @@
     HInstruction input = instruction.checkedInput;
     TypeMask inputType = input.instructionType;
     TypeMask outputType =
-        instruction.knownType.intersection(inputType, closedWorld);
+        abstractValueDomain.intersection(instruction.knownType, inputType);
     if (inputType != outputType) {
       input.replaceAllUsersDominatedBy(instruction.next, instruction);
     }
@@ -279,7 +285,7 @@
       // If the instruction's type is integer or null, the codegen
       // will emit a null check, which is enough to know if it will
       // hit a noSuchMethod.
-      return instruction.isIntegerOrNull(closedWorld);
+      return instruction.isIntegerOrNull(closedWorld.abstractValueDomain);
     }
     return true;
   }
@@ -290,12 +296,12 @@
   bool checkReceiver(HInvokeDynamic instruction) {
     assert(instruction.isInterceptedCall);
     HInstruction receiver = instruction.inputs[1];
-    if (receiver.isNumber(closedWorld)) return false;
-    if (receiver.isNumberOrNull(closedWorld)) {
+    if (receiver.isNumber(closedWorld.abstractValueDomain)) return false;
+    if (receiver.isNumberOrNull(closedWorld.abstractValueDomain)) {
       convertInput(
           instruction,
           receiver,
-          receiver.instructionType.nonNullable(),
+          closedWorld.abstractValueDomain.excludeNull(receiver.instructionType),
           HTypeConversion.RECEIVER_TYPE_CHECK);
       return true;
     } else if (instruction.element == null) {
@@ -334,11 +340,11 @@
     HInstruction right = instruction.inputs[2];
 
     Selector selector = instruction.selector;
-    if (selector.isOperator && left.isNumber(closedWorld)) {
-      if (right.isNumber(closedWorld)) return false;
-      TypeMask type = right.isIntegerOrNull(closedWorld)
-          ? right.instructionType.nonNullable()
-          : closedWorld.commonMasks.numType;
+    if (selector.isOperator && left.isNumber(closedWorld.abstractValueDomain)) {
+      if (right.isNumber(closedWorld.abstractValueDomain)) return false;
+      TypeMask type = right.isIntegerOrNull(closedWorld.abstractValueDomain)
+          ? closedWorld.abstractValueDomain.excludeNull(right.instructionType)
+          : closedWorld.abstractValueDomain.numType;
       // TODO(ngeoffray): Some number operations don't have a builtin
       // variant and will do the check in their method anyway. We
       // still add a check because it allows to GVN these operations,
diff --git a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
index 1be4244f..97b75ff 100644
--- a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
+++ b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
@@ -633,7 +633,7 @@
   void visitBasicBlock(HBasicBlock block) {
     void visit(HInstruction instruction) {
       Range range = instruction.accept(this);
-      if (instruction.isInteger(closedWorld)) {
+      if (instruction.isInteger(closedWorld.abstractValueDomain)) {
         assert(range != null);
         ranges[instruction] = range;
       }
@@ -644,10 +644,10 @@
   }
 
   Range visitInstruction(HInstruction instruction) {
-    if (instruction.isPositiveInteger(closedWorld)) {
+    if (instruction.isPositiveInteger(closedWorld.abstractValueDomain)) {
       return info.newNormalizedRange(
           info.intZero, info.newPositiveValue(instruction));
-    } else if (instruction.isInteger(closedWorld)) {
+    } else if (instruction.isInteger(closedWorld.abstractValueDomain)) {
       InstructionValue value = info.newInstructionValue(instruction);
       return info.newNormalizedRange(value, value);
     } else {
@@ -656,12 +656,13 @@
   }
 
   Range visitPhi(HPhi phi) {
-    if (!phi.isInteger(closedWorld)) return info.newUnboundRange();
+    if (!phi.isInteger(closedWorld.abstractValueDomain))
+      return info.newUnboundRange();
     // Some phases may replace instructions that change the inputs of
     // this phi. Only the [SsaTypesPropagation] phase will update the
     // phi type. Play it safe by assuming the [SsaTypesPropagation]
     // phase is not necessarily run before the [ValueRangeAnalyzer].
-    if (phi.inputs.any((i) => !i.isInteger(closedWorld))) {
+    if (phi.inputs.any((i) => !i.isInteger(closedWorld.abstractValueDomain))) {
       return info.newUnboundRange();
     }
     if (phi.block.isLoopHeader()) {
@@ -679,7 +680,8 @@
   }
 
   Range visitConstant(HConstant hConstant) {
-    if (!hConstant.isInteger(closedWorld)) return info.newUnboundRange();
+    if (!hConstant.isInteger(closedWorld.abstractValueDomain))
+      return info.newUnboundRange();
     ConstantValue constant = hConstant.constant;
     NumConstantValue constantNum;
     if (constant is DeferredConstantValue) {
@@ -721,7 +723,7 @@
     Range lengthRange = ranges[check.length];
     if (indexRange == null) {
       indexRange = info.newUnboundRange();
-      assert(!check.index.isInteger(closedWorld));
+      assert(!check.index.isInteger(closedWorld.abstractValueDomain));
     }
     if (lengthRange == null) {
       // We might have lost the length range due to a type conversion that
@@ -729,7 +731,7 @@
       // get to this point anyway, so no need to try and refine ranges.
       return indexRange;
     }
-    assert(check.length.isInteger(closedWorld));
+    assert(check.length.isInteger(closedWorld.abstractValueDomain));
 
     // Check if the index is strictly below the upper bound of the length
     // range.
@@ -782,8 +784,10 @@
   Range visitRelational(HRelational relational) {
     HInstruction right = relational.right;
     HInstruction left = relational.left;
-    if (!left.isInteger(closedWorld)) return info.newUnboundRange();
-    if (!right.isInteger(closedWorld)) return info.newUnboundRange();
+    if (!left.isInteger(closedWorld.abstractValueDomain))
+      return info.newUnboundRange();
+    if (!right.isInteger(closedWorld.abstractValueDomain))
+      return info.newUnboundRange();
     BinaryOperation operation = relational.operation(constantSystem);
     Range rightRange = ranges[relational.right];
     Range leftRange = ranges[relational.left];
@@ -818,7 +822,8 @@
     if (divisor != null) {
       // For Integer values we can be precise in the upper bound, so special
       // case those.
-      if (left.isInteger(closedWorld) && right.isInteger(closedWorld)) {
+      if (left.isInteger(closedWorld.abstractValueDomain) &&
+          right.isInteger(closedWorld.abstractValueDomain)) {
         if (divisor.isPositive) {
           return info.newNormalizedRange(
               info.intZero, divisor.upper - info.intOne);
@@ -826,7 +831,8 @@
           return info.newNormalizedRange(
               info.intZero, info.newNegateValue(divisor.lower) - info.intOne);
         }
-      } else if (left.isNumber(closedWorld) && right.isNumber(closedWorld)) {
+      } else if (left.isNumber(closedWorld.abstractValueDomain) &&
+          right.isNumber(closedWorld.abstractValueDomain)) {
         if (divisor.isPositive) {
           return info.newNormalizedRange(info.intZero, divisor.upper);
         } else if (divisor.isNegative) {
@@ -844,16 +850,18 @@
     Range dividend = ranges[left];
     // If both operands are >=0, the result is >= 0 and bounded by the divisor.
     if ((dividend != null && dividend.isPositive) ||
-        left.isPositiveInteger(closedWorld)) {
+        left.isPositiveInteger(closedWorld.abstractValueDomain)) {
       Range divisor = ranges[right];
       if (divisor != null) {
         if (divisor.isPositive) {
           // For Integer values we can be precise in the upper bound.
-          if (left.isInteger(closedWorld) && right.isInteger(closedWorld)) {
+          if (left.isInteger(closedWorld.abstractValueDomain) &&
+              right.isInteger(closedWorld.abstractValueDomain)) {
             return info.newNormalizedRange(
                 info.intZero, divisor.upper - info.intOne);
           }
-          if (left.isNumber(closedWorld) && right.isNumber(closedWorld)) {
+          if (left.isNumber(closedWorld.abstractValueDomain) &&
+              right.isNumber(closedWorld.abstractValueDomain)) {
             return info.newNormalizedRange(info.intZero, divisor.upper);
           }
         }
@@ -869,7 +877,9 @@
   }
 
   Range handleBinaryOperation(HBinaryArithmetic instruction) {
-    if (!instruction.isInteger(closedWorld)) return info.newUnboundRange();
+    if (!instruction.isInteger(closedWorld.abstractValueDomain)) {
+      return info.newUnboundRange();
+    }
     return instruction
         .operation(constantSystem)
         .apply(ranges[instruction.left], ranges[instruction.right]);
@@ -884,10 +894,13 @@
   }
 
   Range visitBitAnd(HBitAnd node) {
-    if (!node.isInteger(closedWorld)) return info.newUnboundRange();
+    if (!node.isInteger(closedWorld.abstractValueDomain)) {
+      return info.newUnboundRange();
+    }
     HInstruction right = node.right;
     HInstruction left = node.left;
-    if (left.isInteger(closedWorld) && right.isInteger(closedWorld)) {
+    if (left.isInteger(closedWorld.abstractValueDomain) &&
+        right.isInteger(closedWorld.abstractValueDomain)) {
       return ranges[left] & ranges[right];
     }
 
@@ -901,9 +914,9 @@
       return info.newUnboundRange();
     }
 
-    if (left.isInteger(closedWorld)) {
+    if (left.isInteger(closedWorld.abstractValueDomain)) {
       return tryComputeRange(left);
-    } else if (right.isInteger(closedWorld)) {
+    } else if (right.isInteger(closedWorld.abstractValueDomain)) {
       return tryComputeRange(right);
     }
     return info.newUnboundRange();
@@ -918,8 +931,8 @@
 
   HInstruction createRangeConversion(
       HInstruction cursor, HInstruction instruction) {
-    HRangeConversion newInstruction =
-        new HRangeConversion(instruction, closedWorld.commonMasks.intType);
+    HRangeConversion newInstruction = new HRangeConversion(
+        instruction, closedWorld.abstractValueDomain.intType);
     conversions.add(newInstruction);
     cursor.block.addBefore(cursor, newInstruction);
     // Update the users of the instruction dominated by [cursor] to
@@ -982,8 +995,12 @@
     if (condition is HIdentity) return info.newUnboundRange();
     HInstruction right = condition.right;
     HInstruction left = condition.left;
-    if (!left.isInteger(closedWorld)) return info.newUnboundRange();
-    if (!right.isInteger(closedWorld)) return info.newUnboundRange();
+    if (!left.isInteger(closedWorld.abstractValueDomain)) {
+      return info.newUnboundRange();
+    }
+    if (!right.isInteger(closedWorld.abstractValueDomain)) {
+      return info.newUnboundRange();
+    }
 
     Range rightRange = ranges[right];
     Range leftRange = ranges[left];
@@ -1073,7 +1090,7 @@
   }
 
   Range visit(HInstruction instruction) {
-    if (!instruction.isInteger(closedWorld)) return null;
+    if (!instruction.isInteger(closedWorld.abstractValueDomain)) return null;
     if (ranges[instruction] != null) return ranges[instruction];
     return instruction.accept(this);
   }
diff --git a/pkg/compiler/lib/src/types/abstract_value_domain.dart b/pkg/compiler/lib/src/types/abstract_value_domain.dart
index 287cd2e..3ce4ce1 100644
--- a/pkg/compiler/lib/src/types/abstract_value_domain.dart
+++ b/pkg/compiler/lib/src/types/abstract_value_domain.dart
@@ -4,166 +4,243 @@
 
 library dart2js.abstract_value_domain;
 
-import '../constants/values.dart';
-import '../elements/resolution_types.dart';
-import '../elements/elements.dart';
-import '../universe/selector.dart' show Selector;
-
-enum AbstractBool { True, False, Maybe, Nothing }
+import '../constants/values.dart' show ConstantValue;
+import '../elements/entities.dart';
 
 /// A value in an abstraction of runtime values.
 abstract class AbstractValue {}
 
-/// A system that implements an abstraction over runtime values and provides
-/// access to interprocedural analysis results.
-// TODO(johnniwinther): Consider extracting the inference result access from
-// this interface.
+/// A system that implements an abstraction over runtime values.
 abstract class AbstractValueDomain {
+  /// The [AbstractValue] that represents an unknown runtime value.
   AbstractValue get dynamicType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `Type` at
+  /// runtime.
   AbstractValue get typeType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `Function` at
+  /// runtime.
   AbstractValue get functionType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `bool` at
+  /// runtime.
   AbstractValue get boolType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `int` at
+  /// runtime.
   AbstractValue get intType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `double` at
+  /// runtime.
   AbstractValue get doubleType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `num` at
+  /// runtime.
   AbstractValue get numType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `String` at
+  /// runtime.
   AbstractValue get stringType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `List` at
+  /// runtime.
   AbstractValue get listType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `Map` at
+  /// runtime.
   AbstractValue get mapType;
+
+  /// The [AbstractValue] that represents a non-null value at runtime.
   AbstractValue get nonNullType;
+
+  /// The [AbstractValue] that represents the `null` at runtime.
   AbstractValue get nullType;
-  AbstractValue get extendableArrayType;
+
+  /// The [AbstractValue] that represents a non-null growable JavaScript array
+  /// at runtime.
+  AbstractValue get growableListType;
+
+  /// The [AbstractValue] that represents a non-null fixed size JavaScript array
+  /// at runtime.
   AbstractValue get fixedArrayType;
-  AbstractValue get arrayType;
+
+  /// The [AbstractValue] that represents a non-null 31-bit unsigned integer at
+  /// runtime.
   AbstractValue get uint31Type;
+
+  /// The [AbstractValue] that represents a non-null 32-bit unsigned integer at
+  /// runtime.
   AbstractValue get uint32Type;
-  AbstractValue get uintType;
 
-  AbstractValue get numStringBoolType;
+  /// The [AbstractValue] that represents a non-null unsigned integer at
+  /// runtime.
+  AbstractValue get positiveIntType;
 
-  AbstractValue get fixedLengthType;
+  /// The [AbstractValue] that represents a non-null constant list literal at
+  /// runtime.
+  AbstractValue get constListType;
 
-  AbstractValue get interceptorType;
+  /// The [AbstractValue] that represents a non-null constant map literal at
+  /// runtime.
+  AbstractValue get constMapType;
 
-  AbstractValue get interceptedTypes;
+  /// The [AbstractValue] that represents the empty set of runtime values.
+  AbstractValue get emptyType;
 
-  /// If true, [function] ignores its explicit receiver argument and will use
-  /// its `this` value instead.
-  bool methodIgnoresReceiverArgument(FunctionElement function);
+  /// Creates an [AbstractValue] for non-null exact instance of [cls].
+  AbstractValue createNonNullExact(ClassEntity cls);
 
-  /// If true, the explicit receiver argument can be ignored when invoking
-  /// [selector] on a value of [type].
-  bool targetIgnoresReceiverArgument(AbstractValue type, Selector selector);
+  /// Creates an [AbstractValue] for non-null instance that implements [cls].
+  AbstractValue createNonNullSubtype(ClassEntity cls);
 
-  Element locateSingleElement(AbstractValue mask, Selector selector);
+  AbstractValue createNullableSubtype(ClassEntity cls);
 
-  ClassElement singleClass(AbstractValue mask);
+  /// Returns `true` if [value] is a native typed array or `null` at runtime.
+  bool isTypedArray(covariant AbstractValue value);
 
-  bool needsNoSuchMethodHandling(AbstractValue mask, Selector selector);
+  /// Returns `true` if [value] could be a native typed array at runtime.
+  bool couldBeTypedArray(covariant AbstractValue value);
 
-  AbstractValue getReceiverType(MethodElement method);
+  /// Returns the version of the abstract [value] that excludes `null`.
+  AbstractValue excludeNull(covariant AbstractValue value);
 
-  AbstractValue getParameterType(ParameterElement parameter);
+  /// Returns the version of the abstract [value] that includes `null`.
+  AbstractValue includeNull(covariant AbstractValue value);
 
-  AbstractValue getReturnType(FunctionElement function);
+  /// Returns `true` if [value] contains instances of [cls] at runtime.
+  bool containsType(covariant AbstractValue value, ClassEntity cls);
 
-  AbstractValue getInvokeReturnType(Selector selector, AbstractValue mask);
+  /// Returns `true` if [value] only contains subtypes of [cls] or `null` at
+  /// runtime.
+  bool containsOnlyType(covariant AbstractValue value, ClassEntity cls);
 
-  AbstractValue getFieldType(FieldElement field);
+  /// Returns `true` if [value] is an instance of [cls] or `null` at runtime.
+  bool isInstanceOf(covariant AbstractValue value, ClassEntity cls);
 
-  AbstractValue join(AbstractValue a, AbstractValue b);
+  /// Returns `true` if [value] is empty set of runtime values.
+  bool isEmpty(covariant AbstractValue value);
 
-  AbstractValue intersection(AbstractValue a, AbstractValue b);
+  /// Returns `true` if [value] is an exact class or `null` at runtime.
+  bool isExact(covariant AbstractValue value);
 
-  AbstractValue getTypeOf(ConstantValue constant);
+  /// Returns `true` if [value] a known primitive JavaScript value at runtime.
+  bool isValue(covariant AbstractValue value);
 
-  /// Returns the constant value if the [AbstractValue] represents a single
-  /// constant value. Returns `null` if [value] is not a constant.
-  ConstantValue getConstantOf(AbstractValue value);
+  /// Returns `true` if [value] can be `null` at runtime.
+  bool canBeNull(covariant AbstractValue value);
 
-  AbstractValue nonNullExact(ClassElement element);
+  /// Returns `true` if [value] is `null` at runtime.
+  bool isNull(covariant AbstractValue value);
 
-  AbstractValue nonNullSubclass(ClassElement element);
+  /// Returns `true` if [value] could be a JavaScript bool, number, string,
+  /// array or `null` at runtime.
+  bool canBePrimitive(covariant AbstractValue value);
 
-  AbstractValue nonNullSubtype(ClassElement element);
+  /// Returns `true` if [value] could be a JavaScript number at runtime.
+  bool canBePrimitiveNumber(covariant AbstractValue value);
 
-  bool isDefinitelyBool(AbstractValue t, {bool allowNull: false});
+  /// Returns `true` if [value] could be a JavaScript bool at runtime.
+  bool canBePrimitiveBoolean(covariant AbstractValue value);
 
-  bool isDefinitelyNum(AbstractValue t, {bool allowNull: false});
+  /// Returns `true` if [value] could be a JavaScript array at runtime.
+  bool canBePrimitiveArray(covariant AbstractValue value);
 
-  bool isDefinitelyString(AbstractValue t, {bool allowNull: false});
+  /// Returns `true` if [value] is a JavaScript string, array, native HTML list
+  /// or `null` at runtime.
+  bool isIndexablePrimitive(covariant AbstractValue value);
 
-  bool isDefinitelyNumStringBool(AbstractValue t, {bool allowNull: false});
+  /// Returns `true` if [value] is a fixed-size or constant JavaScript array or
+  /// `null` at
+  /// runtime.
+  bool isFixedArray(covariant AbstractValue value);
 
-  bool isDefinitelyNotNumStringBool(AbstractValue t);
+  /// Returns `true` if [value] is a growable JavaScript array or `null` at
+  /// runtime.
+  bool isExtendableArray(covariant AbstractValue value);
 
-  /// True if all values of [t] are either integers or not numbers at all.
-  ///
-  /// This does not imply that the value is an integer, since most other values
-  /// such as null are also not a non-integer double.
-  bool isDefinitelyNotNonIntegerDouble(AbstractValue t);
+  /// Returns `true` if [value] is a mutable JavaScript array or `null` at
+  /// runtime.
+  bool isMutableArray(covariant AbstractValue value);
 
-  bool isDefinitelyNonNegativeInt(AbstractValue t, {bool allowNull: false});
+  /// Returns `true` if [value] is a mutable JavaScript array, native HTML list
+  /// or `null` at runtime.
+  bool isMutableIndexable(covariant AbstractValue value);
 
-  bool isDefinitelyInt(AbstractValue t, {bool allowNull: false});
+  /// Returns `true` if [value] is a JavaScript array or `null` at runtime.
+  bool isArray(covariant AbstractValue value);
 
-  bool isDefinitelyUint31(AbstractValue t, {bool allowNull: false});
+  /// Returns `true` if [value] could be a JavaScript string at runtime.
+  bool canBePrimitiveString(covariant AbstractValue value);
 
-  bool isDefinitelyUint32(AbstractValue t, {bool allowNull: false});
+  /// Returns `true` if [value] is a non-null integer value at runtime.
+  bool isInteger(covariant AbstractValue value);
 
-  bool isDefinitelyUint(AbstractValue t, {bool allowNull: false});
+  /// Returns `true` if [value] is a non-null 32 bit unsigned integer value at
+  /// runtime.
+  bool isUInt32(covariant AbstractValue value);
 
-  bool isDefinitelyArray(AbstractValue t, {bool allowNull: false});
+  /// Returns `true` if [value] is a non-null 31 bit unsigned integer value at
+  /// runtime.
+  bool isUInt31(covariant AbstractValue value);
 
-  bool isDefinitelyMutableArray(AbstractValue t, {bool allowNull: false});
+  /// Returns `true` if [value] is a non-null unsigned integer value at runtime.
+  bool isPositiveInteger(covariant AbstractValue value);
 
-  bool isDefinitelyFixedArray(AbstractValue t, {bool allowNull: false});
+  /// Returns `true` if [value] is an unsigned integer value or `null` at
+  /// runtime.
+  bool isPositiveIntegerOrNull(covariant AbstractValue value);
 
-  bool isDefinitelyExtendableArray(AbstractValue t, {bool allowNull: false});
+  /// Returns `true` if [value] is an integer value or `null` at runtime.
+  bool isIntegerOrNull(covariant AbstractValue value);
 
-  bool isDefinitelyIndexable(AbstractValue t, {bool allowNull: false});
+  /// Returns `true` if [value] is a non-null JavaScript number at runtime.
+  bool isNumber(covariant AbstractValue value);
 
-  bool isDefinitelyMutableIndexable(AbstractValue t, {bool allowNull: false});
+  /// Returns `true` if [value] is a JavaScript number or `null` at runtime.
+  bool isNumberOrNull(covariant AbstractValue value);
 
-  bool isDefinitelyFixedLengthIndexable(AbstractValue t,
-      {bool allowNull: false});
+  /// Returns `true` if [value] is a non-integer number at runtime.
+  bool isDouble(covariant AbstractValue value);
 
-  bool isDefinitelyIntercepted(AbstractValue t, {bool allowNull});
+  /// Returns `true` if [value] is a non-integer number or `null` at runtime.
+  bool isDoubleOrNull(covariant AbstractValue value);
 
-  bool isDefinitelySelfInterceptor(AbstractValue t, {bool allowNull: false});
+  /// Returns `true` if [value] is a JavaScript bool at runtime.
+  bool isBoolean(covariant AbstractValue value);
 
-  /// Given a class from the interceptor hierarchy, returns an [AbstractValue]
-  /// matching all values with that interceptor (or a subtype thereof).
-  AbstractValue getInterceptorSubtypes(ClassElement class_);
+  /// Returns `true` if [value] is a JavaScript bool or `null` at runtime.
+  bool isBooleanOrNull(covariant AbstractValue value);
 
-  bool areDisjoint(AbstractValue leftType, AbstractValue rightType);
+  /// Returns `true` if [value] is a JavaScript string at runtime.
+  bool isString(covariant AbstractValue value);
 
-  bool isMorePreciseOrEqual(AbstractValue t1, AbstractValue t2);
+  /// Returns `true` if [value] is a JavaScript string or `null` at runtime.
+  bool isStringOrNull(covariant AbstractValue value);
 
-  AbstractBool isSubtypeOf(AbstractValue value, ResolutionDartType type,
-      {bool allowNull});
+  /// Returns `true` if [value] a non-null JavaScript primitive or `null`?
+  // TODO(johnniwinther): This should probably not return true on `null`,
+  // investigate.
+  bool isPrimitive(covariant AbstractValue value);
 
-  /// Returns whether [value] is one of the falsy values: false, 0, -0, NaN,
-  /// the empty string, or null.
-  AbstractBool boolify(AbstractValue value);
+  /// Returns `true` if [value] a JavaScript primitive, possible `null`.
+  bool isPrimitiveOrNull(covariant AbstractValue value);
 
-  AbstractBool strictBoolify(AbstractValue type);
+  /// Returns [AbstractValue] for the runtime values contained in either [a] or
+  /// [b].
+  AbstractValue union(covariant AbstractValue a, covariant AbstractValue b);
 
-  /// Create a type mask containing at least all subtypes of [type].
-  AbstractValue subtypesOf(ResolutionDartType type);
+  /// Returns [AbstractValue] for the runtime values that [a] and [b] have in
+  /// common.
+  AbstractValue intersection(
+      covariant AbstractValue a, covariant AbstractValue b);
 
-  /// Returns a subset of [receiver] containing at least the types
-  /// that can respond to [selector] without throwing.
-  AbstractValue receiverTypeFor(Selector selector, AbstractValue receiver);
+  /// Returns `true` if [a] and [b] have no runtime values in common.
+  bool areDisjoint(covariant AbstractValue a, covariant AbstractValue b);
 
-  /// The result of an index operation on [value], or the dynamic type if
-  /// unknown.
-  AbstractValue elementTypeOfIndexable(AbstractValue value);
+  /// Returns `true` if [a] contains all non-null runtime values.
+  bool containsAll(covariant AbstractValue a);
 
-  /// The length property of [value], or `null` if unknown.
-  int getContainerLength(AbstractValue value);
-
-  /// Returns the type of the entry of [container] at a given index.
-  /// Returns `null` if unknown.
-  AbstractValue indexWithConstant(
-      AbstractValue container, ConstantValue indexValue);
+  /// Computes the [AbstractValue] corresponding to the constant [value].
+  AbstractValue computeAbstractValueForConstant(ConstantValue value);
 }
diff --git a/pkg/compiler/lib/src/types/constants.dart b/pkg/compiler/lib/src/types/constants.dart
index 5d2b2af..58a51d7 100644
--- a/pkg/compiler/lib/src/types/constants.dart
+++ b/pkg/compiler/lib/src/types/constants.dart
@@ -23,7 +23,7 @@
   TypeMask visitConstructed(
       ConstructedConstantValue constant, ClosedWorld closedWorld) {
     if (closedWorld.interceptorData.isInterceptedClass(constant.type.element)) {
-      return closedWorld.commonMasks.nonNullType;
+      return closedWorld.abstractValueDomain.nonNullType;
     }
     return new TypeMask.nonNullExact(constant.type.element, closedWorld);
   }
@@ -45,13 +45,13 @@
     // We have to recognize double constants that are 'is int'.
     if (closedWorld.constantSystem.isInt(constant)) {
       if (constant.isMinusZero) {
-        return closedWorld.commonMasks.uint31Type;
+        return closedWorld.abstractValueDomain.uint31Type;
       } else {
         assert(constant.isPositiveInfinity || constant.isNegativeInfinity);
-        return closedWorld.commonMasks.intType;
+        return closedWorld.abstractValueDomain.intType;
       }
     }
-    return closedWorld.commonMasks.doubleType;
+    return closedWorld.abstractValueDomain.doubleType;
   }
 
   @override
@@ -63,9 +63,9 @@
       case SyntheticConstantKind.EMPTY_VALUE:
         return constant.payload;
       case SyntheticConstantKind.TYPEVARIABLE_REFERENCE:
-        return closedWorld.commonMasks.intType;
+        return closedWorld.abstractValueDomain.intType;
       case SyntheticConstantKind.NAME:
-        return closedWorld.commonMasks.stringType;
+        return closedWorld.abstractValueDomain.stringType;
       default:
         throw failedAt(CURRENT_ELEMENT_SPANNABLE,
             "Unexpected DummyConstantKind: ${constant.toStructuredText()}.");
@@ -74,63 +74,64 @@
 
   @override
   TypeMask visitBool(BoolConstantValue constant, ClosedWorld closedWorld) {
-    return closedWorld.commonMasks.boolType;
+    return closedWorld.abstractValueDomain.boolType;
   }
 
   @override
   TypeMask visitFunction(
       FunctionConstantValue constant, ClosedWorld closedWorld) {
-    return closedWorld.commonMasks.functionType;
+    return closedWorld.abstractValueDomain.functionType;
   }
 
   @override
   TypeMask visitInstantiation(
       InstantiationConstantValue constant, ClosedWorld closedWorld) {
-    return closedWorld.commonMasks.functionType;
+    return closedWorld.abstractValueDomain.functionType;
   }
 
   @override
   TypeMask visitInt(IntConstantValue constant, ClosedWorld closedWorld) {
-    if (constant.isUInt31()) return closedWorld.commonMasks.uint31Type;
-    if (constant.isUInt32()) return closedWorld.commonMasks.uint32Type;
-    if (constant.isPositive()) return closedWorld.commonMasks.positiveIntType;
-    return closedWorld.commonMasks.intType;
+    if (constant.isUInt31()) return closedWorld.abstractValueDomain.uint31Type;
+    if (constant.isUInt32()) return closedWorld.abstractValueDomain.uint32Type;
+    if (constant.isPositive())
+      return closedWorld.abstractValueDomain.positiveIntType;
+    return closedWorld.abstractValueDomain.intType;
   }
 
   @override
   TypeMask visitInterceptor(
       InterceptorConstantValue constant, ClosedWorld closedWorld) {
-    return closedWorld.commonMasks.nonNullType;
+    return closedWorld.abstractValueDomain.nonNullType;
   }
 
   @override
   TypeMask visitList(ListConstantValue constant, ClosedWorld closedWorld) {
-    return closedWorld.commonMasks.constListType;
+    return closedWorld.abstractValueDomain.constListType;
   }
 
   @override
   TypeMask visitMap(MapConstantValue constant, ClosedWorld closedWorld) {
-    return closedWorld.commonMasks.constMapType;
+    return closedWorld.abstractValueDomain.constMapType;
   }
 
   @override
   TypeMask visitNull(NullConstantValue constant, ClosedWorld closedWorld) {
-    return closedWorld.commonMasks.nullType;
+    return closedWorld.abstractValueDomain.nullType;
   }
 
   @override
   TypeMask visitNonConstant(
       NonConstantValue constant, ClosedWorld closedWorld) {
-    return closedWorld.commonMasks.nullType;
+    return closedWorld.abstractValueDomain.nullType;
   }
 
   @override
   TypeMask visitString(StringConstantValue constant, ClosedWorld closedWorld) {
-    return closedWorld.commonMasks.stringType;
+    return closedWorld.abstractValueDomain.stringType;
   }
 
   @override
   TypeMask visitType(TypeConstantValue constant, ClosedWorld closedWorld) {
-    return closedWorld.commonMasks.typeType;
+    return closedWorld.abstractValueDomain.typeType;
   }
 }
diff --git a/pkg/compiler/lib/src/types/masks.dart b/pkg/compiler/lib/src/types/masks.dart
index 4960ebc..24203e1 100644
--- a/pkg/compiler/lib/src/types/masks.dart
+++ b/pkg/compiler/lib/src/types/masks.dart
@@ -6,7 +6,7 @@
 
 import '../common.dart';
 import '../common_elements.dart' show CommonElements;
-import '../constants/values.dart' show PrimitiveConstantValue;
+import '../constants/values.dart' show ConstantValue, PrimitiveConstantValue;
 import '../elements/entities.dart';
 import '../inferrer/type_graph_inferrer.dart' show TypeGraphInferrer;
 import '../universe/selector.dart' show Selector;
@@ -17,7 +17,8 @@
         SelectorConstraintsStrategy;
 import '../util/util.dart';
 import '../world.dart' show ClassQuery, ClosedWorld;
-import 'abstract_value_domain.dart' show AbstractValue;
+import 'abstract_value_domain.dart';
+import 'constants.dart';
 
 part 'container_type_mask.dart';
 part 'dictionary_type_mask.dart';
@@ -28,14 +29,14 @@
 part 'union_type_mask.dart';
 part 'value_type_mask.dart';
 
-class CommonMasks {
+class CommonMasks implements AbstractValueDomain {
   // TODO(sigmund): once we split out the backend common elements, depend
   // directly on those instead.
-  final ClosedWorld closedWorld;
+  final ClosedWorld _closedWorld;
 
-  CommonMasks(this.closedWorld);
+  CommonMasks(this._closedWorld);
 
-  CommonElements get commonElements => closedWorld.commonElements;
+  CommonElements get commonElements => _closedWorld.commonElements;
 
   TypeMask _dynamicType;
   TypeMask _nonNullType;
@@ -63,139 +64,315 @@
   TypeMask _readableArrayType;
   TypeMask _mutableArrayType;
   TypeMask _fixedArrayType;
-  TypeMask _extendableArrayType;
   TypeMask _unmodifiableArrayType;
   TypeMask _interceptorType;
 
   TypeMask get dynamicType => _dynamicType ??= new TypeMask.subclass(
-      closedWorld.commonElements.objectClass, closedWorld);
+      _closedWorld.commonElements.objectClass, _closedWorld);
 
   TypeMask get nonNullType => _nonNullType ??= new TypeMask.nonNullSubclass(
-      closedWorld.commonElements.objectClass, closedWorld);
+      _closedWorld.commonElements.objectClass, _closedWorld);
 
   TypeMask get intType => _intType ??=
-      new TypeMask.nonNullSubclass(commonElements.jsIntClass, closedWorld);
+      new TypeMask.nonNullSubclass(commonElements.jsIntClass, _closedWorld);
 
   TypeMask get uint32Type => _uint32Type ??=
-      new TypeMask.nonNullSubclass(commonElements.jsUInt32Class, closedWorld);
+      new TypeMask.nonNullSubclass(commonElements.jsUInt32Class, _closedWorld);
 
   TypeMask get uint31Type => _uint31Type ??=
-      new TypeMask.nonNullExact(commonElements.jsUInt31Class, closedWorld);
+      new TypeMask.nonNullExact(commonElements.jsUInt31Class, _closedWorld);
 
   TypeMask get positiveIntType =>
       _positiveIntType ??= new TypeMask.nonNullSubclass(
-          commonElements.jsPositiveIntClass, closedWorld);
+          commonElements.jsPositiveIntClass, _closedWorld);
 
   TypeMask get doubleType => _doubleType ??=
-      new TypeMask.nonNullExact(commonElements.jsDoubleClass, closedWorld);
+      new TypeMask.nonNullExact(commonElements.jsDoubleClass, _closedWorld);
 
   TypeMask get numType => _numType ??=
-      new TypeMask.nonNullSubclass(commonElements.jsNumberClass, closedWorld);
+      new TypeMask.nonNullSubclass(commonElements.jsNumberClass, _closedWorld);
 
   TypeMask get boolType => _boolType ??=
-      new TypeMask.nonNullExact(commonElements.jsBoolClass, closedWorld);
+      new TypeMask.nonNullExact(commonElements.jsBoolClass, _closedWorld);
 
   TypeMask get functionType => _functionType ??=
-      new TypeMask.nonNullSubtype(commonElements.functionClass, closedWorld);
+      new TypeMask.nonNullSubtype(commonElements.functionClass, _closedWorld);
 
   TypeMask get listType => _listType ??=
-      new TypeMask.nonNullExact(commonElements.jsArrayClass, closedWorld);
+      new TypeMask.nonNullExact(commonElements.jsArrayClass, _closedWorld);
 
   TypeMask get constListType => _constListType ??= new TypeMask.nonNullExact(
-      commonElements.jsUnmodifiableArrayClass, closedWorld);
+      commonElements.jsUnmodifiableArrayClass, _closedWorld);
 
   TypeMask get fixedListType => _fixedListType ??=
-      new TypeMask.nonNullExact(commonElements.jsFixedArrayClass, closedWorld);
+      new TypeMask.nonNullExact(commonElements.jsFixedArrayClass, _closedWorld);
 
   TypeMask get growableListType =>
       _growableListType ??= new TypeMask.nonNullExact(
-          commonElements.jsExtendableArrayClass, closedWorld);
+          commonElements.jsExtendableArrayClass, _closedWorld);
 
   TypeMask get mapType => _mapType ??=
-      new TypeMask.nonNullSubtype(commonElements.mapLiteralClass, closedWorld);
+      new TypeMask.nonNullSubtype(commonElements.mapLiteralClass, _closedWorld);
 
   TypeMask get constMapType => _constMapType ??= new TypeMask.nonNullSubtype(
-      commonElements.constMapLiteralClass, closedWorld);
+      commonElements.constMapLiteralClass, _closedWorld);
 
   TypeMask get stringType => _stringType ??=
-      new TypeMask.nonNullExact(commonElements.jsStringClass, closedWorld);
+      new TypeMask.nonNullExact(commonElements.jsStringClass, _closedWorld);
 
   TypeMask get typeType => _typeType ??=
-      new TypeMask.nonNullExact(commonElements.typeLiteralClass, closedWorld);
+      new TypeMask.nonNullExact(commonElements.typeLiteralClass, _closedWorld);
 
   TypeMask get syncStarIterableType => _syncStarIterableType ??=
-      new TypeMask.nonNullExact(commonElements.syncStarIterable, closedWorld);
+      new TypeMask.nonNullExact(commonElements.syncStarIterable, _closedWorld);
 
   TypeMask get asyncFutureType =>
       _asyncFutureType ??= new TypeMask.nonNullExact(
-          commonElements.futureImplementation, closedWorld);
+          commonElements.futureImplementation, _closedWorld);
 
   TypeMask get asyncStarStreamType => _asyncStarStreamType ??=
-      new TypeMask.nonNullExact(commonElements.controllerStream, closedWorld);
+      new TypeMask.nonNullExact(commonElements.controllerStream, _closedWorld);
 
   // TODO(johnniwinther): Assert that the null type has been resolved.
   TypeMask get nullType => _nullType ??= const TypeMask.empty();
 
   TypeMask get emptyType => const TypeMask.nonNullEmpty();
 
-  TypeMask get indexablePrimitiveType => _indexablePrimitiveType ??=
-      new TypeMask.nonNullSubtype(commonElements.jsIndexableClass, closedWorld);
+  TypeMask get indexablePrimitiveType =>
+      _indexablePrimitiveType ??= new TypeMask.nonNullSubtype(
+          commonElements.jsIndexableClass, _closedWorld);
 
   TypeMask get readableArrayType => _readableArrayType ??=
-      new TypeMask.nonNullSubclass(commonElements.jsArrayClass, closedWorld);
+      new TypeMask.nonNullSubclass(commonElements.jsArrayClass, _closedWorld);
 
   TypeMask get mutableArrayType =>
       _mutableArrayType ??= new TypeMask.nonNullSubclass(
-          commonElements.jsMutableArrayClass, closedWorld);
+          commonElements.jsMutableArrayClass, _closedWorld);
 
   TypeMask get fixedArrayType => _fixedArrayType ??=
-      new TypeMask.nonNullExact(commonElements.jsFixedArrayClass, closedWorld);
-
-  TypeMask get extendableArrayType =>
-      _extendableArrayType ??= new TypeMask.nonNullExact(
-          commonElements.jsExtendableArrayClass, closedWorld);
+      new TypeMask.nonNullExact(commonElements.jsFixedArrayClass, _closedWorld);
 
   TypeMask get unmodifiableArrayType =>
       _unmodifiableArrayType ??= new TypeMask.nonNullExact(
-          commonElements.jsUnmodifiableArrayClass, closedWorld);
+          commonElements.jsUnmodifiableArrayClass, _closedWorld);
 
   TypeMask get interceptorType =>
       _interceptorType ??= new TypeMask.nonNullSubclass(
-          commonElements.jsInterceptorClass, closedWorld);
+          commonElements.jsInterceptorClass, _closedWorld);
 
   bool isTypedArray(TypeMask mask) {
-    // Just checking for [:TypedData:] is not sufficient, as it is an
-    // abstract class any user-defined class can implement. So we also
-    // check for the interface [JavaScriptIndexingBehavior].
-    ClassEntity typedDataClass = closedWorld.commonElements.typedDataClass;
+    // Just checking for `TypedData` is not sufficient, as it is an abstract
+    // class any user-defined class can implement. So we also check for the
+    // interface `JavaScriptIndexingBehavior`.
+    ClassEntity typedDataClass = _closedWorld.commonElements.typedDataClass;
     return typedDataClass != null &&
-        closedWorld.isInstantiated(typedDataClass) &&
-        mask.satisfies(typedDataClass, closedWorld) &&
-        mask.satisfies(closedWorld.commonElements.jsIndexingBehaviorInterface,
-            closedWorld);
+        _closedWorld.isInstantiated(typedDataClass) &&
+        mask.satisfies(typedDataClass, _closedWorld) &&
+        mask.satisfies(_closedWorld.commonElements.jsIndexingBehaviorInterface,
+            _closedWorld);
   }
 
   bool couldBeTypedArray(TypeMask mask) {
     bool intersects(TypeMask type1, TypeMask type2) =>
-        !type1.intersection(type2, closedWorld).isEmpty;
+        !type1.intersection(type2, _closedWorld).isEmpty;
     // TODO(herhut): Maybe cache the TypeMask for typedDataClass and
     //               jsIndexingBehaviourInterface.
-    ClassEntity typedDataClass = closedWorld.commonElements.typedDataClass;
+    ClassEntity typedDataClass = _closedWorld.commonElements.typedDataClass;
     return typedDataClass != null &&
-        closedWorld.isInstantiated(typedDataClass) &&
-        intersects(mask, new TypeMask.subtype(typedDataClass, closedWorld)) &&
+        _closedWorld.isInstantiated(typedDataClass) &&
+        intersects(mask, new TypeMask.subtype(typedDataClass, _closedWorld)) &&
         intersects(
             mask,
             new TypeMask.subtype(
-                closedWorld.commonElements.jsIndexingBehaviorInterface,
-                closedWorld));
+                _closedWorld.commonElements.jsIndexingBehaviorInterface,
+                _closedWorld));
   }
 
   TypeMask createNonNullExact(ClassEntity cls) {
-    return new TypeMask.nonNullExact(cls, closedWorld);
+    return new TypeMask.nonNullExact(cls, _closedWorld);
   }
 
   TypeMask createNonNullSubtype(ClassEntity cls) {
-    return new TypeMask.nonNullSubtype(cls, closedWorld);
+    return new TypeMask.nonNullSubtype(cls, _closedWorld);
+  }
+
+  TypeMask createNullableSubtype(ClassEntity cls) {
+    return new TypeMask.subtype(cls, _closedWorld);
+  }
+
+  TypeMask excludeNull(TypeMask mask) => mask.nonNullable();
+
+  @override
+  TypeMask includeNull(TypeMask mask) => mask.nullable();
+
+  bool containsType(TypeMask typeMask, ClassEntity cls) {
+    return _closedWorld.isInstantiated(cls) &&
+        typeMask.contains(cls, _closedWorld);
+  }
+
+  bool containsOnlyType(TypeMask typeMask, ClassEntity cls) {
+    return _closedWorld.isInstantiated(cls) && typeMask.containsOnly(cls);
+  }
+
+  bool isInstanceOf(TypeMask typeMask, ClassEntity cls) {
+    return _closedWorld.isImplemented(cls) &&
+        typeMask.satisfies(cls, _closedWorld);
+  }
+
+  bool isEmpty(TypeMask value) => value.isEmpty;
+
+  bool isExact(TypeMask value) => value.isExact || isNull(value);
+
+  bool isValue(TypeMask value) => value.isValue;
+
+  bool canBeNull(TypeMask value) => value.isNullable;
+
+  bool isNull(TypeMask value) => value.isNull;
+
+  bool canBePrimitive(TypeMask value) {
+    return canBePrimitiveNumber(value) ||
+        canBePrimitiveArray(value) ||
+        canBePrimitiveBoolean(value) ||
+        canBePrimitiveString(value) ||
+        isNull(value);
+  }
+
+  bool canBePrimitiveNumber(TypeMask value) {
+    // TODO(sra): It should be possible to test only jsDoubleClass and
+    // jsUInt31Class, since all others are superclasses of these two.
+    return containsType(value, commonElements.jsNumberClass) ||
+        containsType(value, commonElements.jsIntClass) ||
+        containsType(value, commonElements.jsPositiveIntClass) ||
+        containsType(value, commonElements.jsUInt32Class) ||
+        containsType(value, commonElements.jsUInt31Class) ||
+        containsType(value, commonElements.jsDoubleClass);
+  }
+
+  bool canBePrimitiveBoolean(TypeMask value) {
+    return containsType(value, commonElements.jsBoolClass);
+  }
+
+  bool canBePrimitiveArray(TypeMask value) {
+    return containsType(value, commonElements.jsArrayClass) ||
+        containsType(value, commonElements.jsFixedArrayClass) ||
+        containsType(value, commonElements.jsExtendableArrayClass) ||
+        containsType(value, commonElements.jsUnmodifiableArrayClass);
+  }
+
+  bool isIndexablePrimitive(TypeMask value) {
+    return value.containsOnlyString(_closedWorld) ||
+        isInstanceOf(value, commonElements.jsIndexableClass);
+  }
+
+  bool isFixedArray(TypeMask value) {
+    // TODO(sra): Recognize the union of these types as well.
+    return containsOnlyType(value, commonElements.jsFixedArrayClass) ||
+        containsOnlyType(value, commonElements.jsUnmodifiableArrayClass);
+  }
+
+  bool isExtendableArray(TypeMask value) {
+    return containsOnlyType(value, commonElements.jsExtendableArrayClass);
+  }
+
+  bool isMutableArray(TypeMask value) {
+    return isInstanceOf(value, commonElements.jsMutableArrayClass);
+  }
+
+  bool isReadableArray(TypeMask value) {
+    return isInstanceOf(value, commonElements.jsArrayClass);
+  }
+
+  bool isMutableIndexable(TypeMask value) {
+    return isInstanceOf(value, commonElements.jsMutableIndexableClass);
+  }
+
+  bool isArray(TypeMask value) => isReadableArray(value);
+
+  bool canBePrimitiveString(TypeMask value) {
+    return containsType(value, commonElements.jsStringClass);
+  }
+
+  bool isInteger(TypeMask value) {
+    return value.containsOnlyInt(_closedWorld) && !value.isNullable;
+  }
+
+  bool isUInt32(TypeMask value) {
+    return !value.isNullable &&
+        isInstanceOf(value, commonElements.jsUInt32Class);
+  }
+
+  bool isUInt31(TypeMask value) {
+    return !value.isNullable &&
+        isInstanceOf(value, commonElements.jsUInt31Class);
+  }
+
+  bool isPositiveInteger(TypeMask value) {
+    return !value.isNullable &&
+        isInstanceOf(value, commonElements.jsPositiveIntClass);
+  }
+
+  bool isPositiveIntegerOrNull(TypeMask value) {
+    return isInstanceOf(value, commonElements.jsPositiveIntClass);
+  }
+
+  bool isIntegerOrNull(TypeMask value) {
+    return value.containsOnlyInt(_closedWorld);
+  }
+
+  bool isNumber(TypeMask value) {
+    return value.containsOnlyNum(_closedWorld) && !value.isNullable;
+  }
+
+  bool isNumberOrNull(TypeMask value) {
+    return value.containsOnlyNum(_closedWorld);
+  }
+
+  bool isDouble(TypeMask value) {
+    return value.containsOnlyDouble(_closedWorld) && !value.isNullable;
+  }
+
+  bool isDoubleOrNull(TypeMask value) {
+    return value.containsOnlyDouble(_closedWorld);
+  }
+
+  bool isBoolean(TypeMask value) {
+    return value.containsOnlyBool(_closedWorld) && !value.isNullable;
+  }
+
+  bool isBooleanOrNull(TypeMask value) {
+    return value.containsOnlyBool(_closedWorld);
+  }
+
+  bool isString(TypeMask value) {
+    return value.containsOnlyString(_closedWorld) && !value.isNullable;
+  }
+
+  bool isStringOrNull(TypeMask value) {
+    return value.containsOnlyString(_closedWorld);
+  }
+
+  bool isPrimitive(TypeMask value) {
+    return (isPrimitiveOrNull(value) && !value.isNullable) || isNull(value);
+  }
+
+  bool isPrimitiveOrNull(TypeMask value) {
+    return isIndexablePrimitive(value) ||
+        isNumberOrNull(value) ||
+        isBooleanOrNull(value) ||
+        isNull(value);
+  }
+
+  TypeMask union(TypeMask a, TypeMask b) => a.union(b, _closedWorld);
+
+  TypeMask intersection(TypeMask a, TypeMask b) =>
+      a.intersection(b, _closedWorld);
+
+  bool areDisjoint(TypeMask a, TypeMask b) => a.isDisjoint(b, _closedWorld);
+
+  bool containsAll(TypeMask a) => a.containsAll(_closedWorld);
+
+  @override
+  AbstractValue computeAbstractValueForConstant(ConstantValue value) {
+    return computeTypeMask(_closedWorld, value);
   }
 }
diff --git a/pkg/compiler/lib/src/types/type_mask.dart b/pkg/compiler/lib/src/types/type_mask.dart
index bf79fb9..50bc096 100644
--- a/pkg/compiler/lib/src/types/type_mask.dart
+++ b/pkg/compiler/lib/src/types/type_mask.dart
@@ -334,9 +334,7 @@
    */
   bool contains(ClassEntity cls, ClosedWorld closedWorld);
 
-  /**
-   * Returns whether or not this type mask contains all types.
-   */
+  /// Returns whether or not this type mask contains all types.
   bool containsAll(ClosedWorld closedWorld);
 
   /// Returns the [ClassEntity] if this type represents a single class,
diff --git a/pkg/compiler/lib/src/types/types.dart b/pkg/compiler/lib/src/types/types.dart
index d5554c6..963a622 100644
--- a/pkg/compiler/lib/src/types/types.dart
+++ b/pkg/compiler/lib/src/types/types.dart
@@ -293,7 +293,7 @@
         parameter, () => createParameterResult(_inferrer, parameter));
   }
 
-  TypeMask get dynamicType => closedWorld.commonMasks.dynamicType;
+  TypeMask get dynamicType => closedWorld.abstractValueDomain.dynamicType;
 
   /// Returns the type of a [selector] when applied to a receiver with the given
   /// type [mask].
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index f2d8b34..c781eb0 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -28,6 +28,7 @@
     show RuntimeTypesNeed, RuntimeTypesNeedBuilder;
 import 'ordered_typeset.dart';
 import 'options.dart';
+import 'types/abstract_value_domain.dart';
 import 'types/masks.dart' show CommonMasks, FlatTypeMask, TypeMask;
 import 'universe/class_set.dart';
 import 'universe/function_set.dart' show FunctionSet;
@@ -60,7 +61,8 @@
 
   CommonElements get commonElements;
 
-  CommonMasks get commonMasks;
+  /// Returns the [AbstractValueDomain] used in the global type inference.
+  AbstractValueDomain get abstractValueDomain;
 
   ConstantSystem get constantSystem;
 
@@ -526,7 +528,7 @@
   final List<Map<ClassEntity, TypeMask>> _canonicalizedTypeMasks =
       new List<Map<ClassEntity, TypeMask>>.filled(8, null);
 
-  CommonMasks get commonMasks {
+  CommonMasks get abstractValueDomain {
     return _commonMasks;
   }
 
@@ -1069,13 +1071,13 @@
   bool includesClosureCall(Selector selector, TypeMask mask) {
     return selector.name == Identifiers.call &&
         (mask == null ||
-            mask.containsMask(commonMasks.functionType, closedWorld));
+            mask.containsMask(abstractValueDomain.functionType, closedWorld));
   }
 
   TypeMask computeReceiverType(Selector selector, TypeMask mask) {
     _ensureFunctionSet();
     if (includesClosureCall(selector, mask)) {
-      return commonMasks.dynamicType;
+      return abstractValueDomain.dynamicType;
     }
     return _allFunctions.receiverType(selector, mask, this);
   }
@@ -1101,7 +1103,7 @@
     if (includesClosureCall(selector, mask)) {
       return null;
     }
-    mask ??= commonMasks.dynamicType;
+    mask ??= abstractValueDomain.dynamicType;
     return mask.locateSingleMember(selector, this);
   }
 
@@ -1111,7 +1113,7 @@
       canReachAll = backendUsage.isInvokeOnUsed &&
           mask.needsNoSuchMethodHandling(selector, this);
     }
-    return canReachAll ? commonMasks.dynamicType : mask;
+    return canReachAll ? abstractValueDomain.dynamicType : mask;
   }
 
   bool fieldNeverChanges(MemberEntity element) {
diff --git a/pkg/compiler/pubspec.yaml b/pkg/compiler/pubspec.yaml
index 3530a9f..3cf04df 100644
--- a/pkg/compiler/pubspec.yaml
+++ b/pkg/compiler/pubspec.yaml
@@ -19,8 +19,6 @@
     path: ../../third_party/pkg/dart2js_info
   front_end:
     path: ../front_end
-  path:
-    path: ../../third_party/pkg/path
 dependency_overrides:
   front_end:
     path: ../front_end
diff --git a/pkg/compiler/testing.json b/pkg/compiler/testing.json
index e2ef599..d5fb717 100644
--- a/pkg/compiler/testing.json
+++ b/pkg/compiler/testing.json
@@ -14,9 +14,7 @@
     ],
 
     "exclude": [
-      "^tests/compiler/dart2js/inference/data/super_invoke\\.dart",
-      "^tests/compiler/dart2js/old_frontend/data/.*",
-      "^tests/compiler/dart2js/path with spaces/.*"
+      "^tests/compiler/dart2js/inference/data/super_invoke\\.dart"
     ]
   }
 }
diff --git a/pkg/compiler/testing_dart.json b/pkg/compiler/testing_dart.json
index f36c8ad..1b68d8b 100644
--- a/pkg/compiler/testing_dart.json
+++ b/pkg/compiler/testing_dart.json
@@ -38,23 +38,12 @@
       "^tests/compiler/dart2js/kernel/closed_world_test\\.dart",
       "^tests/compiler/dart2js/kernel/visitor_test\\.dart",
       "^tests/compiler/dart2js/memory_compiler\\.dart",
-      "^tests/compiler/dart2js/mirrors/data/mirrors_helper\\.dart",
-      "^tests/compiler/dart2js/mirrors/deferred_mirrors_test\\.dart",
-      "^tests/compiler/dart2js/mirrors/mirrors_used_test\\.dart",
       "^tests/compiler/dart2js/mixin_typevariable_test\\.dart",
       "^tests/compiler/dart2js/model/constant_expression_evaluate_test\\.dart",
       "^tests/compiler/dart2js/model/constant_expression_test\\.dart",
       "^tests/compiler/dart2js/needs_no_such_method_test\\.dart",
       "^tests/compiler/dart2js/no_such_method_enabled_test\\.dart",
       "^tests/compiler/dart2js/output_collector\\.dart",
-      "^tests/compiler/dart2js/old_frontend/data/one_line_dart_program\\.dart",
-      "^tests/compiler/dart2js/old_frontend/message_kind_helper\\.dart",
-      "^tests/compiler/dart2js/old_frontend/metadata_test\\.dart",
-      "^tests/compiler/dart2js/old_frontend/patch_test\\.dart",
-      "^tests/compiler/dart2js/old_frontend/reexport_handled_test\\.dart",
-      "^tests/compiler/dart2js/old_frontend/resolution_test\\.dart",
-      "^tests/compiler/dart2js/quarantined/http_launch_data/http_launch_main_package\\.dart",
-      "^tests/compiler/dart2js/quarantined/http_test\\.dart",
       "^tests/compiler/dart2js/rti/data/future_or_future_or_generic_strong\\.dart",
       "^tests/compiler/dart2js/rti/data/future_or_future_or_strong\\.dart",
       "^tests/compiler/dart2js/rti/data/future_or_generic2_strong\\.dart",
@@ -78,9 +67,7 @@
       "^tests/compiler/dart2js/token_naming_test\\.dart",
       "^tests/compiler/dart2js/type_representation_test\\.dart",
       "^tests/compiler/dart2js/type_variable_occurrence_test\\.dart",
-      "^tests/compiler/dart2js/unused_empty_map_test\\.dart",
-
-      "^tests/compiler/dart2js/path with spaces/.*"
+      "^tests/compiler/dart2js/unused_empty_map_test\\.dart"
     ]
   }
 }
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index e8aa203..bc50ca2 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -1367,15 +1367,19 @@
 
   JS.Expression _emitConstructor(
       Constructor node, List<Field> fields, JS.Expression className) {
+    var savedUri = _currentUri;
+    _currentUri = node.fileUri ?? savedUri;
     var params = _emitFormalParameters(node.function);
     var body = _withCurrentFunction(
         node.function,
         () => _superDisallowed(
             () => _emitConstructorBody(node, fields, className)));
 
-    return new JS.Fun(params, new JS.Block(body))
-      ..sourceInformation = _nodeEnd(node.fileEndOffset) ??
-          _nodeEnd(node.enclosingClass.fileEndOffset);
+    var end = _nodeEnd(node.fileEndOffset);
+    _currentUri = savedUri;
+    end ??= _nodeEnd(node.enclosingClass.fileEndOffset);
+
+    return new JS.Fun(params, new JS.Block(body))..sourceInformation = end;
   }
 
   List<JS.Statement> _emitConstructorBody(
@@ -1617,7 +1621,9 @@
       }
     }
 
+    var savedUri = _currentUri;
     for (var m in c.procedures) {
+      _currentUri = m.fileUri ?? savedUri;
       if (m.isForwardingStub) {
         // TODO(jmesserly): is there any other kind of forwarding stub?
         jsMethods.addAll(_emitCovarianceCheckStub(m));
@@ -1636,6 +1642,7 @@
         jsMethods.add(_emitMethodDeclaration(m));
       }
     }
+    _currentUri = savedUri;
 
     _classProperties.mockMembers.forEach((String name, Member member) {
       jsMethods
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/libraries.json b/pkg/dev_compiler/tool/input_sdk/lib/libraries.json
index 74a20ef..49b904f 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/libraries.json
+++ b/pkg/dev_compiler/tool/input_sdk/lib/libraries.json
@@ -18,7 +18,7 @@
       },
       "_internal": {
         "uri": "../../../../../sdk/lib/internal/internal.dart",
-        "patch": "../patch/internal_patch.dart"
+        "patches": "../patch/internal_patch.dart"
       },
       "_isolate_helper": {
         "uri": "../private/isolate_helper.dart"
@@ -40,43 +40,43 @@
       },
       "async": {
         "uri": "../../../../../sdk/lib/async/async.dart",
-        "patch": "../patch/async_patch.dart"
+        "patches": "../patch/async_patch.dart"
       },
       "collection": {
         "uri": "../../../../../sdk/lib/collection/collection.dart",
-        "patch": "../patch/collection_patch.dart"
+        "patches": "../patch/collection_patch.dart"
       },
       "convert": {
         "uri": "../../../../../sdk/lib/convert/convert.dart",
-        "patch": "../patch/convert_patch.dart"
+        "patches": "../patch/convert_patch.dart"
       },
       "core": {
         "uri": "../../../../../sdk/lib/core/core.dart",
-        "patch": "../patch/core_patch.dart"
+        "patches": "../patch/core_patch.dart"
       },
       "developer": {
         "uri": "../../../../../sdk/lib/developer/developer.dart",
-        "patch": "../patch/developer_patch.dart"
+        "patches": "../patch/developer_patch.dart"
       },
       "io": {
         "uri": "../../../../../sdk/lib/io/io.dart",
-        "patch": "../patch/io_patch.dart"
+        "patches": "../patch/io_patch.dart"
       },
       "isolate": {
         "uri": "../../../../../sdk/lib/isolate/isolate.dart",
-        "patch": "../patch/isolate_patch.dart"
+        "patches": "../patch/isolate_patch.dart"
       },
       "mirrors": {
         "uri": "../../../../../sdk/lib/mirrors/mirrors.dart",
-        "patch": "../patch/mirrors_patch.dart"
+        "patches": "../patch/mirrors_patch.dart"
       },
       "math": {
         "uri": "../../../../../sdk/lib/math/math.dart",
-        "patch": "../patch/math_patch.dart"
+        "patches": "../patch/math_patch.dart"
       },
       "typed_data": {
         "uri": "../../../../../sdk/lib/typed_data/typed_data.dart",
-        "patch": "../patch/typed_data_patch.dart"
+        "patches": "../patch/typed_data_patch.dart"
       },
       "html": {
         "uri": "../../../../../sdk/lib/html/dart2js/html_dart2js.dart"
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
index b04009e..1dabfb7 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
@@ -15,7 +15,7 @@
 
 @JSExportName('async')
 @ReifyFunctionTypes(false)
-async_<T>(Function() initGenerator) {
+_async<T>(Function() initGenerator) {
   var iter;
   Object Function(Object) onValue;
   Object Function(Object) onError;
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
index b8ad752..7ae52ae 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
@@ -17,17 +17,18 @@
         notNull,
         nullCheck,
         Primitives,
+        PrivateSymbol,
         quoteStringForRegExp;
-
 import 'dart:_runtime' as dart;
-
 import 'dart:_foreign_helper' show JS;
-
 import 'dart:_native_typed_data' show NativeUint8List;
-
+import 'dart:collection' show UnmodifiableMapView;
+import 'dart:convert' show Encoding, utf8;
 import 'dart:typed_data' show Endian, Uint8List, Uint16List;
 
-String _symbolToString(Symbol symbol) => _symbol_dev.Symbol.getName(symbol);
+String _symbolToString(Symbol symbol) => symbol is PrivateSymbol
+    ? PrivateSymbol.getName(symbol)
+    : _symbol_dev.Symbol.getName(symbol);
 
 @patch
 int identityHashCode(Object object) {
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
index d9c577b..99a85fd 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
@@ -6,6 +6,8 @@
 
 import 'dart:_js_helper' show patch, ForceInline;
 import 'dart:_foreign_helper' show JS;
+import 'dart:async';
+import 'dart:isolate';
 
 @patch
 @ForceInline()
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/internal_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/internal_patch.dart
index c750542..5e850bb 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/internal_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/internal_patch.dart
@@ -2,6 +2,8 @@
 // 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:core' hide Symbol;
+import 'dart:core' as core show Symbol;
 import 'dart:_js_primitives' show printString;
 import 'dart:_js_helper' show patch;
 import 'dart:_interceptors' show JSArray;
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/io_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/io_patch.dart
index de914a5..604c0c8 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/io_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/io_patch.dart
@@ -3,6 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:_js_helper' show patch;
+import 'dart:async';
+import 'dart:convert';
+import 'dart:isolate' show SendPort;
+import 'dart:typed_data';
 
 @patch
 class _Directory {
@@ -343,7 +347,7 @@
       Map<String, String> environment,
       bool includeParentEnvironment: true,
       bool runInShell: false,
-      ProcessStartMode mode: ProcessStartMode.NORMAL}) {
+      ProcessStartMode mode: ProcessStartMode.normal}) {
     throw new UnsupportedError("Process.start");
   }
 
@@ -353,8 +357,8 @@
       Map<String, String> environment,
       bool includeParentEnvironment: true,
       bool runInShell: false,
-      Encoding stdoutEncoding: SYSTEM_ENCODING,
-      Encoding stderrEncoding: SYSTEM_ENCODING}) {
+      Encoding stdoutEncoding: systemEncoding,
+      Encoding stderrEncoding: systemEncoding}) {
     throw new UnsupportedError("Process.run");
   }
 
@@ -364,13 +368,13 @@
       Map<String, String> environment,
       bool includeParentEnvironment: true,
       bool runInShell: false,
-      Encoding stdoutEncoding: SYSTEM_ENCODING,
-      Encoding stderrEncoding: SYSTEM_ENCODING}) {
+      Encoding stdoutEncoding: systemEncoding,
+      Encoding stderrEncoding: systemEncoding}) {
     throw new UnsupportedError("Process.runSync");
   }
 
   @patch
-  static bool killPid(int pid, [ProcessSignal signal = ProcessSignal.SIGTERM]) {
+  static bool killPid(int pid, [ProcessSignal signal = ProcessSignal.sigterm]) {
     throw new UnsupportedError("Process.killPid");
   }
 }
@@ -403,7 +407,7 @@
   }
   @patch
   static Future<List<InternetAddress>> lookup(String host,
-      {InternetAddressType type: InternetAddressType.ANY}) {
+      {InternetAddressType type: InternetAddressType.any}) {
     throw new UnsupportedError("InternetAddress.lookup");
   }
 
@@ -425,7 +429,7 @@
   static Future<List<NetworkInterface>> list(
       {bool includeLoopback: false,
       bool includeLinkLocal: false,
-      InternetAddressType type: InternetAddressType.ANY}) {
+      InternetAddressType type: InternetAddressType.any}) {
     throw new UnsupportedError("NetworkInterface.list");
   }
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart
index a0464f3..bd0b258 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart
@@ -5,6 +5,7 @@
 // Patch file for the dart:isolate library.
 
 import 'dart:_js_helper' show patch, NoReifyGeneric;
+import 'dart:async';
 
 @patch
 class Isolate {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart b/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart
index 23c00f0..5566a25 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart
@@ -96,17 +96,47 @@
   String toString() => JS('String', 'String(#)', this);
 }
 
+class NativeError extends Interceptor {
+  String dartStack() => JS('String', '#.stack', this);
+}
+
 // Note that this needs to be in interceptors.dart in order for
 // it to be picked up as an extension type.
 @JsPeerInterface(name: 'TypeError')
-class NullError extends Interceptor implements NoSuchMethodError {
+class NullError extends NativeError implements NoSuchMethodError {
+  static RegExp _nullError =
+      new RegExp(r"^Cannot read property '(.+)' of null$");
+  static RegExp _extensionName = new RegExp(r"^Symbol\(dartx\.(.+)\)$");
+  static RegExp _privateName = new RegExp(r"^Symbol\((_.+)\)$");
+
+  String _fieldName() {
+    var message = JS('String', '#.message', this);
+    var match = _nullError.firstMatch(message);
+    if (match == null) return null;
+    var name = match[1];
+    match = _extensionName.firstMatch(name) ?? _privateName.firstMatch(name);
+    return match != null ? match[1] : name;
+  }
+
+  String dartStack() {
+    var stack = super.dartStack();
+    // Strip TypeError from first line.
+    stack = toString() + '\n' + stack.split('\n').sublist(1).join('\n');
+    return stack;
+  }
+
   StackTrace get stackTrace => getTraceFromException(this);
 
   String toString() {
     // TODO(vsm): Distinguish between null reference errors and other
     // TypeErrors.  We should not get non-null TypeErrors from DDC code,
     // but we may from native JavaScript.
-    return "NullError: ${JS('String', '#.message', this)}";
+    var name = _fieldName();
+    if (name == null) {
+      // Not a Null NSM error: fallback to JS.
+      return JS('String', '#.toString()', this);
+    }
+    return "NullError: invalid member on null: '$name'";
   }
 }
 
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
index 7157533..e7e7bd6 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
@@ -574,7 +574,7 @@
   var error = dart.recordJsError(exception);
   StackTrace trace = JS('', '#[#]', error, _stackTrace);
   if (trace != null) return trace;
-  trace = new _StackTrace(error);
+  trace = _StackTrace(error);
   JS('', '#[#] = #', error, _stackTrace, trace);
   return trace;
 }
@@ -599,7 +599,11 @@
     String trace;
     if (JS('bool', '# !== null', _exception) &&
         JS('bool', 'typeof # === "object"', _exception)) {
-      trace = JS("", r"#.stack", _exception);
+      if (_exception is NativeError) {
+        trace = _exception.dartStack();
+      } else {
+        trace = JS("", r"#.stack", _exception);
+      }
       if (trace != null && stackTraceMapper != null) {
         trace = stackTraceMapper(trace);
       }
diff --git a/pkg/dev_compiler/tool/kernel_sdk.dart b/pkg/dev_compiler/tool/kernel_sdk.dart
index fac6737..f2d5623 100755
--- a/pkg/dev_compiler/tool/kernel_sdk.dart
+++ b/pkg/dev_compiler/tool/kernel_sdk.dart
@@ -15,7 +15,6 @@
 import 'package:front_end/src/api_prototype/kernel_generator.dart';
 import 'package:kernel/kernel.dart';
 import 'package:path/path.dart' as path;
-import 'patch_sdk.dart' as patch_sdk;
 
 Future main(List<String> args) async {
   // Parse flags.
@@ -28,9 +27,7 @@
   var outputPath =
       path.absolute(rest.length > 0 ? rest[0] : 'gen/sdk/kernel/ddc_sdk.dill');
 
-  patch_sdk.main(['../..', 'tool/input_sdk', 'gen/patched_sdk']);
-
-  var inputPath = path.absolute('gen/patched_sdk');
+  var inputPath = path.absolute('tool/input_sdk');
   var target = new DevCompilerTarget();
   var options = new CompilerOptions()
     ..compileSdk = true
diff --git a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
index d9ed1f49..76e4075 100644
--- a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
@@ -5,7 +5,7 @@
 import 'dart:async' show Future;
 
 import 'package:kernel/kernel.dart'
-    show Component, DartType, NamedNode, Procedure, TypeParameter;
+    show Component, Procedure, DartType, TypeParameter;
 
 import '../base/processed_options.dart' show ProcessedOptions;
 
@@ -17,15 +17,6 @@
 
 import 'compiler_options.dart' show CompilerOptions;
 
-/// Identifies a position in the source program for expression compilation.
-///
-/// Currently this can be either a library-scope or a class-scope. This object
-/// may also contain references to FE-internal datastructures, so it is
-/// invalidated by any changes to the Kernel program.
-abstract class CompilationPosition {
-  final NamedNode kernelNode = null;
-}
-
 abstract class IncrementalKernelGenerator {
   factory IncrementalKernelGenerator(CompilerOptions options, Uri entryPoint,
       [Uri bootstrapDill]) {
@@ -53,9 +44,10 @@
   /// parameters, whether or not they appear free in [expression]. The type
   /// parameters should have a null parent pointer.
   ///
-  /// [enclosingNode] must refer to either a [Library] or a [Class] in which
-  /// scope [expression] is compiled. If it refers to a [Class], the flag
-  /// [isStatic] determines whether [expression] may reference "this".
+  /// [libraryUri] must refer to either a previously compiled library.
+  /// [className] may optionally refer to a class within such library to use for
+  /// the scope of the expression. In that case, [isStatic] indicates whether
+  /// the scope can access [this].
   ///
   /// It is illegal to use "await" in [expression] and the compiled function
   /// will always be synchronous.
@@ -69,13 +61,9 @@
       String expression,
       Map<String, DartType> definitions,
       List<TypeParameter> typeDefinitions,
-      CompilationPosition position,
-      [bool isStatic = false]);
-
-  /// Finds the [CompilationPosition] referenced by [library] and optionally
-  /// [class].
-  CompilationPosition resolveCompilationPosition(Uri library,
-      [String className]);
+      Uri libraryUri,
+      [String className,
+      bool isStatic = false]);
 }
 
 bool isLegalIdentifier(String identifier) {
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index 27e264e..6121947 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -32,9 +32,6 @@
     extends TypeDeclarationBuilder<T, R> {
   final List<TypeVariableBuilder> typeVariables;
 
-  /// List of type arguments provided by instantiate to bound.
-  List<TypeBuilder> get calculatedBounds => null;
-
   T supertype;
 
   List<T> interfaces;
diff --git a/pkg/front_end/lib/src/fasta/builder/function_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_type_alias_builder.dart
index 564c636..7abb3f3 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_type_alias_builder.dart
@@ -18,9 +18,6 @@
 
   final List<TypeVariableBuilder> typeVariables;
 
-  /// List of type arguments provided by instantiate to bound.
-  List<TypeBuilder> get calculatedBounds;
-
   FunctionTypeAliasBuilder(List<MetadataBuilder> metadata, String name,
       this.typeVariables, this.type, LibraryBuilder parent, int charOffset)
       : super(metadata, null, name, parent, charOffset);
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 5ad37c7..5407f55 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -31,8 +31,6 @@
         ScopeBuilder,
         TypeBuilder;
 
-import '../import.dart' show Import;
-
 abstract class LibraryBuilder<T extends TypeBuilder, R>
     extends ModifierBuilder {
   final Scope scope;
@@ -172,7 +170,7 @@
         null);
   }
 
-  int finishTypeVariables(ClassBuilder object) => 0;
+  int finishTypeVariables(ClassBuilder object, TypeBuilder dynamicType) => 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
@@ -217,19 +215,4 @@
     if (!isPatch) return;
     unsupported("${runtimeType}.applyPatches", -1, fileUri);
   }
-
-  void addSpecificImportsToScope(Iterable<Import> imports) {
-    bool explicitCoreImport = this == loader.coreLibrary;
-    for (Import import in imports) {
-      if (import.imported == loader.coreLibrary) {
-        explicitCoreImport = true;
-      }
-      import.finalizeImports(this);
-    }
-    if (!explicitCoreImport) {
-      loader.coreLibrary.exportScope.forEach((String name, Builder member) {
-        addToScope(name, member, -1, true);
-      });
-    }
-  }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
index 465da46..4f3acc7 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
@@ -10,6 +10,8 @@
     extends TypeDeclarationBuilder<T, R> {
   T bound;
 
+  T defaultType;
+
   TypeVariableBuilder(
       String name, this.bound, LibraryBuilder compilationUnit, int charOffset)
       : super(null, null, name, compilationUnit, charOffset);
diff --git a/pkg/front_end/lib/src/fasta/builder/unresolved_type.dart b/pkg/front_end/lib/src/fasta/builder/unresolved_type.dart
index ef75ed9..c539213 100644
--- a/pkg/front_end/lib/src/fasta/builder/unresolved_type.dart
+++ b/pkg/front_end/lib/src/fasta/builder/unresolved_type.dart
@@ -27,8 +27,8 @@
 
   /// Performs checks on the type after it's resolved.
   void checkType() {
-    if (builder is NamedTypeBuilder) {
-      NamedTypeBuilder resolvedType = builder as NamedTypeBuilder;
+    TypeBuilder resolvedType = builder;
+    if (resolvedType is NamedTypeBuilder) {
       TypeDeclarationBuilder declaration = resolvedType.builder;
       if (declaration is ClassBuilder) {
         if (resolvedType.arguments != null &&
@@ -51,4 +51,25 @@
       }
     }
   }
+
+  /// Normalizes the type arguments in accordance with Dart 1 semantics.
+  void normalizeType() {
+    TypeBuilder resolvedType = builder;
+    if (resolvedType is NamedTypeBuilder) {
+      TypeDeclarationBuilder declaration = resolvedType.builder;
+      if (declaration is ClassBuilder) {
+        if (resolvedType.arguments != null &&
+            resolvedType.arguments.length != declaration.typeVariablesCount) {
+          // [resolveType.arguments] will be normalized later if they are null.
+          resolvedType.arguments = null;
+        }
+      } else if (declaration is FunctionTypeAliasBuilder) {
+        if (resolvedType.arguments != null &&
+            resolvedType.arguments.length != declaration.typeVariablesCount) {
+          // [resolveType.arguments] will be normalized later if they are null.
+          resolvedType.arguments = null;
+        }
+      }
+    }
+  }
 }
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 a2089f3..fc6df24 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
@@ -4,19 +4,17 @@
 
 library fasta.dill_class_builder;
 
-import 'package:kernel/ast.dart' show Class, Member, TypeParameter, DartType;
-
-import 'package:kernel/type_algebra.dart' show calculateBounds;
+import 'package:kernel/ast.dart' show Class, DartType, Member;
 
 import '../problems.dart' show unimplemented;
 
 import '../kernel/kernel_builder.dart'
     show
-        MemberBuilder,
         KernelClassBuilder,
         KernelTypeBuilder,
-        Scope,
-        TypeBuilder;
+        LibraryBuilder,
+        MemberBuilder,
+        Scope;
 
 import '../modifier.dart' show abstractMask;
 
@@ -24,8 +22,6 @@
 
 import 'dill_library_builder.dart' show DillLibraryBuilder;
 
-import 'built_type_builder.dart' show BuiltTypeBuilder;
-
 class DillClassBuilder extends KernelClassBuilder {
   final Class cls;
 
@@ -63,24 +59,27 @@
   @override
   int get typeVariablesCount => cls.typeParameters.length;
 
-  List<TypeBuilder> get calculatedBounds {
-    if (super.calculatedBounds != null) {
-      return super.calculatedBounds;
+  @override
+  List<DartType> buildTypeArguments(
+      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
+    // For performance reasons, [typeVariables] aren't restored from [target].
+    // So, if [arguments] is null, the default types should be retrieved from
+    // [cls.typeParameters].
+    if (arguments == null) {
+      List<DartType> result =
+          new List<DartType>.filled(cls.typeParameters.length, null);
+      for (int i = 0; i < result.length; ++i) {
+        result[i] = cls.typeParameters[i].defaultType;
+      }
+      return result;
     }
-    DillLibraryBuilder parentLibraryBuilder = parent;
-    DillClassBuilder objectClassBuilder =
-        parentLibraryBuilder.loader.coreLibrary["Object"];
-    Class objectClass = objectClassBuilder.cls;
-    List<TypeParameter> targetTypeParameters = target.typeParameters;
-    List<DartType> calculatedBoundTypes =
-        calculateBounds(targetTypeParameters, objectClass);
-    List<TypeBuilder> result =
-        new List<BuiltTypeBuilder>(targetTypeParameters.length);
-    for (int i = 0; i < result.length; i++) {
-      result[i] = new BuiltTypeBuilder(calculatedBoundTypes[i]);
+
+    // [arguments] != null
+    List<DartType> result = new List<DartType>.filled(arguments.length, null);
+    for (int i = 0; i < result.length; ++i) {
+      result[i] = arguments[i].build(library);
     }
-    super.calculatedBounds = result;
-    return super.calculatedBounds;
+    return result;
   }
 
   /// Returns true if this class is the result of applying a mixin to its
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
index 57cb4e0..2b6c733 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -11,7 +11,6 @@
         Class,
         Field,
         Library,
-        LibraryDependency,
         ListLiteral,
         Member,
         Procedure,
@@ -19,15 +18,9 @@
         StringLiteral,
         Typedef;
 
-import 'package:kernel/ast.dart' as kernel show Combinator;
-
-import '../combinator.dart' show Combinator;
-
 import '../fasta_codes.dart' show templateUnspecified;
 
-import '../import.dart' show Import;
-
-import '../problems.dart' show internalProblem, unhandled;
+import '../problems.dart' show internalProblem, unhandled, unimplemented;
 
 import '../kernel/kernel_builder.dart'
     show
@@ -125,16 +118,7 @@
 
   @override
   void addToScope(String name, Builder member, int charOffset, bool isImport) {
-    Map<String, Builder> map = member.isSetter ? scope.setters : scope.local;
-    Builder existing = map[name];
-    if (existing != null) {
-      if (existing != member) {
-        map[name] = buildAmbiguousBuilder(name, existing, member, charOffset,
-            isImport: isImport);
-      }
-    } else {
-      map[name] = member;
-    }
+    unimplemented("addToScope", charOffset, fileUri);
   }
 
   @override
@@ -225,23 +209,4 @@
       assert(node == builder.target);
     }
   }
-
-  void addImportsToScope(Map<Uri, LibraryBuilder> libraries) {
-    List<Import> imports = <Import>[];
-    for (LibraryDependency dependency in library.dependencies) {
-      if (!dependency.isImport) continue;
-      LibraryBuilder imported = libraries[dependency.targetLibrary.importUri];
-      assert(imported != null);
-
-      List<Combinator> syntheticCombinators = <Combinator>[];
-      for (kernel.Combinator combinator in dependency.combinators) {
-        syntheticCombinators.add(new Combinator(combinator.isShow,
-            new Set<String>.from(combinator.names), -1, uri));
-      }
-
-      imports.add(new Import(this, imported, false, dependency.name,
-          syntheticCombinators, [], dependency.fileOffset, -1));
-    }
-    addSpecificImportsToScope(imports);
-  }
 }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
index ea49d48..d033d7d 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
@@ -8,8 +8,6 @@
 
 import 'package:kernel/ast.dart' show Library, Component, Source;
 
-import 'package:kernel/core_types.dart' show CoreTypes;
-
 import '../fasta_codes.dart'
     show SummaryTemplate, Template, templateDillOutlineSummary;
 
@@ -30,9 +28,6 @@
   /// Sources for all appended components.
   final Map<Uri, Source> uriToSource = <Uri, Source>{};
 
-  /// Should be set if code will be compiled in the context of this library.
-  CoreTypes coreTypes;
-
   DillLoader(TargetImplementation target) : super(target);
 
   Template<SummaryTemplate> get outlineSummaryTemplate =>
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 e6eebed..f2666d8 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,26 +4,20 @@
 
 library fasta.dill_typedef_builder;
 
-import 'package:kernel/ast.dart' show DartType, Typedef, TypeParameter, Class;
-
-import 'package:kernel/type_algebra.dart' show calculateBounds;
+import 'package:kernel/ast.dart' show DartType, Typedef;
 
 import '../kernel/kernel_builder.dart'
     show
         KernelFunctionTypeAliasBuilder,
         KernelFunctionTypeBuilder,
+        KernelTypeBuilder,
         LibraryBuilder,
-        MetadataBuilder,
-        TypeBuilder;
+        MetadataBuilder;
 
 import '../problems.dart' show unimplemented;
 
 import 'dill_library_builder.dart' show DillLibraryBuilder;
 
-import 'dill_class_builder.dart' show DillClassBuilder;
-
-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,
@@ -36,26 +30,6 @@
   @override
   int get typeVariablesCount => target.typeParameters.length;
 
-  List<TypeBuilder> get calculatedBounds {
-    if (super.calculatedBounds != null) {
-      return super.calculatedBounds;
-    }
-    DillLibraryBuilder parentLibraryBuilder = parent;
-    DillClassBuilder objectClassBuilder =
-        parentLibraryBuilder.loader.coreLibrary["Object"];
-    Class objectClass = objectClassBuilder.cls;
-    List<TypeParameter> targetTypeParameters = target.typeParameters;
-    List<DartType> calculatedBoundTypes =
-        calculateBounds(targetTypeParameters, objectClass);
-    List<TypeBuilder> result =
-        new List<BuiltTypeBuilder>(targetTypeParameters.length);
-    for (int i = 0; i < result.length; i++) {
-      result[i] = new BuiltTypeBuilder(calculatedBoundTypes[i]);
-    }
-    super.calculatedBounds = result;
-    return super.calculatedBounds;
-  }
-
   @override
   KernelFunctionTypeBuilder get type {
     return unimplemented("type", -1, null);
@@ -63,4 +37,27 @@
 
   @override
   DartType buildThisType(LibraryBuilder library) => thisType ??= target.type;
+
+  @override
+  List<DartType> buildTypeArguments(
+      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
+    // For performance reasons, [typeVariables] aren't restored from [target].
+    // So, if [arguments] is null, the default types should be retrieved from
+    // [cls.typeParameters].
+    if (arguments == null) {
+      List<DartType> result =
+          new List<DartType>.filled(target.typeParameters.length, null);
+      for (int i = 0; i < result.length; ++i) {
+        result[i] = target.typeParameters[i].defaultType;
+      }
+      return result;
+    }
+
+    // [arguments] != null
+    List<DartType> result = new List<DartType>.filled(arguments.length, null);
+    for (int i = 0; i < result.length; ++i) {
+      result[i] = arguments[i].build(library);
+    }
+    return result;
+  }
 }
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 1513772..ae67c8e 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -967,6 +967,27 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeDeclaredMemberConflictsWithInheritedMember =
+    messageDeclaredMemberConflictsWithInheritedMember;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageDeclaredMemberConflictsWithInheritedMember =
+    const MessageCode("DeclaredMemberConflictsWithInheritedMember",
+        severity: Severity.errorLegacyWarning,
+        message:
+            r"""Can't declare a member that conflicts with an inherited one.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeDeclaredMemberConflictsWithInheritedMemberCause =
+    messageDeclaredMemberConflictsWithInheritedMemberCause;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageDeclaredMemberConflictsWithInheritedMemberCause =
+    const MessageCode("DeclaredMemberConflictsWithInheritedMemberCause",
+        severity: Severity.context,
+        message: r"""This is the inherited member.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeDeferredAfterPrefix = messageDeferredAfterPrefix;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1348,6 +1369,8 @@
 const Code<Message Function(String name)> codeDuplicatedNamePreviouslyUsed =
     const Code<Message Function(String name)>(
         "DuplicatedNamePreviouslyUsed", templateDuplicatedNamePreviouslyUsed,
+        analyzerCode: "REFERENCED_BEFORE_DECLARATION",
+        dart2jsCode: "*ignored*",
         severity: Severity.error);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1725,6 +1748,15 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeExpectedOneExpression = messageExpectedOneExpression;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageExpectedOneExpression = const MessageCode(
+    "ExpectedOneExpression",
+    severity: Severity.error,
+    message: r"""Expected one expression, but found additional input.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExpectedOpenParens = messageExpectedOpenParens;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2525,6 +2557,35 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeInheritedMembersConflict = messageInheritedMembersConflict;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageInheritedMembersConflict = const MessageCode(
+    "InheritedMembersConflict",
+    severity: Severity.errorLegacyWarning,
+    message: r"""Can't inherit members that conflict with each other.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeInheritedMembersConflictCause1 =
+    messageInheritedMembersConflictCause1;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageInheritedMembersConflictCause1 = const MessageCode(
+    "InheritedMembersConflictCause1",
+    severity: Severity.context,
+    message: r"""This is one inherited member.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeInheritedMembersConflictCause2 =
+    messageInheritedMembersConflictCause2;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageInheritedMembersConflictCause2 = const MessageCode(
+    "InheritedMembersConflictCause2",
+    severity: Severity.context,
+    message: r"""This is the other inherited member.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInitializedVariableInForEach =
     messageInitializedVariableInForEach;
 
diff --git a/pkg/front_end/lib/src/testing/hybrid_file_system.dart b/pkg/front_end/lib/src/fasta/hybrid_file_system.dart
similarity index 79%
rename from pkg/front_end/lib/src/testing/hybrid_file_system.dart
rename to pkg/front_end/lib/src/fasta/hybrid_file_system.dart
index ba2a2fe..4b388a3 100644
--- a/pkg/front_end/lib/src/testing/hybrid_file_system.dart
+++ b/pkg/front_end/lib/src/fasta/hybrid_file_system.dart
@@ -8,17 +8,18 @@
 
 import 'dart:async';
 
-import 'package:front_end/src/api_prototype/file_system.dart';
-import 'package:front_end/src/api_prototype/memory_file_system.dart';
-import 'package:front_end/src/api_prototype/standard_file_system.dart';
+import '../api_prototype/file_system.dart';
+import '../api_prototype/memory_file_system.dart';
+import '../api_prototype/standard_file_system.dart';
 
 /// A file system that mixes files from memory and a physical file system. All
 /// memory entities take priotity over file system entities.
 class HybridFileSystem implements FileSystem {
   final MemoryFileSystem memory;
-  final StandardFileSystem physical = StandardFileSystem.instance;
+  final FileSystem physical;
 
-  HybridFileSystem(this.memory);
+  HybridFileSystem(this.memory, [FileSystem _physical])
+      : physical = _physical ?? StandardFileSystem.instance;
 
   @override
   FileSystemEntity entityForUri(Uri uri) =>
@@ -37,7 +38,8 @@
   Future<FileSystemEntity> get delegate async {
     if (_delegate != null) return _delegate;
     FileSystemEntity entity = _fs.memory.entityForUri(uri);
-    if ((uri.scheme != 'file' && uri.scheme != 'data') ||
+    if (((uri.scheme != 'file' && uri.scheme != 'data') &&
+            _fs.physical is StandardFileSystem) ||
         await entity.exists()) {
       _delegate = entity;
       return _delegate;
diff --git a/pkg/front_end/lib/src/fasta/import.dart b/pkg/front_end/lib/src/fasta/import.dart
index 1ae3b3b..d48f2a2 100644
--- a/pkg/front_end/lib/src/fasta/import.dart
+++ b/pkg/front_end/lib/src/fasta/import.dart
@@ -88,7 +88,7 @@
   }
 }
 
-createPrefixBuilder(
+KernelPrefixBuilder createPrefixBuilder(
     String prefix,
     LibraryBuilder importer,
     LibraryBuilder imported,
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 1933002..f23b510 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -12,21 +12,29 @@
 
 import 'package:kernel/kernel.dart'
     show
-        AsyncMarker,
-        Component,
-        DartType,
-        DynamicType,
-        InterfaceType,
         Library,
+        Name,
+        ReturnStatement,
+        FunctionNode,
+        Class,
+        Expression,
+        DartType,
         LibraryPart,
-        NamedNode,
-        Procedure,
-        ProcedureKind,
+        Component,
+        LibraryDependency,
         Source,
-        TypeParameter;
+        Procedure,
+        TypeParameter,
+        ProcedureKind;
+
+import '../api_prototype/memory_file_system.dart' show MemoryFileSystem;
+
+import 'hybrid_file_system.dart' show HybridFileSystem;
+
+import 'package:kernel/kernel.dart' as kernel show Combinator;
 
 import '../api_prototype/incremental_kernel_generator.dart'
-    show CompilationPosition, isLegalIdentifier, IncrementalKernelGenerator;
+    show IncrementalKernelGenerator, isLegalIdentifier;
 
 import 'builder/builder.dart' show LibraryBuilder;
 
@@ -44,6 +52,7 @@
 import 'library_graph.dart' show LibraryGraph;
 
 import 'kernel/kernel_library_builder.dart' show KernelLibraryBuilder;
+import 'kernel/kernel_shadow_ast.dart' show ShadowVariableDeclaration;
 
 import 'source/source_library_builder.dart' show SourceLibraryBuilder;
 
@@ -51,46 +60,7 @@
 
 import 'uri_translator.dart' show UriTranslator;
 
-import 'modifier.dart' as Modifier;
-
-import '../scanner/token.dart' show Token;
-
-import 'scanner/error_token.dart' show ErrorToken;
-
-import 'scanner/string_scanner.dart' show StringScanner;
-
-import 'dill/built_type_builder.dart' show BuiltTypeBuilder;
-
-import 'kernel/kernel_formal_parameter_builder.dart'
-    show KernelFormalParameterBuilder;
-
-import 'kernel/kernel_procedure_builder.dart' show KernelProcedureBuilder;
-
-import 'builder/class_builder.dart' show ClassBuilder;
-
-import 'kernel/kernel_shadow_ast.dart' show ShadowTypeInferenceEngine;
-
-import 'kernel/body_builder.dart' show BodyBuilder;
-
-import 'kernel/kernel_type_variable_builder.dart'
-    show KernelTypeVariableBuilder;
-
-import 'parser/parser.dart' show Parser;
-
-import 'parser/member_kind.dart' show MemberKind;
-
-import 'scope.dart' show Scope;
-
-import 'type_inference/type_inferrer.dart' show TypeInferrer;
-
-class IncrementalCompilationPosition implements CompilationPosition {
-  final NamedNode kernelNode;
-  final LibraryBuilder libraryBuilder; // will not be null
-  final ClassBuilder classBuilder; // may be null if not inside a class
-
-  IncrementalCompilationPosition(
-      this.kernelNode, this.libraryBuilder, this.classBuilder);
-}
+import 'combinator.dart' show Combinator;
 
 class IncrementalCompiler implements IncrementalKernelGenerator {
   final CompilerContext context;
@@ -101,7 +71,7 @@
 
   DillTarget dillLoadedData;
   Map<Uri, Source> dillLoadedDataUriToSource = <Uri, Source>{};
-  Map<Uri, LibraryBuilder> platformBuilders;
+  List<LibraryBuilder> platformBuilders;
   Map<Uri, LibraryBuilder> userBuilders;
   final Uri initializeFromDillUri;
   bool initializedFromDill = false;
@@ -156,10 +126,10 @@
         }
         summaryBytes = null;
         userBuilders = <Uri, LibraryBuilder>{};
-        platformBuilders = <Uri, LibraryBuilder>{};
+        platformBuilders = <LibraryBuilder>[];
         dillLoadedData.loader.builders.forEach((uri, builder) {
           if (builder.uri.scheme == "dart") {
-            platformBuilders[uri] = builder;
+            platformBuilders.add(builder);
           } else {
             userBuilders[uri] = builder;
           }
@@ -188,11 +158,17 @@
             " of ${userCode.loader.builders.length} libraries");
       }
 
-      reusedLibraries.addAll(platformBuilders.values);
+      reusedLibraries.addAll(platformBuilders);
 
       KernelIncrementalTarget userCodeOld = userCode;
       userCode = new KernelIncrementalTarget(
-          c.fileSystem, false, dillLoadedData, uriTranslator,
+          new HybridFileSystem(
+              new MemoryFileSystem(
+                  new Uri(scheme: "org-dartlang-debug", path: "/")),
+              c.fileSystem),
+          false,
+          dillLoadedData,
+          uriTranslator,
           uriToSource: c.uriToSource);
 
       for (LibraryBuilder library in reusedLibraries) {
@@ -379,189 +355,104 @@
     ticker.logMs("Appended libraries");
   }
 
-  IncrementalCompilationPosition resolveCompilationPosition(Uri libraryUri,
-      [String className]) {
-    if (userCode == null || dillLoadedData == null) return null;
-
-    // Find library.
-    LibraryBuilder enclosingLibrary = userCode.loader.builders[libraryUri];
-    if (enclosingLibrary == null) return null;
-
-    if (className == null) {
-      return new IncrementalCompilationPosition(
-          enclosingLibrary.target, enclosingLibrary, null);
-    }
-
-    ClassBuilder classBuilder = enclosingLibrary.scopeBuilder[className];
-    if (classBuilder == null) return null;
-
-    return new IncrementalCompilationPosition(
-        classBuilder.target, enclosingLibrary, classBuilder);
-  }
-
   @override
   Future<Procedure> compileExpression(
       String expression,
       Map<String, DartType> definitions,
       List<TypeParameter> typeDefinitions,
-      covariant IncrementalCompilationPosition position,
-      [bool isStatic = false]) async {
+      Uri libraryUri,
+      [String className,
+      bool isStatic = false]) async {
     assert(dillLoadedData != null && userCode != null);
 
-    dillLoadedData.loader.seenMessages.clear();
-    userCode.loader.seenMessages.clear();
+    return await context.runInContext((_) async {
+      LibraryBuilder library = userCode.loader.read(libraryUri, -1);
 
-    for (TypeParameter typeParam in typeDefinitions) {
-      if (!isLegalIdentifier(typeParam.name)) return null;
-    }
-    for (String name in definitions.keys) {
-      if (!isLegalIdentifier(name)) return null;
-    }
+      Class kernelClass;
+      if (className != null) {
+        kernelClass = library.scopeBuilder[className]?.target;
+        if (kernelClass == null) return null;
+      }
 
-    String expressionPrefix =
-        '(${definitions.keys.map((name) => "dynamic $name").join(",")}) =>';
+      userCode.loader.seenMessages.clear();
 
-    return context.runInContext((CompilerContext c) async {
-      // Find library builder or report error.
-      bool inClass = position.classBuilder != null;
-      LibraryBuilder enclosingLibraryBuilder = position.libraryBuilder;
-      ClassBuilder classBuilder = position.classBuilder;
-      Library enclosingLibrary = position.libraryBuilder.target;
+      for (TypeParameter typeParam in typeDefinitions) {
+        if (!isLegalIdentifier(typeParam.name)) return null;
+      }
+      for (String name in definitions.keys) {
+        if (!isLegalIdentifier(name)) return null;
+      }
 
-      dillLoadedData.loader.coreTypes = userCode.loader.coreTypes;
-
-      // Create a synthetic KernelLibraryBuilder to hold the compiled procedure.
-      // This ensures that the uri and character offset positions inside the
-      // expression refer to the the expression text, and not to random
-      // positions in the enclosing library's source.
       Uri debugExprUri = new Uri(
           scheme: "org-dartlang-debug", path: "synthetic_debug_expression");
-      KernelLibraryBuilder kernelLibraryBuilder = new KernelLibraryBuilder(
-          debugExprUri,
+
+      KernelLibraryBuilder debugLibrary = new KernelLibraryBuilder(
+          libraryUri,
           debugExprUri,
           userCode.loader,
-          /*actualOrigin=*/ null,
-          enclosingLibrary);
+          null,
+          library.scope.createNestedScope("expression"),
+          library.target);
 
-      // Parse the function prefix.
-      StringScanner scanner = new StringScanner(expressionPrefix);
-      Token startToken = scanner.tokenize();
-      assert(startToken is! ErrorToken);
-      assert(!scanner.hasErrors);
+      if (library is DillLibraryBuilder) {
+        for (LibraryDependency dependency in library.target.dependencies) {
+          if (!dependency.isImport) continue;
 
-      // Parse the expression. By parsing the expression separately from the
-      // function prefix, we ensure that the offsets for tokens coming from the
-      // expression are correct.
-      scanner = new StringScanner(expression);
-      Token expressionStartToken = scanner.tokenize();
-      while (expressionStartToken is ErrorToken) {
-        ErrorToken token = expressionStartToken;
-        // add compile time error
-        kernelLibraryBuilder.addCompileTimeError(token.assertionMessage,
-            token.charOffset, token.endOffset - token.charOffset, debugExprUri);
+          List<Combinator> combinators;
+
+          for (kernel.Combinator combinator in dependency.combinators) {
+            combinators ??= <Combinator>[];
+
+            combinators.add(combinator.isShow
+                ? new Combinator.show(
+                    combinator.names, combinator.fileOffset, library.fileUri)
+                : new Combinator.hide(
+                    combinator.names, combinator.fileOffset, library.fileUri));
+          }
+
+          debugLibrary.addImport(
+              null,
+              dependency.importedLibraryReference.canonicalName.name,
+              null,
+              dependency.name,
+              combinators,
+              dependency.isDeferred,
+              -1,
+              -1,
+              -1);
+        }
+
+        debugLibrary.addImportsToScope();
       }
 
-      var functionLastToken = startToken;
-      while (!functionLastToken.next.isEof) {
-        functionLastToken.offset = -1;
-        functionLastToken = functionLastToken.next;
-      }
-      functionLastToken.offset = -1;
+      HybridFileSystem hfs = userCode.fileSystem;
+      MemoryFileSystem fs = hfs.memory;
+      fs.entityForUri(debugExprUri).writeAsStringSync(expression);
 
-      functionLastToken.next = expressionStartToken;
-      expressionStartToken.previous = functionLastToken;
+      FunctionNode parameters = new FunctionNode(null,
+          typeParameters: typeDefinitions,
+          positionalParameters: definitions.keys
+              .map((name) => new ShadowVariableDeclaration(name, 0))
+              .toList());
 
-      // If we're in a library loaded from a dill file, we'll have to do some
-      // extra work to get the scope setup.
-      if (enclosingLibraryBuilder is DillLibraryBuilder) {
-        dillLoadedData.loader.buildOutline(enclosingLibraryBuilder);
-        Map<Uri, LibraryBuilder> libraries = <Uri, LibraryBuilder>{};
-        if (userBuilders != null) libraries.addAll(userBuilders);
-        libraries.addAll(platformBuilders);
-        enclosingLibraryBuilder.addImportsToScope(libraries);
-      }
-      Scope scope =
-          inClass ? classBuilder.scope : enclosingLibraryBuilder.scope;
+      debugLibrary.build(userCode.loader.coreLibrary, modifyTarget: false);
+      Expression compiledExpression = await userCode.loader.buildExpression(
+          debugLibrary, className, className != null && !isStatic, parameters);
 
-      // Create a [ProcedureBuilder] and a [BodyBuilder] to parse the expression.
-      dynamicType() => new BuiltTypeBuilder(new DynamicType());
-      List<KernelFormalParameterBuilder> formalParameterBuilders =
-          <KernelFormalParameterBuilder>[];
-      definitions.forEach((name, type) {
-        formalParameterBuilders.add(new KernelFormalParameterBuilder(
-            null,
-            Modifier.varMask,
-            new BuiltTypeBuilder(type),
-            name,
-            false,
-            kernelLibraryBuilder,
-            -1));
-      });
-      List<KernelTypeVariableBuilder> typeVariableBuilders =
-          <KernelTypeVariableBuilder>[];
-      typeDefinitions.forEach((TypeParameter typeParam) {
-        typeVariableBuilders.add(new KernelTypeVariableBuilder(
-            typeParam.name,
-            kernelLibraryBuilder,
-            -1,
-            new BuiltTypeBuilder(typeParam.bound),
-            typeParam));
-      });
-      KernelProcedureBuilder procedureBuilder = new KernelProcedureBuilder(
-          /*metadata=*/ null,
-          isStatic ? Modifier.staticMask : Modifier.varMask,
-          dynamicType(),
-          "debugExpr",
-          typeVariableBuilders,
-          formalParameterBuilders,
-          ProcedureKind.Method,
-          kernelLibraryBuilder,
-          /*charOffset=*/ -1,
-          /*charOpenParenOffset=*/ -1,
-          /*charEndOffset=*/ -1);
-      Procedure procedure = procedureBuilder.build(kernelLibraryBuilder);
-      procedure.parent =
-          inClass ? classBuilder.target : kernelLibraryBuilder.target;
-      scope = procedureBuilder.computeTypeParameterScope(scope);
-      Scope formalParamScope =
-          procedureBuilder.computeFormalParameterScope(scope);
-      var typeInferenceEngine = new ShadowTypeInferenceEngine(
-          null, /*strongMode=*/ context.options.strongMode);
-      typeInferenceEngine.prepareTopLevel(
-          userCode.loader.coreTypes, userCode.loader.hierarchy);
-      InterfaceType thisType;
-      if (inClass) {
-        thisType = classBuilder.target.thisType;
-      }
-      TypeInferrer typeInferrer = typeInferenceEngine.createLocalTypeInferrer(
-          debugExprUri, thisType, kernelLibraryBuilder);
-      BodyBuilder bodyBuilder = new BodyBuilder(
-          kernelLibraryBuilder,
-          procedureBuilder,
-          scope,
-          formalParamScope,
-          userCode.loader.hierarchy,
-          userCode.loader.coreTypes,
-          classBuilder,
-          inClass && !isStatic,
-          null /*uri*/,
-          typeInferrer);
-      bodyBuilder.scope = formalParamScope;
+      Procedure procedure = new Procedure(
+          new Name("debugExpr"), ProcedureKind.Method, parameters,
+          isStatic: isStatic);
 
-      // Parse the expression.
-      MemberKind kind = inClass
-          ? (isStatic ? MemberKind.StaticMethod : MemberKind.NonStaticMethod)
-          : MemberKind.TopLevelMethod;
-      Parser parser = new Parser(bodyBuilder);
-      Token token = parser.syntheticPreviousToken(startToken);
-      token = parser.parseFormalParametersOpt(token, kind);
-      var formals = bodyBuilder.pop();
-      bodyBuilder.checkEmpty(token.next.charOffset);
-      parser.parseFunctionBody(
-          token, /*isExpression=*/ true, /*allowAbstract=*/ false);
-      var body = bodyBuilder.pop();
-      bodyBuilder.checkEmpty(token.charOffset);
-      bodyBuilder.finishFunction([], formals, AsyncMarker.Sync, body);
+      parameters.body = new ReturnStatement(compiledExpression)
+        ..parent = parameters;
+
+      procedure.fileUri = debugLibrary.fileUri;
+      procedure.parent = className != null ? kernelClass : library.target;
+
+      userCode.uriToSource.remove(debugExprUri);
+      userCode.loader.sourceBytes.remove(debugExprUri);
+
+      userCode.runProcedureTransformations(procedure);
 
       return procedure;
     });
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 0170666..02d9745 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -19,6 +19,7 @@
 import '../parser.dart'
     show
         Assert,
+        Parser,
         FormalParameterKind,
         IdentifierContext,
         MemberKind,
@@ -84,8 +85,6 @@
 
 import 'kernel_builder.dart';
 
-final Forest _forest = new Fangorn();
-
 // TODO(ahe): Remove this and ensure all nodes have a location.
 const noLocation = null;
 
@@ -183,6 +182,10 @@
   /// and where that was.
   Map<String, int> initializedFields;
 
+  // TODO(ahe): Update type parameters.
+  @override
+  Forest<dynamic, dynamic, Token, dynamic> forest;
+
   BodyBuilder(
       KernelLibraryBuilder library,
       this.member,
@@ -193,7 +196,8 @@
       this.classBuilder,
       this.isInstanceMember,
       this.uri,
-      this._typeInferrer)
+      this._typeInferrer,
+      [this.forest = const Fangorn()])
       : enclosingScope = scope,
         library = library,
         enableNative =
@@ -207,9 +211,6 @@
         typePromoter = _typeInferrer.typePromoter,
         super(scope);
 
-  @override
-  Forest<Expression, Statement, Token, Arguments> get forest => _forest;
-
   bool get hasParserError => recoverableErrors.isNotEmpty;
 
   bool get inConstructor {
@@ -714,6 +715,42 @@
     return expressions;
   }
 
+  @override
+  Expression parseSingleExpression(
+      Parser parser, Token token, FunctionNode parameters) {
+    List<KernelTypeVariableBuilder> typeParameterBuilders;
+    for (TypeParameter typeParameter in parameters.typeParameters) {
+      typeParameterBuilders ??= <KernelTypeVariableBuilder>[];
+      typeParameterBuilders.add(
+          new KernelTypeVariableBuilder.fromKernel(typeParameter, library));
+    }
+    enterFunctionTypeScope(typeParameterBuilders);
+
+    enterLocalScope(
+        null,
+        new FormalParameters(parameters.positionalParameters, null, -1)
+            .computeFormalParameterScope(scope, member, this));
+
+    token = parser.parseExpression(parser.syntheticPreviousToken(token));
+
+    Expression expression = popForValue();
+    Token eof = token.next;
+
+    if (!eof.isEof) {
+      expression = wrapInLocatedCompileTimeError(
+          expression,
+          fasta.messageExpectedOneExpression
+              .withLocation(uri, eof.charOffset, eof.length));
+    }
+
+    ShadowReturnStatement fakeReturn = new ShadowReturnStatement(expression);
+
+    _typeInferrer.inferFunctionBody(
+        this, const DynamicType(), AsyncMarker.Sync, fakeReturn);
+
+    return fakeReturn.expression;
+  }
+
   void finishConstructor(
       KernelConstructorBuilder builder, AsyncMarker asyncModifier) {
     /// Quotes below are from [Dart Programming Language Specification, 4th
@@ -942,8 +979,7 @@
     if (receiver is ThisAccessor && receiver.isSuper) {
       ThisAccessor thisAccessorReceiver = receiver;
       isSuper = true;
-      receiver = new ShadowThisExpression()
-        ..fileOffset = offsetForToken(thisAccessorReceiver.token);
+      receiver = forest.thisExpression(thisAccessorReceiver.token);
     }
     push(buildBinaryOperator(toValue(receiver), token, argument, isSuper));
   }
@@ -966,7 +1002,7 @@
           // evaluating [a] and [b].
           isConstantExpression: !isSuper,
           isSuper: isSuper);
-      return negate ? new ShadowNot(result) : result;
+      return negate ? forest.notExpression(result, null) : result;
     }
   }
 
@@ -1470,8 +1506,7 @@
           expressions.add(forest.literalString(value, last));
         }
       }
-      push(new ShadowStringConcatenation(expressions)
-        ..fileOffset = offsetForToken(endToken));
+      push(forest.stringConcatenationExpression(expressions, endToken));
     }
   }
 
@@ -1507,7 +1542,7 @@
         }
       }
     }
-    push(new ShadowStringConcatenation(expressions ?? parts));
+    push(forest.stringConcatenationExpression(expressions ?? parts, null));
   }
 
   @override
@@ -1787,8 +1822,7 @@
   @override
   void endAwaitExpression(Token keyword, Token endToken) {
     debugEvent("AwaitExpression");
-    push(new ShadowAwaitExpression(popForValue())
-      ..fileOffset = offsetForToken(keyword));
+    push(forest.awaitExpression(popForValue(), keyword));
   }
 
   @override
@@ -1802,25 +1836,30 @@
       int count, Token beginToken, Token constKeyword, Token endToken) {
     debugEvent("LiteralList");
     List<Expression> expressions = popListForValue(count);
-    List<DartType> typeArguments = pop();
+    Object typeArguments = pop();
     DartType typeArgument;
     if (typeArguments != null) {
-      typeArgument = typeArguments.first;
-      if (typeArguments.length > 1) {
-        typeArgument = null;
+      if (forest.getTypeCount(typeArguments) > 1) {
         addProblem(
             fasta.messageListLiteralTooManyTypeArguments,
             offsetForToken(beginToken),
             lengthOfSpan(beginToken, beginToken.endGroup));
-      } else if (library.loader.target.strongMode) {
-        typeArgument = instantiateToBounds(typeArgument, coreTypes.objectClass);
+      } else {
+        typeArgument = forest.getTypeAt(typeArguments, 0);
+        if (library.loader.target.strongMode) {
+          typeArgument =
+              instantiateToBounds(typeArgument, coreTypes.objectClass);
+        }
       }
     }
     push(forest.literalList(
-        typeArgument,
-        expressions,
+        constKeyword,
         constKeyword != null || constantContext == ConstantContext.inferred,
-        constKeyword ?? beginToken));
+        typeArgument,
+        typeArguments,
+        beginToken,
+        expressions,
+        endToken));
   }
 
   @override
@@ -1849,36 +1888,34 @@
     debugEvent("LiteralMap");
     List entries = forest.mapEntryList(count);
     popList(count, entries);
-    List<DartType> typeArguments = pop();
+    Object typeArguments = pop();
     DartType keyType;
     DartType valueType;
     if (typeArguments != null) {
-      if (typeArguments.length != 2) {
-        keyType = null;
-        valueType = null;
+      if (forest.getTypeCount(typeArguments) != 2) {
         addProblem(
             fasta.messageListLiteralTypeArgumentMismatch,
             offsetForToken(beginToken),
             lengthOfSpan(beginToken, beginToken.endGroup));
       } else {
+        keyType = forest.getTypeAt(typeArguments, 0);
+        valueType = forest.getTypeAt(typeArguments, 1);
         if (library.loader.target.strongMode) {
-          keyType =
-              instantiateToBounds(typeArguments[0], coreTypes.objectClass);
-          valueType =
-              instantiateToBounds(typeArguments[1], coreTypes.objectClass);
-        } else {
-          keyType = typeArguments[0];
-          valueType = typeArguments[1];
+          keyType = instantiateToBounds(keyType, coreTypes.objectClass);
+          valueType = instantiateToBounds(valueType, coreTypes.objectClass);
         }
       }
     }
 
     push(forest.literalMap(
+        constKeyword,
+        constKeyword != null || constantContext == ConstantContext.inferred,
         keyType,
         valueType,
+        typeArguments,
+        beginToken,
         entries,
-        constKeyword != null || constantContext == ConstantContext.inferred,
-        constKeyword ?? beginToken));
+        endToken));
   }
 
   @override
@@ -1886,7 +1923,7 @@
     debugEvent("LiteralMapEntry");
     Expression value = popForValue();
     Expression key = popForValue();
-    push(forest.mapEntry(key, value, colon));
+    push(forest.mapEntry(key, colon, value));
   }
 
   String symbolPartToString(name) {
@@ -2008,8 +2045,7 @@
       push(deprecated_buildCompileTimeError(
           "Not a constant expression.", operator.charOffset));
     } else {
-      push(new ShadowAsExpression(expression, type)
-        ..fileOffset = offsetForToken(operator));
+      push(forest.asExpression(expression, type, operator));
     }
   }
 
@@ -2019,11 +2055,7 @@
     DartType type = pop();
     Expression operand = popForValue();
     bool isInverted = not != null;
-    var offset = offsetForToken(operator);
-    Expression isExpression = isInverted
-        ? new ShadowIsNotExpression(operand, type, offset)
-        : new ShadowIsExpression(operand, type)
-      ..fileOffset = offset;
+    Expression isExpression = forest.isExpression(operand, operator, not, type);
     if (operand is VariableGet) {
       typePromoter.handleIsCheck(isExpression, isInverted, operand.variable,
           type, functionNestingLevel);
@@ -2059,9 +2091,8 @@
     Expression thenExpression = pop();
     Expression condition = pop();
     typePromoter.exitConditional();
-    push(new ShadowConditionalExpression(
-        condition, thenExpression, elseExpression)
-      ..fileOffset = question.offset);
+    push(forest.conditionalExpression(
+        condition, question, thenExpression, colon, elseExpression));
   }
 
   @override
@@ -2318,8 +2349,7 @@
     debugEvent("UnaryPrefixExpression");
     var receiver = pop();
     if (optional("!", token)) {
-      push(
-          new ShadowNot(toValue(receiver))..fileOffset = offsetForToken(token));
+      push(forest.notExpression(toValue(receiver), token));
     } else {
       String operator = token.stringValue;
       if (optional("-", token)) {
@@ -2338,8 +2368,7 @@
       Expression receiverValue;
       if (receiver is ThisAccessor && receiver.isSuper) {
         isSuper = true;
-        receiverValue = new ShadowThisExpression()
-          ..fileOffset = offsetForToken(receiver.token);
+        receiverValue = forest.thisExpression(receiver.token);
       } else {
         receiverValue = toValue(receiver);
       }
@@ -3529,7 +3558,9 @@
           name.name, library, offsetForToken(name.token), null);
     }
     variable.parameter.bound = bound;
-    push(variable..finish(library, library.loader.coreLibrary["Object"]));
+    push(variable
+      ..finish(library, library.loader.target.objectClassBuilder,
+          library.loader.target.dynamicType));
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index 566ee45..45c842e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -28,23 +28,33 @@
 import 'kernel_shadow_ast.dart'
     show
         ShadowArguments,
+        ShadowAsExpression,
+        ShadowAwaitExpression,
         ShadowBoolLiteral,
         ShadowCheckLibraryIsLoaded,
+        ShadowConditionalExpression,
         ShadowDoubleLiteral,
         ShadowIntLiteral,
+        ShadowIsExpression,
+        ShadowIsNotExpression,
         ShadowListLiteral,
         ShadowLoadLibrary,
         ShadowMapLiteral,
+        ShadowNot,
         ShadowNullLiteral,
+        ShadowStringConcatenation,
         ShadowStringLiteral,
         ShadowSymbolLiteral,
         ShadowSyntheticExpression,
+        ShadowThisExpression,
         ShadowTypeLiteral;
 
 import 'forest.dart' show Forest;
 
 /// A shadow tree factory.
 class Fangorn extends Forest<Expression, Statement, Token, Arguments> {
+  const Fangorn();
+
   @override
   ShadowArguments arguments(List<Expression> positional, Token token,
       {List<DartType> types, List<NamedExpression> named}) {
@@ -96,19 +106,36 @@
   }
 
   @override
-  ShadowListLiteral literalList(covariant typeArgument,
-      List<Expression> expressions, bool isConst, Token token) {
+  ShadowListLiteral literalList(
+      Token constKeyword,
+      bool isConst,
+      Object typeArgument,
+      Object typeArguments,
+      Token leftBracket,
+      List<Expression> expressions,
+      Token rightBracket) {
+    // TODO(brianwilkerson): The file offset computed below will not be correct
+    // if there are type arguments but no `const` keyword.
     return new ShadowListLiteral(expressions,
         typeArgument: typeArgument, isConst: isConst)
-      ..fileOffset = offsetForToken(token);
+      ..fileOffset = offsetForToken(constKeyword ?? leftBracket);
   }
 
   @override
-  ShadowMapLiteral literalMap(DartType keyType, DartType valueType,
-      List<MapEntry> entries, bool isConst, Token token) {
+  ShadowMapLiteral literalMap(
+      Token constKeyword,
+      bool isConst,
+      DartType keyType,
+      DartType valueType,
+      Object typeArguments,
+      Token leftBracket,
+      List<MapEntry> entries,
+      Token rightBracket) {
+    // TODO(brianwilkerson): The file offset computed below will not be correct
+    // if there are type arguments but no `const` keyword.
     return new ShadowMapLiteral(entries,
         keyType: keyType, valueType: valueType, isConst: isConst)
-      ..fileOffset = offsetForToken(token);
+      ..fileOffset = offsetForToken(constKeyword ?? leftBracket);
   }
 
   @override
@@ -132,8 +159,8 @@
   }
 
   @override
-  MapEntry mapEntry(Expression key, Expression value, Token token) {
-    return new MapEntry(key, value)..fileOffset = offsetForToken(token);
+  MapEntry mapEntry(Expression key, Token colon, Expression value) {
+    return new MapEntry(key, value)..fileOffset = offsetForToken(colon);
   }
 
   @override
@@ -145,6 +172,13 @@
   int readOffset(TreeNode node) => node.fileOffset;
 
   @override
+  int getTypeCount(Object typeArguments) => (typeArguments as List).length;
+
+  @override
+  DartType getTypeAt(Object typeArguments, int index) =>
+      (typeArguments as List)[index];
+
+  @override
   Expression loadLibrary(LibraryDependency dependency) {
     return new ShadowLoadLibrary(dependency);
   }
@@ -155,6 +189,53 @@
   }
 
   @override
+  Expression asExpression(Expression expression, covariant type, Token token) {
+    return new ShadowAsExpression(expression, type)
+      ..fileOffset = offsetForToken(token);
+  }
+
+  @override
+  Expression awaitExpression(Expression operand, Token token) {
+    return new ShadowAwaitExpression(operand)
+      ..fileOffset = offsetForToken(token);
+  }
+
+  @override
+  Expression conditionalExpression(Expression condition, Token question,
+      Expression thenExpression, Token colon, Expression elseExpression) {
+    return new ShadowConditionalExpression(
+        condition, thenExpression, elseExpression)
+      ..fileOffset = offsetForToken(question);
+  }
+
+  @override
+  Expression isExpression(
+      Expression operand, isOperator, Token notOperator, covariant type) {
+    int offset = offsetForToken(isOperator);
+    if (notOperator != null) {
+      return new ShadowIsNotExpression(operand, type, offset);
+    }
+    return new ShadowIsExpression(operand, type)..fileOffset = offset;
+  }
+
+  @override
+  Expression notExpression(Expression operand, Token token) {
+    return new ShadowNot(operand)..fileOffset = offsetForToken(token);
+  }
+
+  @override
+  Expression stringConcatenationExpression(
+      List<Expression> expressions, Token token) {
+    return new ShadowStringConcatenation(expressions)
+      ..fileOffset = offsetForToken(token);
+  }
+
+  @override
+  Expression thisExpression(Token token) {
+    return new ShadowThisExpression()..fileOffset = offsetForToken(token);
+  }
+
+  @override
   bool isErroneousNode(TreeNode node) {
     if (node is ExpressionStatement) {
       ExpressionStatement statement = node;
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 8e79571..81521a1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
@@ -66,16 +66,12 @@
         KernelClassBuilder,
         KernelFunctionTypeAliasBuilder,
         KernelInvalidTypeBuilder,
-        KernelLibraryBuilder,
         KernelPrefixBuilder,
         KernelTypeVariableBuilder,
         LibraryBuilder,
         LoadLibraryBuilder,
         PrefixBuilder,
-        TypeDeclarationBuilder,
-        KernelTypeBuilder;
-
-import 'type_algorithms.dart' show calculateBoundsForDeclaration;
+        TypeDeclarationBuilder;
 
 abstract class BuilderHelper<Arguments> {
   LibraryBuilder get library;
@@ -88,7 +84,8 @@
 
   ConstantContext get constantContext;
 
-  Forest<Expression, Statement, Token, Arguments> get forest;
+  // TODO(ahe): Update type parameters.
+  Forest<dynamic, dynamic, Token, dynamic> get forest;
 
   Constructor lookupConstructor(Name name, {bool isSuper});
 
@@ -434,7 +431,7 @@
 
   Expression buildSimpleRead() {
     if (!isSuper) {
-      return new ShadowThisExpression()..fileOffset = offsetForToken(token);
+      return forest.thisExpression(token);
     } else {
       return helper.buildCompileTimeError(messageSuperAsExpression,
           offsetForToken(token), lengthForToken(token));
@@ -471,7 +468,7 @@
         helper.warnUnresolvedMethod(name, offsetForToken(send.token),
             isSuper: isSuper);
       }
-      return helper.buildMethodInvocation(new ShadowThisExpression(), name,
+      return helper.buildMethodInvocation(forest.thisExpression(null), name,
           send.arguments, offsetForToken(send.token),
           isSuper: isSuper, interfaceTarget: getter);
     } else {
@@ -495,7 +492,7 @@
           messageSuperAsExpression, offset, noLength);
     } else {
       return helper.buildMethodInvocation(
-          new ShadowThisExpression(), callName, arguments, offset,
+          forest.thisExpression(null), callName, arguments, offset,
           isImplicitCall: true);
     }
   }
@@ -1073,7 +1070,7 @@
       interfaceTarget = null;
     }
     return helper.buildMethodInvocation(
-        new ShadowThisExpression(), name, arguments, offset,
+        forest.thisExpression(null), name, arguments, offset,
         interfaceTarget: interfaceTarget);
   }
 
@@ -1303,27 +1300,12 @@
     }
 
     DartType type;
-    LibraryBuilder helperLibrary = helper.library;
-    if (arguments == null &&
-        helperLibrary is KernelLibraryBuilder &&
-        helperLibrary.loader.target.strongMode) {
+    if (arguments == null) {
       TypeDeclarationBuilder typeDeclaration = declaration;
       if (typeDeclaration is KernelClassBuilder) {
-        typeDeclaration.calculatedBounds ??= calculateBoundsForDeclaration(
-            typeDeclaration,
-            helperLibrary.loader.target.dynamicType,
-            helperLibrary.loader.target.bottomType,
-            helperLibrary.loader.target.objectClassBuilder);
-        type = typeDeclaration.buildType(
-            helper.library, typeDeclaration.calculatedBounds);
+        type = typeDeclaration.buildType(helper.library, null);
       } else if (typeDeclaration is KernelFunctionTypeAliasBuilder) {
-        typeDeclaration.calculatedBounds ??= calculateBoundsForDeclaration(
-            typeDeclaration,
-            helperLibrary.loader.target.dynamicType,
-            helperLibrary.loader.target.bottomType,
-            helperLibrary.loader.target.objectClassBuilder);
-        type = typeDeclaration.buildType(
-            helper.library, typeDeclaration.calculatedBounds);
+        type = typeDeclaration.buildType(helper.library, null);
       }
     }
     if (type == null) {
@@ -1337,41 +1319,6 @@
     return type;
   }
 
-  DartType buildType(List<KernelTypeBuilder> arguments,
-      {bool nonInstanceAccessIsError: false}) {
-    if (arguments != null) {
-      int expected = 0;
-      if (declaration is KernelClassBuilder) {
-        expected = declaration.target.typeParameters.length;
-      } else if (declaration is FunctionTypeAliasBuilder) {
-        expected = declaration.target.typeParameters.length;
-      } else if (declaration is KernelTypeVariableBuilder) {
-        // Type arguments on a type variable - error reported elsewhere.
-      } else {
-        return unhandled(
-            "${declaration.runtimeType}",
-            "TypeDeclarationAccessor.buildType",
-            offsetForToken(token),
-            helper.uri);
-      }
-      if (arguments.length != expected) {
-        helper.warnTypeArgumentsMismatch(
-            declaration.name, expected, offsetForToken(token));
-        // We ignore the provided arguments, which will in turn return the
-        // raw type below.
-        // TODO(sigmund): change to use an InvalidType and include the raw type
-        // as a recovery node once the IR can represent it (Issue #29840).
-        arguments = null;
-      }
-    }
-    DartType type = declaration.buildType(helper.library, arguments);
-    if (type is TypeParameterType) {
-      return helper.validatedTypeVariableUse(
-          type, offsetForToken(token), nonInstanceAccessIsError);
-    }
-    return type;
-  }
-
   @override
   Expression doInvocation(int offset, Arguments arguments) {
     return helper.buildConstructorInvocation(declaration, token, arguments, "",
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index c9a526c..49d9333 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -6,9 +6,14 @@
 
 // TODO(ahe): Remove this import.
 import 'package:kernel/ast.dart' as kernel show Arguments;
+import 'package:kernel/ast.dart';
 
 /// A tree factory.
+///
+/// For now, the [Location] is always a token.
 abstract class Forest<Expression, Statement, Location, Arguments> {
+  const Forest();
+
   Arguments arguments(List<Expression> positional, Location location,
       {covariant List types, covariant List named});
 
@@ -24,36 +29,125 @@
 
   Expression asLiteralString(Expression value);
 
+  /// Return a representation of a boolean literal at the given [location]. The
+  /// literal has the given [value].
   Expression literalBool(bool value, Location location);
 
+  /// Return a representation of a double literal at the given [location]. The
+  /// literal has the given [value].
   Expression literalDouble(double value, Location location);
 
+  /// Return a representation of an integer literal at the given [location]. The
+  /// literal has the given [value].
   Expression literalInt(int value, Location location);
 
-  Expression literalList(covariant typeArgument, List<Expression> expressions,
-      bool isConst, Location location);
+  /// Return a representation of a list literal. The [constKeyword] is the
+  /// location of the `const` keyword, or `null` if there is no keyword. The
+  /// [isConst] is `true` if either the `const` keyword is not-`null` or if the
+  /// list literal is in a const context. The [typeArgument] is the
+  /// representation of the single valid type argument preceding the list
+  /// literal, or `null` if there is no type argument, there is more than one
+  /// type argument, or if the type argument cannot be resolved. The
+  /// [typeArguments] is the representation of all of the type arguments
+  /// preceding the list literal, or `null` if there are no type arguments. The
+  /// [leftBracket] is the location of the `[`. The list of [expressions] is a
+  /// list of the representations of the list elements. The [rightBracket] is
+  /// the location of the `]`.
+  Expression literalList(
+      Location constKeyword,
+      bool isConst,
+      Object typeArgument,
+      Object typeArguments,
+      Location leftBracket,
+      List<Expression> expressions,
+      Location rightBracket);
 
-  Expression literalMap(covariant keyType, covariant valueType,
-      covariant List entries, bool isConst, Location location);
+  /// Return a representation of a map literal. The [constKeyword] is the
+  /// location of the `const` keyword, or `null` if there is no keyword. The
+  /// [isConst] is `true` if either the `const` keyword is not-`null` or if the
+  /// map literal is in a const context. The [keyType] is the representation of
+  /// the first type argument preceding the map literal, or `null` if there are
+  /// not exactly two type arguments or if the first type argument cannot be
+  /// resolved. The [valueType] is the representation of the second type
+  /// argument preceding the map literal, or `null` if there are not exactly two
+  /// type arguments or if the second type argument cannot be resolved. The
+  /// [typeArguments] is the representation of all of the type arguments
+  /// preceding the map literal, or `null` if there are no type arguments. The
+  /// [leftBracket] is the location of the `{`. The list of [entries] is a
+  /// list of the representations of the map entries. The [rightBracket] is
+  /// the location of the `}`.
+  Expression literalMap(
+      Location constKeyword,
+      bool isConst,
+      covariant keyType,
+      covariant valueType,
+      Object typeArguments,
+      Location leftBracket,
+      covariant List entries,
+      Location rightBracket);
 
+  /// Return a representation of a null literal at the given [location].
   Expression literalNull(Location location);
 
+  /// Return a representation of a simple string literal at the given
+  /// [location]. The literal has the given [value]. This does not include
+  /// either adjacent strings or interpolated strings.
   Expression literalString(String value, Location location);
 
   Expression literalSymbol(String value, Location location);
 
   Expression literalType(covariant type, Location location);
 
-  Object mapEntry(Expression key, Expression value, Location location);
+  /// Return a representation of a key/value pair in a literal map. The [key] is
+  /// the representation of the expression used to compute the key. The [colon]
+  /// is the location of the colon separating the key and the value. The [value]
+  /// is the representation of the expression used to compute the value.
+  Object mapEntry(Expression key, Location colon, Expression value);
 
+  /// Return a list that can hold [length] representations of map entries, as
+  /// returned from [mapEntry].
   List mapEntryList(int length);
 
   int readOffset(covariant node);
 
+  /// Given a representation of a list of [typeArguments], return the number of
+  /// type arguments in the list.
+  int getTypeCount(Object typeArguments);
+
+  /// Given a representation of a list of [typeArguments], return the type
+  /// associated with the argument at the given [index].
+  DartType getTypeAt(Object typeArguments, int index);
+
   Expression loadLibrary(covariant dependency);
 
   Expression checkLibraryIsLoaded(covariant dependency);
 
+  Expression asExpression(
+      Expression expression, covariant type, Location location);
+
+  Expression awaitExpression(Expression operand, Location location);
+
+  /// Return a representation of a conditional expression. The [condition] is
+  /// the condition. The [question] is the `?`. The [thenExpression] is the
+  /// expression following the question mark. The [colon] is the `:`. The
+  /// [elseExpression] is the expression following the colon.
+  Expression conditionalExpression(Expression condition, Location question,
+      Expression thenExpression, Location colon, Expression elseExpression);
+
+  /// Return a representation of an `is` expression. The [operand] is the
+  /// representation of the left operand. The [isOperator] is the `is` operator.
+  /// The [notOperator] is either the `!` or `null` if the test is not negated.
+  /// The [type] is a representation of the type that is the right operand.
+  Expression isExpression(Expression operand, Location isOperator,
+      Location notOperator, covariant type);
+
+  Expression notExpression(Expression operand, Location location);
+
+  Expression stringConcatenationExpression(
+      List<Expression> expressions, Location location);
+
+  Expression thisExpression(Location location);
+
   bool isErroneousNode(covariant node);
 
   // TODO(ahe): Remove this method when all users are moved here.
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
index 6b91235..d384b5a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
@@ -61,15 +61,12 @@
 
 export 'kernel_shadow_ast.dart'
     show
-        ShadowAsExpression,
         ShadowAssertInitializer,
         ShadowAssertStatement,
-        ShadowAwaitExpression,
         ShadowBlock,
         ShadowBreakStatement,
         ShadowCascadeExpression,
         ShadowComplexAssignment,
-        ShadowConditionalExpression,
         ShadowConstructorInvocation,
         ShadowContinueSwitchStatement,
         ShadowDeferredCheck,
@@ -86,14 +83,12 @@
         ShadowIllegalAssignment,
         ShadowIndexAssign,
         ShadowInvalidInitializer,
-        ShadowIsExpression,
         ShadowIsNotExpression,
         ShadowLabeledStatement,
         ShadowLogicalExpression,
         ShadowLoopAssignmentStatement,
         ShadowMethodInvocation,
         ShadowNamedFunctionExpression,
-        ShadowNot,
         ShadowNullAwareMethodInvocation,
         ShadowPropertyAssign,
         ShadowRedirectingInitializer,
@@ -102,13 +97,11 @@
         ShadowStaticAssignment,
         ShadowStaticGet,
         ShadowStaticInvocation,
-        ShadowStringConcatenation,
         ShadowSuperInitializer,
         ShadowSuperMethodInvocation,
         ShadowSuperPropertyGet,
         ShadowSwitchStatement,
         ShadowSyntheticExpression,
-        ShadowThisExpression,
         ShadowThrow,
         ShadowTryCatch,
         ShadowTryFinally,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
index a225661..aa4860e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
@@ -49,28 +49,12 @@
     show
         Combinator,
         Constructor,
-        DartType,
-        DynamicType,
         Initializer,
         Procedure,
-        RedirectingInitializer,
-        TypeParameter;
-
-import '../builder/builder.dart' show LibraryBuilder;
+        RedirectingInitializer;
 
 import '../combinator.dart' as fasta;
 
-List<DartType> computeDefaultTypeArguments(LibraryBuilder library,
-    List<TypeParameter> typeParameters, List<DartType> arguments) {
-  // TODO(scheglov): Use TypeSchemaEnvironment.instantiateToBounds
-  if (arguments == null || arguments.length != typeParameters.length) {
-    // TODO(scheglov): Check that we report a warning.
-    return new List<DartType>.filled(
-        typeParameters.length, const DynamicType());
-  }
-  return arguments;
-}
-
 int compareProcedures(Procedure a, Procedure b) {
   int i = "${a.fileUri}".compareTo("${b.fileUri}");
   if (i != 0) return i;
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 59f4546..884971a 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
@@ -56,7 +56,8 @@
         templateOverrideTypeMismatchParameter,
         templateOverrideTypeMismatchReturnType,
         templateOverrideTypeVariablesMismatch,
-        templateRedirectionTargetNotFound;
+        templateRedirectionTargetNotFound,
+        templateTypeArgumentMismatch;
 
 import '../names.dart' show noSuchMethodName;
 
@@ -79,9 +80,7 @@
         MetadataBuilder,
         ProcedureBuilder,
         Scope,
-        TypeVariableBuilder,
-        TypeBuilder,
-        computeDefaultTypeArguments;
+        TypeVariableBuilder;
 
 import 'redirecting_factory_body.dart' show RedirectingFactoryBody;
 
@@ -89,9 +88,6 @@
     extends ClassBuilder<KernelTypeBuilder, InterfaceType> {
   KernelClassBuilder actualOrigin;
 
-  @override
-  List<TypeBuilder> calculatedBounds;
-
   KernelClassBuilder(
       List<MetadataBuilder> metadata,
       int modifiers,
@@ -127,37 +123,49 @@
 
   List<DartType> buildTypeArguments(
       LibraryBuilder library, List<KernelTypeBuilder> arguments) {
-    List<DartType> typeArguments = <DartType>[];
-    for (KernelTypeBuilder builder in arguments) {
-      DartType type = builder.build(library);
-      if (type == null) {
-        unhandled("${builder.runtimeType}", "buildTypeArguments", -1, null);
-      }
-      typeArguments.add(type);
+    if (arguments == null && typeVariables == null) {
+      return <DartType>[];
     }
-    return computeDefaultTypeArguments(
-        library, cls.typeParameters, typeArguments);
+
+    if (arguments == null && typeVariables != null) {
+      List<DartType> result =
+          new List<DartType>.filled(typeVariables.length, null);
+      for (int i = 0; i < result.length; ++i) {
+        result[i] = typeVariables[i].defaultType.build(library);
+      }
+      return result;
+    }
+
+    if (arguments != null && arguments.length != (typeVariables?.length ?? 0)) {
+      // That should be caught and reported as a compile-time error earlier.
+      return unhandled(
+          templateTypeArgumentMismatch
+              .withArguments(name, typeVariables.length.toString())
+              .message,
+          "buildTypeArguments",
+          -1,
+          null);
+    }
+
+    // arguments.length == typeVariables.length
+    List<DartType> result = new List<DartType>.filled(arguments.length, null);
+    for (int i = 0; i < result.length; ++i) {
+      result[i] = arguments[i].build(library);
+    }
+    return result;
   }
 
+  /// If [arguments] are null, the default types for the variables are used.
   InterfaceType buildType(
       LibraryBuilder library, List<KernelTypeBuilder> arguments) {
-    arguments ??= calculatedBounds;
-    List<DartType> typeArguments;
-    if (arguments != null) {
-      typeArguments = buildTypeArguments(library, arguments);
-    }
-    return buildTypesWithBuiltArguments(library, typeArguments);
+    return buildTypesWithBuiltArguments(
+        library, buildTypeArguments(library, arguments));
   }
 
   Supertype buildSupertype(
       LibraryBuilder library, List<KernelTypeBuilder> arguments) {
     Class cls = isPatch ? origin.target : this.cls;
-    arguments ??= calculatedBounds;
-    if (arguments != null) {
-      return new Supertype(cls, buildTypeArguments(library, arguments));
-    } else {
-      return cls.asRawSupertype;
-    }
+    return new Supertype(cls, buildTypeArguments(library, arguments));
   }
 
   Supertype buildMixedInType(
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
index 28105fd..1830ea2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
@@ -12,9 +12,9 @@
 import 'kernel_builder.dart'
     show
         FormalParameterBuilder,
+        KernelLibraryBuilder,
         KernelTypeBuilder,
-        MetadataBuilder,
-        LibraryBuilder;
+        MetadataBuilder;
 
 import 'package:front_end/src/fasta/source/source_library_builder.dart'
     show SourceLibraryBuilder;
@@ -30,7 +30,7 @@
       KernelTypeBuilder type,
       String name,
       bool hasThis,
-      LibraryBuilder compilationUnit,
+      KernelLibraryBuilder compilationUnit,
       this.charOffset)
       : super(metadata, modifiers, type, name, hasThis, compilationUnit,
             charOffset);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart
index d91de6e..99d686f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart
@@ -15,7 +15,10 @@
 
 import 'package:kernel/type_algebra.dart' show substitute;
 
-import '../fasta_codes.dart' show noLength, templateCyclicTypedef;
+import '../fasta_codes.dart'
+    show noLength, templateCyclicTypedef, templateTypeArgumentMismatch;
+
+import '../problems.dart' show unhandled;
 
 import 'kernel_builder.dart'
     show
@@ -25,9 +28,7 @@
         KernelTypeVariableBuilder,
         LibraryBuilder,
         MetadataBuilder,
-        TypeVariableBuilder,
-        TypeBuilder,
-        computeDefaultTypeArguments;
+        TypeVariableBuilder;
 
 class KernelFunctionTypeAliasBuilder
     extends FunctionTypeAliasBuilder<KernelFunctionTypeBuilder, DartType> {
@@ -35,9 +36,6 @@
 
   DartType thisType;
 
-  @override
-  List<TypeBuilder> calculatedBounds;
-
   KernelFunctionTypeAliasBuilder(
       List<MetadataBuilder> metadata,
       String name,
@@ -88,8 +86,6 @@
     if (const DynamicType() == thisType) return thisType;
     FunctionType result = thisType;
     if (target.typeParameters.isEmpty && arguments == null) return result;
-    arguments =
-        computeDefaultTypeArguments(library, target.typeParameters, arguments);
     Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{};
     for (int i = 0; i < target.typeParameters.length; i++) {
       substitution[target.typeParameters[i]] = arguments[i];
@@ -97,24 +93,53 @@
     return substitute(result, substitution);
   }
 
+  List<DartType> buildTypeArguments(
+      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
+    if (arguments == null && typeVariables == null) {
+      return <DartType>[];
+    }
+
+    if (arguments == null && typeVariables != null) {
+      List<DartType> result =
+          new List<DartType>.filled(typeVariables.length, null);
+      for (int i = 0; i < result.length; ++i) {
+        result[i] = typeVariables[i].defaultType.build(library);
+      }
+      return result;
+    }
+
+    if (arguments != null && arguments.length != (typeVariables?.length ?? 0)) {
+      // That should be caught and reported as a compile-time error earlier.
+      return unhandled(
+          templateTypeArgumentMismatch
+              .withArguments(name, typeVariables.length.toString())
+              .message,
+          "buildTypeArguments",
+          -1,
+          null);
+    }
+
+    // arguments.length == typeVariables.length
+    List<DartType> result = new List<DartType>.filled(arguments.length, null);
+    for (int i = 0; i < result.length; ++i) {
+      result[i] = arguments[i].build(library);
+    }
+    return result;
+  }
+
+  /// If [arguments] are null, the default types for the variables are used.
   @override
   int get typeVariablesCount => typeVariables?.length ?? 0;
 
   @override
   DartType buildType(
       LibraryBuilder library, List<KernelTypeBuilder> arguments) {
-    arguments ??= calculatedBounds;
     var thisType = buildThisType(library);
     if (thisType is DynamicType) return thisType;
     FunctionType result = thisType;
     if (target.typeParameters.isEmpty && arguments == null) return result;
     // Otherwise, substitute.
-    List<DartType> builtArguments = <DartType>[];
-    if (arguments != null) {
-      for (int i = 0; i < arguments.length; i++) {
-        builtArguments.add(arguments[i].build(library));
-      }
-    }
-    return buildTypesWithBuiltArguments(library, builtArguments);
+    return buildTypesWithBuiltArguments(
+        library, buildTypeArguments(library, arguments));
   }
 }
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 0a02326..463f5b4 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
@@ -112,11 +112,10 @@
   Map<String, String> unserializableExports;
 
   KernelLibraryBuilder(Uri uri, Uri fileUri, Loader loader, this.actualOrigin,
-      [Library intendedTarget])
-      : library = intendedTarget ??
-            actualOrigin?.library ??
-            new Library(uri, fileUri: fileUri),
-        super(loader, fileUri);
+      [Scope scope, Library target])
+      : library = target ??
+            (actualOrigin?.library ?? new Library(uri, fileUri: fileUri)),
+        super(loader, fileUri, scope);
 
   @override
   KernelLibraryBuilder get origin => actualOrigin ?? this;
@@ -831,13 +830,16 @@
   }
 
   @override
-  Library build(LibraryBuilder coreLibrary) {
+  Library build(LibraryBuilder coreLibrary, {bool modifyTarget}) {
     super.build(coreLibrary);
 
+    if (modifyTarget == false) return library;
+
     addDependencies(library, new Set<KernelLibraryBuilder>());
 
     loader.target.metadataCollector
         ?.setDocumentationComment(library, documentationComment);
+
     library.name = name;
     library.procedures.sort(compareProcedures);
 
@@ -979,10 +981,10 @@
     return copy;
   }
 
-  int finishTypeVariables(ClassBuilder object) {
+  int finishTypeVariables(ClassBuilder object, TypeBuilder dynamicType) {
     int count = boundlessTypeVariables.length;
     for (KernelTypeVariableBuilder builder in boundlessTypeVariables) {
-      builder.finish(this, object);
+      builder.finish(this, object, dynamicType);
     }
     boundlessTypeVariables.clear();
     return count;
@@ -992,24 +994,42 @@
       ClassBuilder objectClass) {
     int count = 0;
 
-    for (var declarationBuilder in libraryDeclaration.members.values) {
-      if (declarationBuilder is KernelClassBuilder) {
-        if (declarationBuilder.typeVariables != null) {
-          declarationBuilder.calculatedBounds = calculateBounds(
-              declarationBuilder.typeVariables,
-              dynamicType,
-              bottomType,
-              objectClass);
-          count += declarationBuilder.calculatedBounds.length;
+    for (var declaration in libraryDeclaration.members.values) {
+      if (declaration is KernelClassBuilder) {
+        if (declaration.typeVariables != null) {
+          List<KernelTypeBuilder> calculatedBounds;
+          if (loader.target.strongMode) {
+            calculatedBounds = calculateBounds(declaration.typeVariables,
+                dynamicType, bottomType, objectClass);
+          } else {
+            calculatedBounds =
+                new List<KernelTypeBuilder>(declaration.typeVariables.length);
+            for (int i = 0; i < calculatedBounds.length; ++i) {
+              calculatedBounds[i] = dynamicType;
+            }
+          }
+          for (int i = 0; i < calculatedBounds.length; ++i) {
+            declaration.typeVariables[i].defaultType = calculatedBounds[i];
+          }
+          count += calculatedBounds.length;
         }
-      } else if (declarationBuilder is KernelFunctionTypeAliasBuilder) {
-        if (declarationBuilder.typeVariables != null) {
-          declarationBuilder.calculatedBounds = calculateBounds(
-              declarationBuilder.typeVariables,
-              dynamicType,
-              bottomType,
-              objectClass);
-          count += declarationBuilder.calculatedBounds.length;
+      } else if (declaration is KernelFunctionTypeAliasBuilder) {
+        if (declaration.typeVariables != null) {
+          List<KernelTypeBuilder> calculatedBounds;
+          if (loader.target.strongMode) {
+            calculatedBounds = calculateBounds(declaration.typeVariables,
+                dynamicType, bottomType, objectClass);
+          } else {
+            calculatedBounds =
+                new List<KernelTypeBuilder>(declaration.typeVariables.length);
+            for (int i = 0; i < calculatedBounds.length; ++i) {
+              calculatedBounds[i] = dynamicType;
+            }
+          }
+          for (int i = 0; i < calculatedBounds.length; ++i) {
+            declaration.typeVariables[i].defaultType = calculatedBounds[i];
+          }
+          count += calculatedBounds.length;
         }
       }
     }
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 d27cf0d..96b6930 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -14,6 +14,7 @@
         Class,
         Constructor,
         DartType,
+        Procedure,
         DynamicType,
         EmptyStatement,
         Expression,
@@ -28,7 +29,6 @@
         Name,
         NamedExpression,
         NullLiteral,
-        Procedure,
         ProcedureKind,
         Component,
         Source,
@@ -106,6 +106,9 @@
   /// Shared with [CompilerContext].
   final Map<Uri, Source> uriToSource;
 
+  /// The [MetadataCollector] to write metadata to.
+  final MetadataCollector metadataCollector;
+
   SourceLoader<Library> loader;
 
   Component component;
@@ -130,8 +133,8 @@
       {Map<Uri, Source> uriToSource, MetadataCollector metadataCollector})
       : dillTarget = dillTarget,
         uriToSource = uriToSource ?? CompilerContext.current.uriToSource,
-        super(dillTarget.ticker, uriTranslator, dillTarget.backendTarget,
-            metadataCollector) {
+        metadataCollector = metadataCollector,
+        super(dillTarget.ticker, uriTranslator, dillTarget.backendTarget) {
     resetCrashReporting();
     loader = createLoader();
   }
@@ -242,7 +245,7 @@
       loader.instantiateToBound(dynamicType, bottomType, objectClassBuilder);
       List<SourceClassBuilder> myClasses = collectMyClasses();
       loader.checkSemantics(myClasses);
-      loader.finishTypeVariables(objectClassBuilder);
+      loader.finishTypeVariables(objectClassBuilder, dynamicType);
       loader.buildComponent();
       installDefaultSupertypes();
       installDefaultConstructors(myClasses);
@@ -710,6 +713,12 @@
         logger: (String msg) => ticker.logMs(msg));
   }
 
+  void runProcedureTransformations(Procedure procedure) {
+    backendTarget.performTransformationsOnProcedure(
+        loader.coreTypes, loader.hierarchy, procedure,
+        logger: (String msg) => ticker.logMs(msg));
+  }
+
   void verify() {
     errors.addAll(verifyComponent(component));
     ticker.logMs("Verified component");
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
index 485a005..1290f11 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
@@ -37,6 +37,11 @@
             : (new TypeParameter(name, null)..fileOffset = charOffset),
         super(name, bound, compilationUnit, charOffset);
 
+  KernelTypeVariableBuilder.fromKernel(
+      TypeParameter parameter, KernelLibraryBuilder compilationUnit)
+      : actualParameter = parameter,
+        super(parameter.name, null, compilationUnit, parameter.fileOffset);
+
   @override
   KernelTypeVariableBuilder get origin => actualOrigin ?? this;
 
@@ -72,10 +77,13 @@
     return new KernelNamedTypeBuilder(name, null)..bind(this);
   }
 
-  void finish(LibraryBuilder library, KernelClassBuilder object) {
+  void finish(LibraryBuilder library, KernelClassBuilder object,
+      TypeBuilder dynamicType) {
     if (isPatch) return;
     parameter.bound ??=
         bound?.build(library) ?? object.buildType(library, null);
+    parameter.defaultType ??=
+        defaultType?.build(library) ?? dynamicType.build(library);
   }
 
   void applyPatch(covariant KernelTypeVariableBuilder patch) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
index a48b328..fa6795b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -11,12 +11,10 @@
         KernelNamedTypeBuilder,
         KernelTypeVariableBuilder,
         KernelClassBuilder,
-        KernelFunctionTypeAliasBuilder,
         KernelFunctionTypeBuilder,
         NamedTypeBuilder,
         FormalParameterBuilder,
-        FunctionTypeBuilder,
-        TypeDeclarationBuilder;
+        FunctionTypeBuilder;
 
 import 'package:kernel/util/graph.dart' show Graph, computeStrongComponents;
 
@@ -184,42 +182,6 @@
   return bounds;
 }
 
-List<KernelTypeBuilder> calculateBoundsForDeclaration(
-    TypeDeclarationBuilder typeDeclarationBuilder,
-    KernelTypeBuilder dynamicType,
-    KernelTypeBuilder nullType,
-    KernelClassBuilder objectClass) {
-  List<TypeVariableBuilder> typeParameters;
-
-  if (typeDeclarationBuilder is KernelClassBuilder) {
-    typeParameters = typeDeclarationBuilder.typeVariables;
-  } else if (typeDeclarationBuilder is KernelFunctionTypeAliasBuilder) {
-    typeParameters = typeDeclarationBuilder.typeVariables;
-  }
-
-  if (typeParameters == null || typeParameters.length == 0) {
-    return null;
-  }
-
-  return calculateBounds(typeParameters, dynamicType, nullType, objectClass);
-}
-
-int instantiateToBoundInPlace(
-    NamedTypeBuilder typeBuilder,
-    KernelTypeBuilder dynamicType,
-    KernelTypeBuilder nullType,
-    KernelClassBuilder objectClass) {
-  int count = 0;
-
-  if (typeBuilder.arguments == null) {
-    typeBuilder.arguments = calculateBoundsForDeclaration(
-        typeBuilder.builder, dynamicType, nullType, objectClass);
-    count = typeBuilder.arguments?.length ?? 0;
-  }
-
-  return count;
-}
-
 /// Graph of mutual dependencies of type variables from the same declaration.
 /// Type variables are represented by their indices in the corresponding
 /// declaration.
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
index 0199b13..9d57e58 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
@@ -54,10 +54,7 @@
       isContinuation: true);
 
   /// Identifier is the name being declared by a typedef declaration.
-  static const typedefDeclaration = const IdentifierContext(
-      'typedefDeclaration',
-      inDeclaration: true,
-      isBuiltInIdentifierAllowed: false);
+  static const typedefDeclaration = const TypedefDeclarationIdentifierContext();
 
   /// Identifier is a field initializer in a formal parameter list (i.e. it
   /// appears directly after `this.`).
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
index 000b2f2..99a9c48 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
@@ -15,9 +15,9 @@
 import 'type_info.dart'
     show insertSyntheticIdentifierAfter, isValidTypeReference;
 
-import 'util.dart' show optional;
+import 'util.dart' show optional, skipMetadata;
 
-/// See [IdentifierContext].classOrNamedMixin
+/// See [IdentifierContext.classOrNamedMixinDeclaration].
 class ClassOrNamedMixinIdentifierContext extends IdentifierContext {
   const ClassOrNamedMixinIdentifierContext()
       : super('classOrNamedMixinDeclaration',
@@ -53,7 +53,7 @@
   }
 }
 
-/// See [IdentifierContext].dottedName
+/// See [IdentifierContext.dottedName].
 class DottedNameIdentifierContext extends IdentifierContext {
   const DottedNameIdentifierContext() : super('dottedName');
 
@@ -95,7 +95,7 @@
   }
 }
 
-/// See [IdentifierContext].expression
+/// See [IdentifierContext.expression].
 class ExpressionIdentifierContext extends IdentifierContext {
   const ExpressionIdentifierContext()
       : super('expression', isScopeReference: true);
@@ -145,6 +145,7 @@
   }
 }
 
+/// See [IdentifierContext.fieldDeclaration].
 class FieldDeclarationIdentifierContext extends IdentifierContext {
   const FieldDeclarationIdentifierContext()
       : super('fieldDeclaration', inDeclaration: true);
@@ -175,7 +176,7 @@
   }
 }
 
-/// See [IdentifierContext].fieldInitializer
+/// See [IdentifierContext.fieldInitializer].
 class FieldInitializerIdentifierContext extends IdentifierContext {
   const FieldInitializerIdentifierContext()
       : super('fieldInitializer', isContinuation: true);
@@ -234,7 +235,7 @@
   }
 }
 
-/// See [IdentifierContext].libraryName
+/// See [IdentifierContext.libraryName].
 class LibraryIdentifierContext extends IdentifierContext {
   const LibraryIdentifierContext()
       : super('libraryName', inLibraryOrPartOfDeclaration: true);
@@ -276,7 +277,7 @@
   }
 }
 
-/// See [IdentifierContext].localVariableDeclaration
+/// See [IdentifierContext.localVariableDeclaration].
 class LocalVariableDeclarationIdentifierContext extends IdentifierContext {
   const LocalVariableDeclarationIdentifierContext()
       : super('localVariableDeclaration', inDeclaration: true);
@@ -308,6 +309,7 @@
   }
 }
 
+/// See [IdentifierContext.methodDeclaration].
 class MethodDeclarationIdentifierContext extends IdentifierContext {
   const MethodDeclarationIdentifierContext()
       : super('methodDeclaration', inDeclaration: true);
@@ -346,7 +348,44 @@
   }
 }
 
-/// See [IdentifierContext].typeReference
+/// See [IdentifierContext].typedefDeclaration
+class TypedefDeclarationIdentifierContext extends IdentifierContext {
+  const TypedefDeclarationIdentifierContext()
+      : super('typedefDeclaration',
+            inDeclaration: true, isBuiltInIdentifierAllowed: false);
+
+  @override
+  Token ensureIdentifier(Token token, Parser parser) {
+    Token identifier = token.next;
+    assert(identifier.kind != IDENTIFIER_TOKEN);
+    if (identifier.type.isPseudo) {
+      return identifier;
+    }
+
+    // Recovery
+    const followingValues = const ['(', '<', '=', ';', 'var'];
+    if (identifier.type.isBuiltIn &&
+        isOneOfOrEof(identifier.next, followingValues)) {
+      parser.reportRecoverableErrorWithToken(
+          identifier, fasta.templateBuiltInIdentifierInDeclaration);
+    } else if (looksLikeStartOfNextTopLevelDeclaration(identifier) ||
+        isOneOfOrEof(identifier, followingValues)) {
+      identifier = parser.insertSyntheticIdentifier(token, this,
+          message: fasta.templateExpectedIdentifier.withArguments(identifier));
+    } else {
+      parser.reportRecoverableErrorWithToken(
+          identifier, fasta.templateExpectedIdentifier);
+      if (!identifier.isKeywordOrIdentifier) {
+        // When in doubt, consume the token to ensure we make progress
+        // but insert a synthetic identifier to satisfy listeners.
+        identifier = insertSyntheticIdentifierAfter(identifier, parser);
+      }
+    }
+    return identifier;
+  }
+}
+
+/// See [IdentifierContext.typeReference].
 class TypeReferenceIdentifierContext extends IdentifierContext {
   const TypeReferenceIdentifierContext()
       : super('typeReference',
@@ -378,7 +417,7 @@
       // annotation is not allowed before type arguments.
       parser.reportRecoverableErrorWithToken(
           next, fasta.templateUnexpectedToken);
-      token = skipMetadata(next);
+      token = skipMetadata(token);
       next = token.next;
     }
 
@@ -453,25 +492,3 @@
 bool looksLikeStartOfNextTopLevelDeclaration(Token token) =>
     token.isTopLevelKeyword ||
     isOneOfOrEof(token, const ['const', 'get', 'final', 'set', 'var', 'void']);
-
-Token skipMetadata(Token token) {
-  assert(optional('@', token));
-  Token next = token.next;
-  if (next.isIdentifier) {
-    token = next;
-    next = token.next;
-    while (optional('.', next)) {
-      token = next;
-      next = token.next;
-      if (next.isIdentifier) {
-        token = next;
-        next = token.next;
-      }
-    }
-    if (optional('(', next)) {
-      token = next.endGroup;
-      next = token.next;
-    }
-  }
-  return token;
-}
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index d58fa45..2ef4384 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -86,10 +86,13 @@
 import 'type_info.dart'
     show
         TypeInfo,
+        TypeParamOrArgInfo,
         computeType,
+        computeTypeParamOrArg,
         isGeneralizedFunctionType,
         isValidTypeReference,
-        noType;
+        noType,
+        noTypeParamOrArg;
 
 import 'type_info_impl.dart' show skipTypeVariables;
 
@@ -534,6 +537,12 @@
       directiveState?.checkDeclaration();
       if (next.isIdentifier || optional("void", next)) {
         return parseTypedef(previous);
+      } else if (next.isTopLevelKeyword ||
+          optional('var', next) ||
+          optional('=', next) ||
+          next.isEof) {
+        // Recovery
+        return parseTypedef(previous);
       } else {
         return parseTopLevelMemberImpl(previous);
       }
@@ -2019,8 +2028,6 @@
       followingValues = ['(', '{', '=>'];
     } else if (context == IdentifierContext.topLevelVariableDeclaration) {
       followingValues = [';', '=', ','];
-    } else if (context == IdentifierContext.typedefDeclaration) {
-      followingValues = ['(', '<', ';'];
     } else if (context == IdentifierContext.typeVariableDeclaration) {
       followingValues = ['<', '>', ';', '}'];
     } else {
@@ -2095,8 +2102,6 @@
       initialKeywords = topLevelKeywords();
     } else if (context == IdentifierContext.topLevelVariableDeclaration) {
       initialKeywords = topLevelKeywords();
-    } else if (context == IdentifierContext.typedefDeclaration) {
-      initialKeywords = topLevelKeywords();
     } else if (context == IdentifierContext.typeVariableDeclaration) {
       initialKeywords = topLevelKeywords()
         ..addAll(classMemberKeywords())
@@ -4110,10 +4115,12 @@
     TokenType type = next.type;
     int tokenLevel = type.precedence;
     Token typeArguments;
-    if (isValidMethodTypeArguments(next)) {
-      // For example a(b)<T>(c), where token is '<'.
+    TypeParamOrArgInfo typeArg = computeTypeParamOrArg(token);
+    if (typeArg != noTypeParamOrArg &&
+        optional('(', typeArg.skip(token).next)) {
+      // For example a(b)<T>(c), where token is before '<'.
       typeArguments = next;
-      token = parseTypeArgumentsOpt(token);
+      token = typeArg.parseArguments(token, this);
       next = token.next;
       assert(optional('(', next));
       type = next.type;
diff --git a/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart b/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart
index eb7f4d5..b80a0a9 100644
--- a/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart
+++ b/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart
@@ -2,7 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import '../../scanner/token.dart' show SimpleToken, Token, TokenType;
+import '../../scanner/token.dart'
+    show BeginToken, SimpleToken, Token, TokenType;
+
+import 'util.dart' show optional;
 
 /// Provides the capability of inserting tokens into a token stream. This
 /// implementation does this by rewriting the previous token to point to the
@@ -70,6 +73,32 @@
     return replacementToken;
   }
 
+  /// Split a `>>` token into two separate `>` tokens and return the first `>`.
+  /// This sets [start].endGroup to the second `>` and updates the token stream,
+  /// but does not set the inner group's endGroup.
+  Token splitGtGt(BeginToken start) {
+    Token gtgt = start.endGroup;
+    assert(gtgt != null);
+    assert(optional('>>', gtgt));
+
+    // A no-op rewriter could simply return `>>` here.
+
+    Token gt1 = new SimpleToken(TokenType.GT, gtgt.charOffset);
+    Token gt2 = gt1.setNext(new SimpleToken(TokenType.GT, gt1.charOffset + 1));
+    gt2.setNext(gtgt.next);
+
+    Token token = start;
+    Token next = token.next;
+    while (!identical(next, gtgt)) {
+      token = next;
+      next = token.next;
+    }
+    token.setNext(gt1);
+
+    start.endGroup = gt2;
+    return gt1;
+  }
+
   /// Given the [firstToken] in a chain of tokens to be inserted, return the
   /// last token in the chain.
   ///
diff --git a/pkg/front_end/lib/src/fasta/parser/type_info.dart b/pkg/front_end/lib/src/fasta/parser/type_info.dart
index 29a6a7a..0addae0 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_info.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_info.dart
@@ -14,7 +14,7 @@
 
 import 'util.dart' show optional;
 
-/// [TypeInfo] provides information that has collected by [computeType]
+/// [TypeInfo] provides information collected by [computeType]
 /// about a particular type reference.
 abstract class TypeInfo {
   /// Return `true` if the tokens comprising the type represented by the
@@ -55,6 +55,22 @@
   Token skipType(Token token);
 }
 
+/// [TypeParamOrArgInfo] provides information collected by
+/// [computeTypeParamOrArg] about a particular group of type arguments
+/// or type parameters.
+abstract class TypeParamOrArgInfo {
+  /// Call this function to parse optional type arguments after [token].
+  /// This function will call the appropriate event methods on the [Parser]'s
+  /// listener to handle the arguments. This may modify the token stream
+  /// when parsing `>>` in valid code or during recovery.
+  Token parseArguments(Token token, Parser parser);
+
+  /// Call this function with the [token] before the type var to obtain
+  /// the last token in the type var. If there is no type var, then this method
+  /// will return [token]. This does not modify the token stream.
+  Token skip(Token token);
+}
+
 /// [NoType] is a specialized [TypeInfo] returned by [computeType] when
 /// there is no type information in the source.
 const TypeInfo noType = const NoType();
@@ -76,6 +92,15 @@
 /// identifier `<` identifier `>`.
 const TypeInfo simpleTypeWith1Argument = const SimpleTypeWith1Argument();
 
+/// [NoTypeParamOrArg] is a specialized [TypeParamOrArgInfo] returned by
+/// [computeTypeParamOrArg] when no type parameters or arguments are found.
+const TypeParamOrArgInfo noTypeParamOrArg = const NoTypeParamOrArg();
+
+/// [SimpleTypeArgument1] is a specialized [TypeParamOrArgInfo] returned by
+/// [computeTypeParamOrArg] when the type reference is of the form:
+/// `<` identifier `>`.
+const TypeParamOrArgInfo simpleTypeArgument1 = const SimpleTypeArgument1();
+
 Token insertSyntheticIdentifierAfter(Token token, Parser parser) {
   Token identifier = new SyntheticStringToken(
       TokenType.IDENTIFIER, '', token.next.charOffset, 0);
@@ -104,35 +129,37 @@
 
 /// Called by the parser to obtain information about a possible type reference
 /// that follows [token]. This does not modify the token stream.
-TypeInfo computeType(final Token token, bool required) {
+///
+/// If this method is called by [computeTypeParamOrArg] and the outer group ends
+/// with `>>`, then then [innerEndGroup] is set to either `>>` if the token
+/// has not been split or the first `>` if the `>>` token has been split.
+TypeInfo computeType(final Token token, bool required, [Token innerEndGroup]) {
   Token next = token.next;
   if (!isValidTypeReference(next)) {
     if (next.type.isBuiltIn) {
-      Token afterType = next.next;
-      if (optional('<', afterType)) {
-        Token endGroup = afterType.endGroup;
-        if (endGroup != null && looksLikeName(endGroup.next)) {
-          // Recovery: built-in used as a type
-          return new ComplexTypeInfo(token).computeBuiltinAsType(required);
+      TypeParamOrArgInfo typeParamOrArg =
+          computeTypeParamOrArg(next, innerEndGroup);
+      if (typeParamOrArg != noTypeParamOrArg) {
+        // Recovery: built-in `<` ... `>`
+        if (required || looksLikeName(typeParamOrArg.skip(next).next)) {
+          return new ComplexTypeInfo(token, typeParamOrArg)
+              .computeBuiltinAsType(required);
         }
-      } else {
+      } else if (required || isGeneralizedFunctionType(next.next)) {
         String value = next.stringValue;
-        if (!identical('get', value) &&
+        if ((!identical('get', value) &&
             !identical('set', value) &&
             !identical('factory', value) &&
-            !identical('operator', value)) {
-          if (isGeneralizedFunctionType(afterType)) {
-            // Recovery: built-in used as a type
-            return new ComplexTypeInfo(token).computeBuiltinAsType(required);
-          } else if (required) {
-            // Recovery: built-in used as a type
-            return new ComplexTypeInfo(token).computeBuiltinAsType(required);
-          }
+            !identical('operator', value))) {
+          return new ComplexTypeInfo(token, typeParamOrArg)
+              .computeBuiltinAsType(required);
         }
       }
     } else if (required && optional('.', next)) {
       // Recovery: looks like prefixed type missing the prefix
-      return new ComplexTypeInfo(token).computePrefixedType(required);
+      return new ComplexTypeInfo(
+              token, computeTypeParamOrArg(next, innerEndGroup))
+          .computePrefixedType(required);
     }
     return noType;
   }
@@ -141,7 +168,8 @@
     next = next.next;
     if (isGeneralizedFunctionType(next)) {
       // `void` `Function` ...
-      return new ComplexTypeInfo(token).computeVoidGFT(required);
+      return new ComplexTypeInfo(token, noTypeParamOrArg)
+          .computeVoidGFT(required);
     }
     // `void`
     return voidType;
@@ -149,51 +177,47 @@
 
   if (isGeneralizedFunctionType(next)) {
     // `Function` ...
-    return new ComplexTypeInfo(token).computeNoTypeGFT(required);
+    return new ComplexTypeInfo(token, noTypeParamOrArg)
+        .computeNoTypeGFT(required);
   }
 
   // We've seen an identifier.
-  next = next.next;
 
-  if (optional('<', next)) {
-    Token endGroup = next.endGroup;
-    if (endGroup != null) {
-      next = next.next;
-      // identifier `<` `void` `>` is handled by ComplexTypeInfo.
-      if (isValidTypeReference(next) && !identical('void', next.stringValue)) {
-        next = next.next;
-        if (next == endGroup) {
-          // We've seen identifier `<` identifier `>`
-          next = next.next;
-          if (!isGeneralizedFunctionType(next)) {
-            if (required || looksLikeName(next)) {
-              // identifier `<` identifier `>` identifier
-              return simpleTypeWith1Argument;
-            } else {
-              // identifier `<` identifier `>` non-identifier
-              return noType;
-            }
-          }
+  TypeParamOrArgInfo typeParamOrArg =
+      computeTypeParamOrArg(next, innerEndGroup);
+  if (typeParamOrArg != noTypeParamOrArg) {
+    if (typeParamOrArg == simpleTypeArgument1) {
+      // We've seen identifier `<` identifier `>`
+      next = typeParamOrArg.skip(next).next;
+      if (!isGeneralizedFunctionType(next)) {
+        if (required || looksLikeName(next)) {
+          // identifier `<` identifier `>` identifier
+          return simpleTypeWith1Argument;
+        } else {
+          // identifier `<` identifier `>` non-identifier
+          return noType;
         }
-        // TODO(danrubel): Consider adding a const for
-        // identifier `<` identifier `,` identifier `>`
-        // if that proves to be a common case.
       }
-
-      // identifier `<` ... `>`
-      return new ComplexTypeInfo(token)
-          .computeSimpleWithTypeArguments(required);
     }
-    // identifier `<`
-    return required ? simpleType : noType;
+    // TODO(danrubel): Consider adding a const for
+    // identifier `<` identifier `,` identifier `>`
+    // if that proves to be a common case.
+
+    // identifier `<` ... `>`
+    return new ComplexTypeInfo(token, typeParamOrArg)
+        .computeSimpleWithTypeArguments(required);
   }
 
+  assert(typeParamOrArg == noTypeParamOrArg);
+  next = next.next;
   if (optional('.', next)) {
     next = next.next;
     if (isValidTypeReference(next)) {
-      next = next.next;
       // We've seen identifier `.` identifier
-      if (!optional('<', next) && !isGeneralizedFunctionType(next)) {
+      typeParamOrArg = computeTypeParamOrArg(next, innerEndGroup);
+      next = next.next;
+      if (typeParamOrArg == noTypeParamOrArg &&
+          !isGeneralizedFunctionType(next)) {
         if (required || looksLikeName(next)) {
           // identifier `.` identifier identifier
           return prefixedType;
@@ -203,17 +227,23 @@
         }
       }
       // identifier `.` identifier
-      return new ComplexTypeInfo(token).computePrefixedType(required);
+      return new ComplexTypeInfo(token, typeParamOrArg)
+          .computePrefixedType(required);
     }
     // identifier `.` non-identifier
-    return required
-        ? new ComplexTypeInfo(token).computePrefixedType(required)
-        : noType;
+    if (required) {
+      typeParamOrArg = computeTypeParamOrArg(token.next.next, innerEndGroup);
+      return new ComplexTypeInfo(token, typeParamOrArg)
+          .computePrefixedType(required);
+    }
+    return noType;
   }
 
+  assert(typeParamOrArg == noTypeParamOrArg);
   if (isGeneralizedFunctionType(next)) {
-    // `Function`
-    return new ComplexTypeInfo(token).computeIdentifierGFT(required);
+    // identifier `Function`
+    return new ComplexTypeInfo(token, noTypeParamOrArg)
+        .computeIdentifierGFT(required);
   }
 
   if (required || looksLikeName(next)) {
@@ -222,3 +252,30 @@
   }
   return noType;
 }
+
+/// Called by the parser to obtain information about a possible group of type
+/// parameters or type arguments that follow [token].
+/// This does not modify the token stream.
+///
+/// If this method is called by [computeType] and the outer group ends
+/// with `>>`, then then [innerEndGroup] is set to either `>>` if the token
+/// has not been split or the first `>` if the `>>` token has been split.
+TypeParamOrArgInfo computeTypeParamOrArg(Token token, [Token innerEndGroup]) {
+  Token next = token.next;
+  if (!optional('<', next)) {
+    return noTypeParamOrArg;
+  }
+  Token endGroup = next.endGroup ?? innerEndGroup;
+  if (endGroup == null) {
+    return noTypeParamOrArg;
+  }
+  Token identifier = next.next;
+  // identifier `<` `void` `>` is handled by ComplexTypeInfo.
+  if (isValidTypeReference(identifier) &&
+      !optional('void', identifier) &&
+      identifier.next == endGroup) {
+    return simpleTypeArgument1;
+  }
+  // TODO(danrubel): Consider adding additional const for common situations.
+  return new ComplexTypeParamOrArgInfo(token).compute(innerEndGroup);
+}
diff --git a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
index f0e77fb..4120e05 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
@@ -4,7 +4,7 @@
 
 library fasta.parser.type_info_impl;
 
-import '../../scanner/token.dart' show Token;
+import '../../scanner/token.dart' show BeginToken, Token;
 
 import '../fasta_codes.dart' as fasta;
 
@@ -20,7 +20,7 @@
 
 import 'type_info.dart';
 
-import 'util.dart' show optional;
+import 'util.dart' show optional, skipMetadata;
 
 /// See documentation on the [noType] const.
 class NoType implements TypeInfo {
@@ -128,25 +128,17 @@
     assert(token.isKeywordOrIdentifier);
     Listener listener = parser.listener;
     listener.handleIdentifier(token, IdentifierContext.typeReference);
-
-    Token begin = token = token.next;
-    assert(optional('<', token));
-    listener.beginTypeArguments(token);
-
-    token = simpleType.parseTypeNotVoid(token, parser);
-
-    token = token.next;
-    assert(optional('>', token));
-    assert(begin.endGroup == token);
-    listener.endTypeArguments(1, begin, token);
-
+    token = simpleTypeArgument1.parseArguments(token, parser);
     listener.handleType(start, token.next);
     return token;
   }
 
   @override
   Token skipType(Token token) {
-    return token.next.next.endGroup;
+    token = token.next.next;
+    assert(optional('<', token));
+    assert(token.endGroup != null || optional('>>', token.next.next));
+    return token.endGroup ?? token.next;
   }
 }
 
@@ -172,10 +164,10 @@
   @override
   Token parseType(Token token, Parser parser) {
     token = token.next;
-    assert(token.isKeywordOrIdentifier);
+    assert(isValidTypeReference(token));
     Listener listener = parser.listener;
     listener.handleIdentifier(token, IdentifierContext.typeReference);
-    listener.handleNoTypeArguments(token.next);
+    token = noTypeParamOrArg.parseArguments(token, parser);
     listener.handleType(token, token.next);
     return token;
   }
@@ -260,12 +252,12 @@
   /// The first token in the type reference.
   Token start;
 
+  /// Type arguments were seen during analysis.
+  final TypeParamOrArgInfo typeArguments;
+
   /// The last token in the type reference.
   Token end;
 
-  /// Non-null if type arguments were seen during analysis.
-  Token typeArguments;
-
   /// The tokens before the start of type variables of function types seen
   /// during analysis. Notice that the tokens in this list might precede
   /// either `'<'` or `'('` as not all function types have type parameters.
@@ -275,7 +267,8 @@
   /// whether it has a return type, otherwise this is `null`.
   bool gftHasReturnType;
 
-  ComplexTypeInfo(Token beforeStart) : this.start = beforeStart.next;
+  ComplexTypeInfo(Token beforeStart, this.typeArguments)
+      : this.start = beforeStart.next;
 
   @override
   bool get couldBeExpression => false;
@@ -311,7 +304,7 @@
       // A function type without return type.
       // Push the non-existing return type first. The loop below will
       // generate the full type.
-      noType.parseTypeNotVoid(token, parser);
+      noType.parseType(token, parser);
     } else {
       Token typeRefOrPrefix = token.next;
       if (optional('void', typeRefOrPrefix)) {
@@ -327,10 +320,11 @@
           token = parser.parseQualifiedRest(
               token, IdentifierContext.typeReferenceContinuation);
           if (token.isSynthetic && end == typeRefOrPrefix.next) {
+            // Recovery: Update `end` if a synthetic identifier was inserted.
             end = token;
           }
         }
-        token = parser.parseTypeArgumentsOpt(token);
+        token = typeArguments.parseArguments(token, parser);
         parser.listener.handleType(typeRefOrPrefix, token.next);
       }
     }
@@ -370,8 +364,8 @@
   /// and return the receiver or one of the [TypeInfo] constants.
   TypeInfo computeNoTypeGFT(bool required) {
     assert(optional('Function', start));
-    computeRest(start, required);
 
+    computeRest(start, required);
     if (gftHasReturnType == null) {
       return required ? simpleType : noType;
     }
@@ -384,8 +378,8 @@
   TypeInfo computeVoidGFT(bool required) {
     assert(optional('void', start));
     assert(optional('Function', start.next));
-    computeRest(start.next, required);
 
+    computeRest(start.next, required);
     if (gftHasReturnType == null) {
       return voidType;
     }
@@ -393,35 +387,13 @@
     return this;
   }
 
-  /// Given a builtin, return the receiver so that parseType will report
-  /// an error for the builtin used as a type.
-  TypeInfo computeBuiltinAsType(bool required) {
-    assert(start.type.isBuiltIn);
-    end = start;
-    Token token = start.next;
-    if (optional('<', token)) {
-      typeArguments = token;
-      token = skipTypeVariables(typeArguments);
-      if (token == null) {
-        token = typeArguments;
-        typeArguments = null;
-      } else {
-        end = token;
-      }
-    }
-    computeRest(token, required);
-
-    assert(end != null);
-    return this;
-  }
-
   /// Given identifier `Function` non-identifier, compute the type
   /// and return the receiver or one of the [TypeInfo] constants.
   TypeInfo computeIdentifierGFT(bool required) {
     assert(isValidTypeReference(start));
     assert(optional('Function', start.next));
-    computeRest(start.next, required);
 
+    computeRest(start.next, required);
     if (gftHasReturnType == null) {
       return simpleType;
     }
@@ -429,19 +401,26 @@
     return this;
   }
 
+  /// Given a builtin, return the receiver so that parseType will report
+  /// an error for the builtin used as a type.
+  TypeInfo computeBuiltinAsType(bool required) {
+    assert(start.type.isBuiltIn);
+
+    end = typeArguments.skip(start);
+    computeRest(end.next, required);
+    assert(end != null);
+    return this;
+  }
+
   /// Given identifier `<` ... `>`, compute the type
   /// and return the receiver or one of the [TypeInfo] constants.
   TypeInfo computeSimpleWithTypeArguments(bool required) {
     assert(isValidTypeReference(start));
-    typeArguments = start.next;
-    assert(optional('<', typeArguments));
+    assert(optional('<', start.next));
+    assert(typeArguments != noTypeParamOrArg);
 
-    Token token = skipTypeVariables(typeArguments);
-    if (token == null) {
-      return required ? simpleType : noType;
-    }
-    end = token;
-    computeRest(token.next, required);
+    end = typeArguments.skip(start);
+    computeRest(end.next, required);
 
     if (!required && !looksLikeName(end.next) && gftHasReturnType == null) {
       return noType;
@@ -450,32 +429,22 @@
     return this;
   }
 
-  /// Given identifier `.` identifier, compute the type
-  /// and return the receiver or one of the [TypeInfo] constants.
+  /// Given identifier `.` identifier (or `.` identifier or identifier `.`
+  /// for recovery), compute the type and return the receiver or one of the
+  /// [TypeInfo] constants.
   TypeInfo computePrefixedType(bool required) {
     Token token = start;
     if (!optional('.', token)) {
-      assert(isValidTypeReference(token));
+      assert(token.isKeywordOrIdentifier);
       token = token.next;
     }
     assert(optional('.', token));
-    if (isValidTypeReference(token.next)) {
+    if (token.next.isKeywordOrIdentifier) {
       token = token.next;
     }
 
-    end = token;
-    token = token.next;
-    if (optional('<', token)) {
-      typeArguments = token;
-      token = skipTypeVariables(token);
-      if (token == null) {
-        return required ? prefixedType : noType;
-      }
-      end = token;
-      token = token.next;
-    }
-    computeRest(token, required);
-
+    end = typeArguments.skip(token);
+    computeRest(end.next, required);
     if (!required && !looksLikeName(end.next) && gftHasReturnType == null) {
       return noType;
     }
@@ -513,3 +482,171 @@
     }
   }
 }
+
+/// See [noTypeParamOrArg].
+class NoTypeParamOrArg implements TypeParamOrArgInfo {
+  const NoTypeParamOrArg();
+
+  @override
+  Token parseArguments(Token token, Parser parser) {
+    parser.listener.handleNoTypeArguments(token.next);
+    return token;
+  }
+
+  @override
+  Token skip(Token token) => token;
+}
+
+class SimpleTypeArgument1 implements TypeParamOrArgInfo {
+  const SimpleTypeArgument1();
+
+  @override
+  Token parseArguments(Token token, Parser parser) {
+    BeginToken start = token = token.next;
+    assert(optional('<', token));
+    Listener listener = parser.listener;
+    listener.beginTypeArguments(token);
+    token = simpleType.parseType(token, parser);
+    Token next = token.next;
+
+    if (next == start.endGroup) {
+      parser.listener.endTypeArguments(1, start, next);
+      return next;
+    } else if (optional('>', next)) {
+      // When `>>` is split, the inner group's endGroup updated here.
+      start.endGroup = next;
+      parser.listener.endTypeArguments(1, start, next);
+      return next;
+    } else if (optional('>>', next)) {
+      parser.listener.endTypeArguments(1, start, next);
+      // In this case, the last consumed token is the token before `>>`.
+      return token;
+    } else {
+      throw "Internal error: Expected '>' or '>>' but found '$next'.";
+    }
+  }
+
+  @override
+  Token skip(Token token) {
+    token = token.next;
+    assert(token.endGroup != null ||
+        (optional('>', token.next.next) || optional('>>', token.next.next)));
+    return token.endGroup ??
+        (optional('>>', token.next.next) ? token.next : token.next.next);
+  }
+}
+
+class ComplexTypeParamOrArgInfo implements TypeParamOrArgInfo {
+  /// The first token in the type var.
+  final BeginToken start;
+
+  /// The last token in the group (typically `>`).
+  /// If a `>>` has not yet been split, then this field will be
+  /// `>>` for the outer group and the token before `>>` for the inner group.
+  Token end;
+
+  ComplexTypeParamOrArgInfo(Token token)
+      : assert(optional('<', token.next)),
+        start = token.next;
+
+  /// Parse the tokens and return the receiver or [noTypeParamOrArg] if there
+  /// are no type parameters or arguments. This does not modify the token
+  /// stream.
+  ///
+  /// If this group is enclosed and the outer group ends with `>>`, then
+  /// [endGroup] is set to either `>>` if the token has not been split
+  /// or the first `>` if the `>>` token has been split.
+  TypeParamOrArgInfo compute(Token endGroup) {
+    Token innerEndGroup;
+    if (start.endGroup != null && optional('>>', start.endGroup)) {
+      innerEndGroup = start.endGroup;
+    }
+
+    Token token;
+    Token next = start;
+    do {
+      TypeInfo typeInfo = computeType(next, true, innerEndGroup);
+      if (typeInfo == noType) {
+        // Recovery
+        while (typeInfo == noType && optional('@', next.next)) {
+          next = skipMetadata(next);
+          typeInfo = computeType(next, true, innerEndGroup);
+        }
+        if (typeInfo == noType && !optional(',', next.next)) {
+          token = next;
+          next = token.next;
+          break;
+        }
+        assert(typeInfo != noType || optional(',', next.next));
+        // Fall through to process type (if any) and consume `,`
+      }
+      token = typeInfo.skipType(next);
+      next = token.next;
+    } while (optional(',', next));
+
+    if (next == start.endGroup) {
+      end = next;
+    } else if (next == endGroup) {
+      assert(start.endGroup == null);
+      assert(optional('>', endGroup) || optional('>>', endGroup));
+      // If `>>`, then the end or last consumed token is the token before `>>`.
+      end = optional('>>', next) ? token : next;
+    } else {
+      return noTypeParamOrArg;
+    }
+    return this;
+  }
+
+  @override
+  Token parseArguments(Token token, Parser parser) {
+    assert(identical(start, token.next));
+
+    Token innerEndGroup;
+    if (start.endGroup != null && optional('>>', start.endGroup)) {
+      innerEndGroup = parser.rewriter.splitGtGt(start);
+    }
+
+    Token next = start;
+    parser.listener.beginTypeArguments(start);
+    int count = 0;
+    do {
+      TypeInfo typeInfo = computeType(next, true, innerEndGroup);
+      if (typeInfo == noType) {
+        // Recovery
+        while (typeInfo == noType && optional('@', next.next)) {
+          parser.reportRecoverableErrorWithToken(
+              next.next, fasta.templateUnexpectedToken);
+          next = skipMetadata(next);
+          typeInfo = computeType(next, true, innerEndGroup);
+        }
+        // Fall through to process type (if any) and consume `,`
+      }
+      token = typeInfo.ensureTypeOrVoid(next, parser);
+      next = token.next;
+      ++count;
+    } while (optional(',', next));
+
+    if (next == start.endGroup) {
+      end = next;
+      parser.listener.endTypeArguments(count, start, end);
+      return end;
+    } else if (optional('>', next)) {
+      // When `>>` is split, this method is recursively called
+      // and the inner group's endGroup updated here.
+      assert(start.endGroup == null);
+      end = start.endGroup = next;
+      parser.listener.endTypeArguments(count, start, end);
+      return end;
+    } else if (optional('>>', next)) {
+      // In this case, the end or last consumed token is the token before `>>`.
+      end = token;
+      parser.listener.endTypeArguments(count, start, next);
+      return end;
+    } else {
+      throw "Internal error: Expected '>' or '>>' but found '$next'.";
+    }
+  }
+
+  @override
+  Token skip(Token token) => end;
+}
diff --git a/pkg/front_end/lib/src/fasta/parser/util.dart b/pkg/front_end/lib/src/fasta/parser/util.dart
index 50dd955..7eb1f46 100644
--- a/pkg/front_end/lib/src/fasta/parser/util.dart
+++ b/pkg/front_end/lib/src/fasta/parser/util.dart
@@ -53,3 +53,26 @@
   if (end == null) return lengthForToken(begin);
   return end.offset + end.length - begin.offset;
 }
+
+Token skipMetadata(Token token) {
+  token = token.next;
+  assert(optional('@', token));
+  Token next = token.next;
+  if (next.isIdentifier) {
+    token = next;
+    next = token.next;
+    while (optional('.', next)) {
+      token = next;
+      next = token.next;
+      if (next.isIdentifier) {
+        token = next;
+        next = token.next;
+      }
+    }
+    if (optional('(', next)) {
+      token = next.endGroup;
+      next = token.next;
+    }
+  }
+  return token;
+}
diff --git a/pkg/front_end/lib/src/fasta/scanner/string_scanner.dart b/pkg/front_end/lib/src/fasta/scanner/string_scanner.dart
index ee2d64b..7de4ef6 100644
--- a/pkg/front_end/lib/src/fasta/scanner/string_scanner.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/string_scanner.dart
@@ -4,7 +4,7 @@
 
 library dart2js.scanner.string_scanner;
 
-import '../../scanner/token.dart' show SyntheticStringToken, Token, TokenType;
+import '../../scanner/token.dart' show Token, SyntheticStringToken, TokenType;
 
 import '../../scanner/token.dart' as analyzer show StringToken;
 
diff --git a/pkg/front_end/lib/src/fasta/scope.dart b/pkg/front_end/lib/src/fasta/scope.dart
index cdf9a9b..f6b3309 100644
--- a/pkg/front_end/lib/src/fasta/scope.dart
+++ b/pkg/front_end/lib/src/fasta/scope.dart
@@ -66,6 +66,11 @@
       : this(<String, Builder>{}, null, parent, debugName,
             isModifiable: isModifiable);
 
+  Scope copyWithParent(Scope parent, String debugName) {
+    return new Scope(super.local, super.setters, parent, debugName,
+        isModifiable: isModifiable);
+  }
+
   /// Don't use this. Use [becomePartOf] instead.
   void set local(_) => unsupported("local=", -1, null);
 
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index 68b1941..3f9ee22 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -527,13 +527,9 @@
   StackListener createListener(
       ModifierBuilder builder, Scope memberScope, bool isInstanceMember,
       [Scope formalParameterScope]) {
-    InterfaceType thisType;
-    if (builder.isClassMember) {
-      // Note: we set thisType regardless of whether we are building a static
-      // member, since that provides better error recovery.
-      Class cls = builder.parent.target;
-      thisType = cls.thisType;
-    }
+    // Note: we set thisType regardless of whether we are building a static
+    // member, since that provides better error recovery.
+    InterfaceType thisType = currentClass?.target?.thisType;
     var typeInferrer = library.disableTypeInference
         ? typeInferenceEngine.createDisabledTypeInferrer()
         : typeInferenceEngine.createLocalTypeInferrer(uri, thisType, library);
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 6def2ba..25be339 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
@@ -109,9 +109,9 @@
 
   bool canAddImplementationBuilders = false;
 
-  SourceLibraryBuilder(SourceLoader loader, Uri fileUri)
+  SourceLibraryBuilder(SourceLoader loader, Uri fileUri, Scope scope)
       : this.fromScopes(loader, fileUri, new DeclarationBuilder<T>.library(),
-            new Scope.top());
+            scope ?? new Scope.top());
 
   SourceLibraryBuilder.fromScopes(
       this.loader, this.fileUri, this.libraryDeclaration, this.importScope)
@@ -652,7 +652,18 @@
   }
 
   void addImportsToScope() {
-    super.addSpecificImportsToScope(imports);
+    bool explicitCoreImport = this == loader.coreLibrary;
+    for (Import import in imports) {
+      if (import.imported == loader.coreLibrary) {
+        explicitCoreImport = true;
+      }
+      import.finalizeImports(this);
+    }
+    if (!explicitCoreImport) {
+      loader.coreLibrary.exportScope.forEach((String name, Builder member) {
+        addToScope(name, member, -1, true);
+      });
+    }
   }
 
   @override
@@ -678,6 +689,8 @@
       t.resolveIn(scope);
       if (loader.target.strongMode) {
         t.checkType();
+      } else {
+        t.normalizeType();
       }
     }
     types.clear();
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 687a738..5419f26 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -12,10 +12,12 @@
     show
         Arguments,
         Class,
+        Component,
         Expression,
+        FunctionNode,
         Library,
         LibraryDependency,
-        Component,
+        ProcedureKind,
         Supertype;
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
@@ -64,13 +66,17 @@
 import '../kernel/kernel_shadow_ast.dart'
     show ShadowClass, ShadowTypeInferenceEngine;
 
+import '../kernel/kernel_builder.dart' show KernelProcedureBuilder;
+
 import '../kernel/kernel_target.dart' show KernelTarget;
 
+import '../kernel/body_builder.dart' show BodyBuilder;
+
 import '../loader.dart' show Loader;
 
 import '../parser/class_member_parser.dart' show ClassMemberParser;
 
-import '../parser.dart' show lengthForToken, offsetForToken;
+import '../parser.dart' show Parser, lengthForToken, offsetForToken;
 
 import '../problems.dart' show internalProblem;
 
@@ -207,6 +213,37 @@
     }
   }
 
+  Future<Expression> buildExpression(
+      SourceLibraryBuilder library,
+      String enclosingClass,
+      bool isInstanceMember,
+      FunctionNode parameters) async {
+    Token token = await tokenize(library, suppressLexicalErrors: false);
+    if (token == null) return null;
+    DietListener dietListener = createDietListener(library);
+
+    Builder parent = library;
+    if (enclosingClass != null) {
+      Builder cls = dietListener.memberScope.lookup(enclosingClass, -1, null);
+      if (cls is ClassBuilder) {
+        parent = cls;
+        dietListener
+          ..currentClass = cls
+          ..memberScope = cls.scope.copyWithParent(
+              dietListener.memberScope.withTypeVariables(cls.typeVariables),
+              "debugExpression in $enclosingClass");
+      }
+    }
+    KernelProcedureBuilder builder = new KernelProcedureBuilder(null, 0, null,
+        "debugExpr", null, null, ProcedureKind.Method, library, 0, -1, -1)
+      ..parent = parent;
+    BodyBuilder listener = dietListener.createListener(
+        builder, dietListener.memberScope, isInstanceMember);
+
+    return listener.parseSingleExpression(
+        new Parser(listener), token, parameters);
+  }
+
   KernelTarget get target => super.target;
 
   DietListener createDietListener(LibraryBuilder library) {
@@ -348,11 +385,11 @@
     ticker.logMs("Resolved $count constructors");
   }
 
-  void finishTypeVariables(ClassBuilder object) {
+  void finishTypeVariables(ClassBuilder object, TypeBuilder dynamicType) {
     int count = 0;
     builders.forEach((Uri uri, LibraryBuilder library) {
       if (library.loader == this) {
-        count += library.finishTypeVariables(object);
+        count += library.finishTypeVariables(object, dynamicType);
       }
     });
     ticker.logMs("Resolved $count type-variable bounds");
@@ -360,8 +397,6 @@
 
   void instantiateToBound(TypeBuilder dynamicType, TypeBuilder bottomType,
       ClassBuilder objectClass) {
-    if (!target.strongMode) return;
-
     int count = 0;
     builders.forEach((Uri uri, LibraryBuilder library) {
       if (library.loader == this) {
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener.dart b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
index d440748..938ad81 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
@@ -4,7 +4,7 @@
 
 library fasta.stack_listener;
 
-import 'package:kernel/ast.dart' show AsyncMarker, Expression;
+import 'package:kernel/ast.dart' show AsyncMarker, Expression, FunctionNode;
 
 import '../deprecated_problems.dart' show deprecated_inputError;
 
@@ -14,7 +14,7 @@
         messageNativeClauseShouldBeAnnotation,
         templateInternalProblemStackNotEmpty;
 
-import '../parser.dart' show Listener, MemberKind;
+import '../parser.dart' show Listener, MemberKind, Parser;
 
 import '../parser/identifier_context.dart' show IdentifierContext;
 
@@ -96,6 +96,12 @@
   // and ast_builder.dart.
   void exitLocalScope() => unsupported("exitLocalScope", -1, uri);
 
+  // TODO(ahe): This doesn't belong here. Only implemented by body_builder.dart.
+  dynamic parseSingleExpression(
+      Parser parser, Token token, FunctionNode parameters) {
+    return unsupported("finishSingleExpression", -1, uri);
+  }
+
   void push(Object node) {
     if (node == null) unhandled("null", "push", -1, uri);
     stack.push(node);
diff --git a/pkg/front_end/lib/src/fasta/target_implementation.dart b/pkg/front_end/lib/src/fasta/target_implementation.dart
index 2c21ecf..5abbd00 100644
--- a/pkg/front_end/lib/src/fasta/target_implementation.dart
+++ b/pkg/front_end/lib/src/fasta/target_implementation.dart
@@ -18,8 +18,6 @@
 
 import 'uri_translator.dart' show UriTranslator;
 
-import 'kernel/metadata_collector.dart' show MetadataCollector;
-
 /// Provides the implementation details used by a loader for a target.
 abstract class TargetImplementation extends Target {
   final UriTranslator uriTranslator;
@@ -35,13 +33,7 @@
   Builder cachedNativeAnnotation;
   Builder cachedNativeExtensionAnnotation;
 
-  /// The [MetadataCollector] to write metadata to.
-  ///
-  /// Maybe be [null] for targets where metadata cannot be written.
-  final MetadataCollector metadataCollector;
-
-  TargetImplementation(Ticker ticker, this.uriTranslator, this.backendTarget,
-      [this.metadataCollector = null])
+  TargetImplementation(Ticker ticker, this.uriTranslator, this.backendTarget)
       : super(ticker);
 
   /// Creates a [LibraryBuilder] corresponding to [uri], if one doesn't exist
diff --git a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
index d041aac..25e961f 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
@@ -798,14 +798,15 @@
     }
   }
 
-  /// Populates [apiMembers] with a list of the implemented and inherited
-  /// members of the given [class_]'s interface.
+  /// Populates [getters] and [setters] with the members of the given [class_]'s
+  /// interface.
   ///
-  /// Members of the class's interface that need to be resolved later are
-  /// represented by a [ForwardingNode] object.
-  ///
-  /// If [setters] is `true`, the list will be populated by setters; otherwise
-  /// it will be populated by getters and methods.
+  /// [getters] will contain methods and getters, [setters] will contain
+  /// setters.  Some members cannot be resolved immediately.  For instance,
+  /// top-level type inference has not yet inferred field types based on
+  /// initializers and so we cannot yet do override based resolution of getters
+  /// and setters.  Members of the class's interface that need to be resolved
+  /// later are represented by a [ForwardingNode] object.
   void createApiMembers(Class class_, List<Member> getters,
       List<Member> setters, LibraryBuilder library) {
     var candidates = ClassHierarchy.mergeSortedLists(
@@ -816,112 +817,167 @@
     setters.length = candidates.length;
     int getterIndex = 0;
     int setterIndex = 0;
-    forEachApiMember(candidates, (int getterStart, int setterEnd, Name name) {
+    forEachApiMember(candidates, (int start, int end, Name name) {
       // TODO(paulberry): check for illegal getter/method mixing
+      Procedure member = candidates[start];
+      ProcedureKind kind = _kindOf(member);
+      if (kind != ProcedureKind.Getter && kind != ProcedureKind.Setter) {
+        for (int i = start + 1; i < end; ++i) {
+          if (_kindOf(candidates[i]) != kind) {
+            // We've seen a getter or setter.  If it's a getter conflicting
+            // with a method and both are declared in the same class, then that
+            // has already been signaled as a duplicated definition.
+            Procedure conflict = candidates[i];
+            if (conflict.enclosingClass != member.enclosingClass) {
+              if (member.enclosingClass == class_) {
+                library.addProblem(
+                    messageDeclaredMemberConflictsWithInheritedMember,
+                    member.fileOffset,
+                    noLength,
+                    member.fileUri,
+                    context: [
+                      messageDeclaredMemberConflictsWithInheritedMemberCause
+                          .withLocation(
+                              conflict.fileUri, conflict.fileOffset, noLength)
+                    ]);
+              } else if (conflict.enclosingClass == class_) {
+                library.addProblem(
+                    messageDeclaredMemberConflictsWithInheritedMember,
+                    conflict.fileOffset,
+                    noLength,
+                    conflict.fileUri,
+                    context: [
+                      messageDeclaredMemberConflictsWithInheritedMemberCause
+                          .withLocation(
+                              member.fileUri, member.fileOffset, noLength)
+                    ]);
+              } else {
+                library.addProblem(messageInheritedMembersConflict,
+                    class_.fileOffset, noLength, class_.fileUri,
+                    context: [
+                      messageInheritedMembersConflictCause1.withLocation(
+                          member.fileUri, member.fileOffset, noLength),
+                      messageInheritedMembersConflictCause2.withLocation(
+                          conflict.fileUri, conflict.fileOffset, noLength)
+                    ]);
+              }
+            }
+            return;
+          }
+        }
+        if (strongMode &&
+            member.enclosingClass == class_ &&
+            _requiresTypeInference(member)) {
+          inferMethodType(library, class_, member, candidates, start + 1, end);
+        }
+        var forwardingNode = new ForwardingNode(
+            this, null, class_, name, kind, candidates, start, end);
+        getters[getterIndex++] = forwardingNode.finalize();
+        return;
+      }
 
       Procedure declaredGetter;
-      int i = getterStart;
-      int inheritedGetterStart;
-      int getterEnd;
-      if (_kindOf(candidates[i]) == ProcedureKind.Setter) {
-        inheritedGetterStart = i;
-      } else {
-        if (identical(candidates[i].enclosingClass, class_)) {
-          declaredGetter = candidates[i++];
+      int inheritedGetterStart = start;
+      int getterEnd = start;
+      if (kind == ProcedureKind.Getter) {
+        if (member.enclosingClass == class_) {
+          declaredGetter = member;
+          ++inheritedGetterStart;
         }
-        inheritedGetterStart = i;
-        while (
-            i < setterEnd && _kindOf(candidates[i]) != ProcedureKind.Setter) {
-          ++i;
+        while (++getterEnd < end) {
+          ProcedureKind currentKind = _kindOf(candidates[getterEnd]);
+          if (currentKind == ProcedureKind.Setter) break;
+          if (currentKind != ProcedureKind.Getter) {
+            Procedure conflict = candidates[getterEnd];
+            if (conflict.enclosingClass != member.enclosingClass) {
+              if (member.enclosingClass == class_) {
+                library.addProblem(
+                    messageDeclaredMemberConflictsWithInheritedMember,
+                    member.fileOffset,
+                    noLength,
+                    member.fileUri,
+                    context: [
+                      messageDeclaredMemberConflictsWithInheritedMemberCause
+                          .withLocation(
+                              conflict.fileUri, conflict.fileOffset, noLength)
+                    ]);
+              } else {
+                library.addProblem(messageInheritedMembersConflict,
+                    class_.fileOffset, noLength, class_.fileUri,
+                    context: [
+                      messageInheritedMembersConflictCause1.withLocation(
+                          member.fileUri, member.fileOffset, noLength),
+                      messageInheritedMembersConflictCause2.withLocation(
+                          conflict.fileUri, conflict.fileOffset, noLength)
+                    ]);
+              }
+            }
+            return;
+          }
         }
       }
-      getterEnd = i;
+
       Procedure declaredSetter;
-      int inheritedSetterStart;
-      if (i < setterEnd && identical(candidates[i].enclosingClass, class_)) {
-        declaredSetter = candidates[i];
-        inheritedSetterStart = i + 1;
-      } else {
-        inheritedSetterStart = i;
+      int inheritedSetterStart = getterEnd;
+      if (getterEnd < end) {
+        member = candidates[getterEnd];
+        if (member.enclosingClass == class_) {
+          declaredSetter = member;
+          ++inheritedSetterStart;
+        }
       }
 
       InferenceNode getterInferenceNode;
-      if (getterStart < getterEnd) {
-        if (_kindOf(candidates[getterStart]) == ProcedureKind.Getter) {
-          // Member is a getter.
-          if (declaredGetter != null) {
-            getterInferenceNode = _createInferenceNode(
-                class_,
-                declaredGetter,
-                candidates,
-                inheritedGetterStart,
-                getterEnd,
-                inheritedSetterStart,
-                setterEnd,
-                library,
-                class_.fileUri);
-          }
-          // Getters need to be resolved later, as part of type
-          // inference, so just save the forwarding node for now.
-          getters[getterIndex++] = new ForwardingNode(
-              this,
-              getterInferenceNode,
+      if (start < getterEnd) {
+        if (declaredGetter != null) {
+          getterInferenceNode = _createInferenceNode(
               class_,
-              name,
-              _kindOf(candidates[getterStart]),
+              declaredGetter,
               candidates,
-              getterStart,
-              getterEnd);
-        } else {
-          // Member is a method.
-          if (strongMode &&
-              declaredGetter != null &&
-              _requiresTypeInference(declaredGetter)) {
-            inferMethodType(library, class_, declaredGetter, candidates,
-                inheritedGetterStart, getterEnd);
-          }
-          var forwardingNode = new ForwardingNode(
-              this,
-              null,
-              class_,
-              name,
-              _kindOf(candidates[getterStart]),
-              candidates,
-              getterStart,
-              getterEnd);
-          // Methods and operators can be finalized immediately.
-          getters[getterIndex++] = forwardingNode.finalize();
+              inheritedGetterStart,
+              getterEnd,
+              inheritedSetterStart,
+              end,
+              library,
+              class_.fileUri);
         }
+        // Getters need to be resolved later, as part of type inference, so just
+        // save the forwarding node for now.
+        //
+        // Choose a representative to use for error reporting, such as if a
+        // class inherits this getter and tries to declare a method with the
+        // same name.
+        Member representative = candidates[start];
+        getters[getterIndex++] = new ForwardingNode(this, getterInferenceNode,
+            class_, name, ProcedureKind.Getter, candidates, start, getterEnd)
+          ..fileUri = representative.fileUri
+          ..fileOffset = representative.fileOffset
+          ..fileEndOffset = representative.fileEndOffset;
       }
-      if (getterEnd < setterEnd) {
+      if (getterEnd < end) {
         InferenceNode setterInferenceNode;
         if (declaredSetter != null) {
-          if (declaredSetter is SyntheticAccessor) {
-            setterInferenceNode = getterInferenceNode;
-          } else {
-            setterInferenceNode = _createInferenceNode(
-                class_,
-                declaredSetter,
-                candidates,
-                inheritedSetterStart,
-                setterEnd,
-                inheritedGetterStart,
-                getterEnd,
-                library,
-                class_.fileUri);
-          }
+          setterInferenceNode = declaredSetter is SyntheticAccessor
+              ? getterInferenceNode
+              : _createInferenceNode(
+                  class_,
+                  declaredSetter,
+                  candidates,
+                  inheritedSetterStart,
+                  end,
+                  inheritedGetterStart,
+                  getterEnd,
+                  library,
+                  class_.fileUri);
         }
-        var forwardingNode = new ForwardingNode(
-            this,
-            setterInferenceNode,
-            class_,
-            name,
-            ProcedureKind.Setter,
-            candidates,
-            getterEnd,
-            setterEnd);
-        // Setters need to be resolved later, as part of type
-        // inference, so just save the forwarding node for now.
+        Member representative = candidates[getterEnd];
+        var forwardingNode = new ForwardingNode(this, setterInferenceNode,
+            class_, name, ProcedureKind.Setter, candidates, getterEnd, end)
+          ..fileUri = representative.fileUri
+          ..fileOffset = representative.fileOffset
+          ..fileEndOffset = representative.fileEndOffset;
+        // Setters need to be resolved later, as part of type inference, so just
+        // save the forwarding node for now.
         setters[setterIndex++] = forwardingNode;
       }
     });
diff --git a/pkg/front_end/lib/src/testing/compiler_common.dart b/pkg/front_end/lib/src/testing/compiler_common.dart
index 0193e73..d09c4c6 100644
--- a/pkg/front_end/lib/src/testing/compiler_common.dart
+++ b/pkg/front_end/lib/src/testing/compiler_common.dart
@@ -17,7 +17,7 @@
 import '../compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
 
-import '../testing/hybrid_file_system.dart' show HybridFileSystem;
+import '../fasta/hybrid_file_system.dart' show HybridFileSystem;
 
 /// Generate kernel for a script.
 ///
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 01a8aa0..692b8d5 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -80,6 +80,7 @@
 CyclicClassHierarchy/example: Fail
 CyclicTypedef/analyzerCode: Fail
 CyclicTypedef/example: Fail
+DeclaredMemberConflictsWithInheritedMember/analyzerCode: Fail
 DeferredAfterPrefix/example: Fail
 DeferredPrefixDuplicated/analyzerCode: Fail
 DeferredPrefixDuplicated/example: Fail
@@ -118,6 +119,8 @@
 ExpectedClassMember/example: Fail
 ExpectedDeclaration/example: Fail
 ExpectedFunctionBody/example: Fail
+ExpectedOneExpression/analyzerCode: Fail
+ExpectedOneExpression/example: Fail
 ExpectedOpenParens/analyzerCode: Fail
 ExpectedOpenParens/example: Fail
 ExpectedStatement/statement: Fail
@@ -189,6 +192,7 @@
 ImportAfterPart/script1: Fail
 ImportHidesImport/analyzerCode: Fail
 ImportHidesImport/example: Fail
+InheritedMembersConflict/analyzerCode: Fail
 InputFileNotFound/analyzerCode: Fail
 InputFileNotFound/example: Fail
 IntegerLiteralIsOutOfRange/example: Fail
@@ -411,4 +415,3 @@
 UnterminatedToken/example: Fail
 YieldAsIdentifier/example: Fail
 YieldNotGenerator/example: Fail
-
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index bf341d7..932840e 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -1423,6 +1423,80 @@
   template: "This is the type variable."
   severity: CONTEXT
 
+DeclaredMemberConflictsWithInheritedMember:
+  template: "Can't declare a member that conflicts with an inherited one."
+  severity: ERROR_LEGACY_WARNING
+  script:
+    - >-
+      class A {
+        var foo;
+      }
+      class B extends A {
+        foo() {}
+      }
+    - >-
+      abstract class A {
+        get foo;
+      }
+      class B implements A {
+        foo() {}
+      }
+    - >-
+      class A {
+        foo() {}
+      }
+      class B extends A {
+        var foo;
+      }
+    - >-
+      abstract class A {
+        foo();
+      }
+      class B implements A {
+        var foo;
+      }
+
+DeclaredMemberConflictsWithInheritedMemberCause:
+  template: "This is the inherited member."
+  severity: CONTEXT
+
+InheritedMembersConflict:
+  template: "Can't inherit members that conflict with each other."
+  severity: ERROR_LEGACY_WARNING
+  script:
+    - >-
+      class A {
+        foo() {}
+      }
+      abstract class B {
+        get foo;
+      }
+      class C extends A implements B {}
+    - >-
+      class A {
+        var foo;
+      }
+      abstract class B {
+        foo();
+      }
+      class C extends A implements B {}
+    - >-
+      class A {
+        get foo => 0;
+      }
+      abstract class B {
+        foo();
+      }
+      class C extends A implements B {}
+
+InheritedMembersConflictCause1:
+  template: "This is one inherited member."
+  severity: CONTEXT
+
+InheritedMembersConflictCause2:
+  template: "This is the other inherited member."
+  severity: CONTEXT
+
 IllegalMixin:
   template: "The type '#name' can't be mixed in."
 
@@ -2103,3 +2177,7 @@
   template: "Can't invoke the type '#type' because its declaration of `.call` is not a method."
   tip: "Change .call to a method or explicitly invoke .call."
   severity: ERROR
+
+ExpectedOneExpression:
+  template: "Expected one expression, but found additional input."
+  severity: ERROR
diff --git a/pkg/front_end/test/fasta/expression_test.dart b/pkg/front_end/test/fasta/expression_test.dart
index 37741b9..4a21e78 100644
--- a/pkg/front_end/test/fasta/expression_test.dart
+++ b/pkg/front_end/test/fasta/expression_test.dart
@@ -11,12 +11,7 @@
 import "dart:io" show File, IOSink;
 
 import "package:kernel/ast.dart"
-    show
-        Procedure,
-        Component,
-        DynamicType,
-        DartType,
-        TypeParameter;
+    show Procedure, Component, DynamicType, DartType, TypeParameter;
 
 import "package:testing/testing.dart"
     show Chain, ChainContext, Result, Step, TestDescription, runMe;
@@ -41,7 +36,7 @@
 import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
 
 import 'package:front_end/src/fasta/incremental_compiler.dart'
-    show IncrementalCompiler, IncrementalCompilationPosition;
+    show IncrementalCompiler;
 
 import 'package:kernel/text/ast_to_text.dart' show Printer;
 
@@ -326,13 +321,13 @@
       }
 
       for (var compiler in [sourceCompiler, dillCompiler]) {
-        IncrementalCompilationPosition enclosingNode =
-            compiler.resolveCompilationPosition(test.library, test.className);
-        Procedure compiledProcedure;
-        if (enclosingNode != null) {
-          compiledProcedure = await compiler.compileExpression(test.expression,
-              definitions, typeParams, enclosingNode, test.isStaticMethod);
-        }
+        Procedure compiledProcedure = await compiler.compileExpression(
+            test.expression,
+            definitions,
+            typeParams,
+            test.library,
+            test.className,
+            test.isStaticMethod);
         var errors = context.takeErrors();
         test.results.add(new CompilationResult(compiledProcedure, errors));
       }
diff --git a/pkg/front_end/test/fasta/messages_test.dart b/pkg/front_end/test/fasta/messages_test.dart
index 279bc8a..16f96a5 100644
--- a/pkg/front_end/test/fasta/messages_test.dart
+++ b/pkg/front_end/test/fasta/messages_test.dart
@@ -29,7 +29,7 @@
 import 'package:front_end/src/fasta/severity.dart'
     show Severity, severityEnumValues;
 
-import 'package:front_end/src/testing/hybrid_file_system.dart'
+import 'package:front_end/src/fasta/hybrid_file_system.dart'
     show HybridFileSystem;
 
 import "../../tool/_fasta/entry_points.dart" show BatchCompiler;
diff --git a/pkg/front_end/test/fasta/parser/type_info_test.dart b/pkg/front_end/test/fasta/parser/type_info_test.dart
index d09b895..c0b27e8 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:front_end/src/fasta/messages.dart';
 import 'package:front_end/src/fasta/parser.dart';
+import 'package:front_end/src/fasta/parser/token_stream_rewriter.dart';
 import 'package:front_end/src/fasta/parser/type_info.dart';
 import 'package:front_end/src/fasta/parser/type_info_impl.dart';
 import 'package:front_end/src/fasta/scanner.dart';
@@ -13,12 +14,13 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(TokenInfoTest);
+    defineReflectiveTests(TypeInfoTest);
+    defineReflectiveTests(TypeParamOrArgInfoTest);
   });
 }
 
 @reflectiveTest
-class TokenInfoTest {
+class TypeInfoTest {
   void test_noType() {
     final Token start = scanString('before ;').tokens;
 
@@ -190,6 +192,7 @@
   void test_simpleTypeArgumentsInfo() {
     final Token start = scanString('before C<T> ;').tokens;
     final Token expectedEnd = start.next.next.next.next;
+    expect(expectedEnd.lexeme, '>');
 
     expect(simpleTypeWith1Argument.skipType(start), expectedEnd);
     expect(simpleTypeWith1Argument.couldBeExpression, isFalse);
@@ -226,6 +229,47 @@
         simpleTypeWith1Argument.parseType(start, new Parser(listener)));
   }
 
+  void test_simpleTypeArgumentsInfo2() {
+    final Token start = scanString('before S<C<T>> ;').tokens.next.next;
+    expect(start.lexeme, '<');
+    final Token expectedEnd = start.next.next.next;
+    expect(expectedEnd.next.lexeme, '>>');
+
+    expect(simpleTypeWith1Argument.skipType(start), expectedEnd);
+    expect(simpleTypeWith1Argument.couldBeExpression, isFalse);
+
+    TypeInfoListener listener;
+    assertResult(Token actualEnd) {
+      expect(actualEnd, expectedEnd);
+      expect(listener.calls, [
+        'handleIdentifier C typeReference',
+        'beginTypeArguments <',
+        'handleIdentifier T typeReference',
+        'handleNoTypeArguments >>',
+        'handleType T >>',
+        'endTypeArguments 1 < >>',
+        'handleType C >>',
+      ]);
+      expect(listener.errors, isNull);
+    }
+
+    listener = new TypeInfoListener();
+    assertResult(
+        simpleTypeWith1Argument.ensureTypeNotVoid(start, new Parser(listener)));
+
+    listener = new TypeInfoListener();
+    assertResult(
+        simpleTypeWith1Argument.ensureTypeOrVoid(start, new Parser(listener)));
+
+    listener = new TypeInfoListener();
+    assertResult(
+        simpleTypeWith1Argument.parseTypeNotVoid(start, new Parser(listener)));
+
+    listener = new TypeInfoListener();
+    assertResult(
+        simpleTypeWith1Argument.parseType(start, new Parser(listener)));
+  }
+
   void test_computeType_basic() {
     expectInfo(noType, '');
     expectInfo(noType, ';');
@@ -520,21 +564,23 @@
     // TOOD(danrubel): dynamic, do, other keywords, malformed, recovery
     // <T>
 
-    expectComplexInfo('G<int double> g',
-        required: true,
-        tokenAfter: 'g',
-        expectedCalls: [
-          'handleIdentifier G typeReference',
-          'beginTypeArguments <',
-          'handleIdentifier int typeReference',
-          'handleNoTypeArguments double',
-          'handleType int double',
-          'endTypeArguments 1 < >',
-          'handleType G g',
-        ],
-        expectedErrors: [
-          error(codeExpectedToken, 6, 6)
-        ]);
+    // TODO(danrubel): Improve missing comma recovery
+    expectTypeParamOrArg(noTypeParamOrArg, 'G<int double> g');
+    // expectComplexInfo('G<int double> g',
+    //     required: true,
+    //     tokenAfter: 'g',
+    //     expectedCalls: [
+    //       'handleIdentifier G typeReference',
+    //       'beginTypeArguments <',
+    //       'handleIdentifier int typeReference',
+    //       'handleNoTypeArguments double',
+    //       'handleType int double',
+    //       'endTypeArguments 1 < >',
+    //       'handleType G g',
+    //     ],
+    //     expectedErrors: [
+    //       error(codeExpectedToken, 6, 6)
+    //     ]);
 
     expectInfo(noType, 'C<>', required: false);
     expectComplexInfo('C<>', required: true, expectedCalls: [
@@ -542,7 +588,7 @@
       'beginTypeArguments <',
       'handleIdentifier  typeReference',
       'handleNoTypeArguments >',
-      'handleType > >',
+      'handleType  >',
       'endTypeArguments 1 < >',
       'handleType C ',
     ], expectedErrors: [
@@ -553,7 +599,7 @@
       'beginTypeArguments <',
       'handleIdentifier  typeReference',
       'handleNoTypeArguments >',
-      'handleType > >',
+      'handleType  >',
       'endTypeArguments 1 < >',
       'handleType C f',
     ], expectedErrors: [
@@ -565,6 +611,23 @@
     expectInfo(noType, 'C<T && T>U;', required: false);
   }
 
+  void test_computeType_nested() {
+    expectNestedInfo(simpleType, '<T>');
+    expectNestedInfo(simpleTypeWith1Argument, '<T<S>>');
+    expectNestedComplexInfo('<T<S,R>>');
+    expectNestedComplexInfo('<T<S Function()>>');
+    expectNestedComplexInfo('<T<S Function()>>');
+  }
+
+  void test_computeType_nested_recovery() {
+    expectNestedInfo(noType, '<>');
+    expectNestedInfo(noType, '<3>');
+    expectNestedInfo(noType, '<,T>');
+    expectNestedInfo(simpleType, '<T,>');
+    expectNestedInfo(noType, '<,T<S>>');
+    expectNestedInfo(simpleTypeWith1Argument, '<T<S>,>');
+  }
+
   void test_computeType_prefixed() {
     expectInfo(noType, 'C.a', required: false);
     expectInfo(noType, 'C.a;', required: false);
@@ -589,6 +652,20 @@
     expectInfo(prefixedType, 'C.a Function');
   }
 
+  void test_computeType_prefixedComplex() {
+    expectComplexInfo('a < b, c > d', tokenAfter: 'd');
+    expectComplexInfo('a < b, c > d', tokenAfter: 'd');
+
+    expectComplexInfo('a < p.b, c > d', tokenAfter: 'd');
+    expectComplexInfo('a < b, p.c > d', tokenAfter: 'd');
+
+    expectInfo(noType, 'a < p.q.b, c > d', required: false);
+    expectInfo(noType, 'a < b, p.q.c > d', required: false);
+
+    expectInfo(simpleType, 'a < p.q.b, c > d', required: true);
+    expectInfo(simpleType, 'a < b, p.q.c > d', required: true);
+  }
+
   void test_computeType_prefixedGFT() {
     expectComplexInfo('C.a Function(', // Scanner inserts synthetic ')'.
         required: true,
@@ -752,6 +829,255 @@
   }
 }
 
+@reflectiveTest
+class TypeParamOrArgInfoTest {
+  void test_noTypeParamOrArg() {
+    final Token start = scanString('before after').tokens;
+
+    expect(noTypeParamOrArg.skip(start), start);
+  }
+
+  void test_noTypeParamOrArg_parseArguments() {
+    final Token start = scanString('before after').tokens;
+    final TypeInfoListener listener = new TypeInfoListener();
+
+    expect(noTypeParamOrArg.parseArguments(start, new Parser(listener)), start);
+    expect(listener.calls, ['handleNoTypeArguments after']);
+    expect(listener.errors, isNull);
+  }
+
+  void test_simple_skip() {
+    final Token start = scanString('before <T> after').tokens;
+    final Token gt = start.next.next.next;
+    expect(gt.lexeme, '>');
+
+    expect(simpleTypeArgument1.skip(start), gt);
+  }
+
+  void test_simple_skip2() {
+    final Token start = scanString('before <S<T>> after').tokens.next.next;
+    Token t = start.next.next;
+    expect(t.next.lexeme, '>>');
+
+    expect(simpleTypeArgument1.skip(start), t);
+  }
+
+  void test_simple_parseArguments() {
+    final Token start = scanString('before <T> after').tokens;
+    final Token gt = start.next.next.next;
+    expect(gt.lexeme, '>');
+    final TypeInfoListener listener = new TypeInfoListener();
+
+    expect(simpleTypeArgument1.parseArguments(start, new Parser(listener)), gt);
+    expect(listener.calls, [
+      'beginTypeArguments <',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >',
+      'handleType T >',
+      'endTypeArguments 1 < >'
+    ]);
+    expect(listener.errors, isNull);
+  }
+
+  void test_simple_parseArguments2() {
+    final Token start = scanString('before <S<T>> after').tokens.next.next;
+    Token t = start.next.next;
+    expect(t.next.lexeme, '>>');
+    final TypeInfoListener listener = new TypeInfoListener();
+
+    expect(simpleTypeArgument1.parseArguments(start, new Parser(listener)), t);
+    expect(listener.calls, [
+      'beginTypeArguments <',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >>',
+      'handleType T >>',
+      'endTypeArguments 1 < >>'
+    ]);
+    expect(listener.errors, isNull);
+  }
+
+  void test_computeTypeParamOrArg_basic() {
+    expectTypeParamOrArg(noTypeParamOrArg, '');
+    expectTypeParamOrArg(noTypeParamOrArg, 'a');
+    expectTypeParamOrArg(noTypeParamOrArg, 'a b');
+    expectTypeParamOrArg(noTypeParamOrArg, '<');
+    expectTypeParamOrArg(noTypeParamOrArg, '< b');
+    expectTypeParamOrArg(noTypeParamOrArg, '< 3 >');
+  }
+
+  void test_computeTypeParamOrArg_simple() {
+    expectTypeParamOrArg(simpleTypeArgument1, '<T>');
+  }
+
+  void test_computeTypeParamOrArg_simple_nested() {
+    String source = '<C<T>>';
+    Token start = scan(source).next.next;
+    expect(start.lexeme, 'C');
+    Token gtgt = start.next.next.next;
+    expect(gtgt.lexeme, '>>');
+
+    TypeParamOrArgInfo typeVarInfo = computeTypeParamOrArg(start, gtgt);
+    expect(typeVarInfo, simpleTypeArgument1, reason: source);
+  }
+
+  void test_computeTypeVar_complex() {
+    expectComplexTypeParamOrArg('<S,T>', expectedCalls: [
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'handleNoTypeArguments ,',
+      'handleType S ,',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >',
+      'handleType T >',
+      'endTypeArguments 2 < >'
+    ]);
+    expectComplexTypeParamOrArg('<S Function()>', expectedCalls: [
+      'beginTypeArguments <',
+      'handleNoTypeVariables (',
+      'beginFunctionType S',
+      'handleIdentifier S typeReference',
+      'handleNoTypeArguments Function',
+      'handleType S Function',
+      'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+      'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+      'endFunctionType Function >',
+      'endTypeArguments 1 < >'
+    ]);
+    expectComplexTypeParamOrArg('<void Function()>', expectedCalls: [
+      'beginTypeArguments <',
+      'handleNoTypeVariables (',
+      'beginFunctionType void',
+      'handleVoidKeyword void',
+      'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+      'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+      'endFunctionType Function >',
+      'endTypeArguments 1 < >'
+    ]);
+    expectComplexTypeParamOrArg('<S<T>>', expectedCalls: [
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >',
+      'handleType T >',
+      'endTypeArguments 1 < >',
+      'handleType S >',
+      'endTypeArguments 1 < >'
+    ]);
+    expectComplexTypeParamOrArg('<S<T>>', splitGtGt: false, expectedCalls: [
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >>',
+      'handleType T >>',
+      'endTypeArguments 1 < >>',
+      'handleType S >>',
+      'endTypeArguments 1 < >>'
+    ]);
+    expectComplexTypeParamOrArg('<S<Function()>>', expectedCalls: [
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'beginTypeArguments <',
+      'handleNoTypeVariables (',
+      'beginFunctionType Function',
+      'handleNoType <',
+      'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+      'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+      'endFunctionType Function >',
+      'endTypeArguments 1 < >',
+      'handleType S >',
+      'endTypeArguments 1 < >'
+    ]);
+    expectComplexTypeParamOrArg('<S<Function()>>',
+        splitGtGt: false,
+        expectedCalls: [
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'beginTypeArguments <',
+          'handleNoTypeVariables (',
+          'beginFunctionType Function',
+          'handleNoType <',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function >>',
+          'endTypeArguments 1 < >>',
+          'handleType S >>',
+          'endTypeArguments 1 < >>'
+        ]);
+    expectComplexTypeParamOrArg('<S<void Function()>>', expectedCalls: [
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'beginTypeArguments <',
+      'handleNoTypeVariables (',
+      'beginFunctionType void', // was 'beginFunctionType Function'
+      'handleVoidKeyword void', // was 'handleNoType <'
+      'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+      'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+      'endFunctionType Function >',
+      'endTypeArguments 1 < >',
+      'handleType S >',
+      'endTypeArguments 1 < >'
+    ]);
+    expectComplexTypeParamOrArg('<S<void Function()>>',
+        splitGtGt: false,
+        expectedCalls: [
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'beginTypeArguments <',
+          'handleNoTypeVariables (',
+          'beginFunctionType void', // was 'beginFunctionType Function'
+          'handleVoidKeyword void', // was 'handleNoType <'
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function >>',
+          'endTypeArguments 1 < >>',
+          'handleType S >>',
+          'endTypeArguments 1 < >>'
+        ]);
+  }
+
+  void test_computeTypeVar_complex_recovery() {
+    expectComplexTypeParamOrArg('<@A S,T>', expectedErrors: [
+      error(codeUnexpectedToken, 1, 1)
+    ], expectedCalls: [
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'handleNoTypeArguments ,',
+      'handleType S ,',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >',
+      'handleType T >',
+      'endTypeArguments 2 < >'
+    ]);
+    expectComplexTypeParamOrArg('<@A() S,T>', expectedErrors: [
+      error(codeUnexpectedToken, 1, 1)
+    ], expectedCalls: [
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'handleNoTypeArguments ,',
+      'handleType S ,',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >',
+      'handleType T >',
+      'endTypeArguments 2 < >'
+    ]);
+    expectComplexTypeParamOrArg('<@A() @B S,T>', expectedErrors: [
+      error(codeUnexpectedToken, 1, 1),
+      error(codeUnexpectedToken, 6, 1),
+    ], expectedCalls: [
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'handleNoTypeArguments ,',
+      'handleType S ,',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >',
+      'handleType T >',
+      'endTypeArguments 2 < >'
+    ]);
+  }
+}
+
 void expectInfo(expectedInfo, String source,
     {bool required,
     String expectedAfter,
@@ -782,6 +1108,28 @@
       expectedErrors: expectedErrors);
 }
 
+void expectNestedInfo(expectedInfo, String source,
+    {List<String> expectedCalls, List<ExpectedError> expectedErrors}) {
+  expect(source.startsWith('<'), isTrue);
+  Token start = scan(source).next;
+  Token innerEndGroup = start;
+  while (!innerEndGroup.next.isEof) {
+    innerEndGroup = innerEndGroup.next;
+  }
+  if (!optional('>>', innerEndGroup)) {
+    innerEndGroup = null;
+  }
+  compute(expectedInfo, source, start, true, innerEndGroup != null ? '>>' : '>',
+      expectedCalls, expectedErrors,
+      innerEndGroup: innerEndGroup);
+}
+
+void expectNestedComplexInfo(String source,
+    {List<String> expectedCalls, List<ExpectedError> expectedErrors}) {
+  expectNestedInfo(const isInstanceOf<ComplexTypeInfo>(), source,
+      expectedCalls: expectedCalls, expectedErrors: expectedErrors);
+}
+
 void compute(
     expectedInfo,
     String source,
@@ -789,13 +1137,20 @@
     bool required,
     String expectedAfter,
     List<String> expectedCalls,
-    List<ExpectedError> expectedErrors) {
-  TypeInfo typeInfo = computeType(start, required);
+    List<ExpectedError> expectedErrors,
+    {Token innerEndGroup}) {
+  int expectedGtGtAndNullEndCount = countGtGtAndNullEnd(start);
+  TypeInfo typeInfo = computeType(start, required, innerEndGroup);
   expect(typeInfo, expectedInfo, reason: source);
+  expect(countGtGtAndNullEnd(start), expectedGtGtAndNullEndCount,
+      reason: 'computeType should not modify the token stream');
+
   if (typeInfo is ComplexTypeInfo) {
     expect(typeInfo.start, start.next, reason: source);
     expect(typeInfo.couldBeExpression, isFalse);
     expectEnd(expectedAfter, typeInfo.skipType(start));
+    expect(countGtGtAndNullEnd(start), expectedGtGtAndNullEndCount,
+        reason: 'TypeInfo.skipType should not modify the token stream');
 
     TypeInfoListener listener;
     assertResult(Token actualEnd) {
@@ -817,7 +1172,80 @@
     listener = new TypeInfoListener();
     assertResult(typeInfo.parseType(start, new Parser(listener)));
   } else {
-    assert(expectedErrors == null);
+    expect(expectedErrors, isNull);
+  }
+}
+
+void expectComplexTypeParamOrArg(String source,
+    {bool splitGtGt: true,
+    String tokenAfter,
+    List<String> expectedCalls,
+    List<ExpectedError> expectedErrors}) {
+  expectTypeParamOrArg(const isInstanceOf<ComplexTypeParamOrArgInfo>(), source,
+      splitGtGt: splitGtGt,
+      expectedAfter: tokenAfter,
+      expectedCalls: expectedCalls,
+      expectedErrors: expectedErrors);
+}
+
+void expectTypeParamOrArg(expectedInfo, String source,
+    {bool splitGtGt: true,
+    String expectedAfter,
+    List<String> expectedCalls,
+    List<ExpectedError> expectedErrors}) {
+  Token start = scan(source);
+  computeVar(expectedInfo, source, start, splitGtGt, expectedAfter,
+      expectedCalls, expectedErrors);
+}
+
+void computeVar(
+    expectedInfo,
+    String source,
+    Token start,
+    bool splitGtGt,
+    String expectedAfter,
+    List<String> expectedCalls,
+    List<ExpectedError> expectedErrors) {
+  int expectedGtGtAndNullEndCount = countGtGtAndNullEnd(start);
+  TypeParamOrArgInfo typeVarInfo = computeTypeParamOrArg(start);
+  expect(typeVarInfo, expectedInfo, reason: source);
+  expect(countGtGtAndNullEnd(start), expectedGtGtAndNullEndCount,
+      reason: 'computeTypeParamOrArg should not modify the token stream');
+
+  if (typeVarInfo is ComplexTypeParamOrArgInfo) {
+    expect(typeVarInfo.start, start.next, reason: source);
+    expectEnd(expectedAfter, typeVarInfo.skip(start));
+    expect(countGtGtAndNullEnd(start), expectedGtGtAndNullEndCount,
+        reason: 'TypeParamOrArgInfo.skipType'
+            ' should not modify the token stream');
+
+    TypeInfoListener listener = new TypeInfoListener();
+    Parser parser = new Parser(listener);
+    if (!splitGtGt) {
+      parser.cachedRewriter = new TokenStreamNonRewriter();
+    }
+    Token actualEnd = typeVarInfo.parseArguments(start, parser);
+    expectEnd(expectedAfter, actualEnd);
+    if (!splitGtGt) {
+      expect(countGtGtAndNullEnd(start), expectedGtGtAndNullEndCount,
+          reason: 'TypeParamOrArgInfo.parseArguments'
+              ' should not modify the token stream');
+    }
+
+    if (expectedCalls != null) {
+      // TypeInfoListener listener2 = new TypeInfoListener();
+      // new Parser(listener2).parseTypeArgumentsOpt(start);
+      // print('[');
+      // for (String call in listener2.calls) {
+      //   print("'$call',");
+      // }
+      // print(']');
+
+      expect(listener.calls, expectedCalls, reason: source);
+    }
+    expect(listener.errors, expectedErrors, reason: source);
+  } else {
+    expect(expectedErrors, isNull);
   }
 }
 
@@ -838,6 +1266,18 @@
   return new SyntheticToken(TokenType.EOF, 0)..setNext(start);
 }
 
+int countGtGtAndNullEnd(Token token) {
+  int count = 0;
+  while (!token.isEof) {
+    if ((optional('<', token) && token.endGroup == null) ||
+        optional('>>', token)) {
+      ++count;
+    }
+    token = token.next;
+  }
+  return count;
+}
+
 class TypeInfoListener implements Listener {
   List<String> calls = <String>[];
   List<ExpectedError> errors;
@@ -994,3 +1434,15 @@
   @override
   String toString() => 'error(${code.name}, $start, $length)';
 }
+
+class TokenStreamNonRewriter implements TokenStreamRewriter {
+  @override
+  Token splitGtGt(BeginToken start) {
+    Token gtgt = start.endGroup;
+    assert(gtgt != null);
+    assert(optional('>>', gtgt));
+    return gtgt;
+  }
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/front_end/test/src/incremental/hot_reload_e2e_test.dart b/pkg/front_end/test/src/incremental/hot_reload_e2e_test.dart
index 9ad0d40..023efa7 100644
--- a/pkg/front_end/test/src/incremental/hot_reload_e2e_test.dart
+++ b/pkg/front_end/test/src/incremental/hot_reload_e2e_test.dart
@@ -36,7 +36,7 @@
 import 'package:front_end/src/compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
 
-import 'package:front_end/src/testing/hybrid_file_system.dart'
+import 'package:front_end/src/fasta/hybrid_file_system.dart'
     show HybridFileSystem;
 
 import '../../tool/reload.dart' show RemoteVm;
diff --git a/pkg/front_end/test/subpackage_relationships_test.dart b/pkg/front_end/test/subpackage_relationships_test.dart
index 4ce0e7b..bcf7288 100644
--- a/pkg/front_end/test/subpackage_relationships_test.dart
+++ b/pkg/front_end/test/subpackage_relationships_test.dart
@@ -76,7 +76,6 @@
     'lib/src/fasta/scanner',
     'lib/src/fasta/source',
     'lib/src/fasta/util',
-    'lib/src/fasta/type_inference',
     'lib/src/scanner',
   ]),
   'lib/src/fasta/builder': new SubpackageRules(allowedDependencies: [
@@ -162,6 +161,7 @@
   'lib/src/testing': new SubpackageRules(allowedDependencies: [
     'lib/src',
     'lib/src/api_prototype',
+    'lib/src/fasta',
   ]),
 };
 
diff --git a/pkg/front_end/testcases/arrow_function.dart.direct.expect b/pkg/front_end/testcases/arrow_function.dart.direct.expect
index ec2e898..fd2c981 100644
--- a/pkg/front_end/testcases/arrow_function.dart.direct.expect
+++ b/pkg/front_end/testcases/arrow_function.dart.direct.expect
@@ -2,5 +2,5 @@
 import self as self;
 import "dart:core" as core;
 
-static method main<T extends core::Object>() → dynamic
+static method main<T extends core::Object = dynamic>() → dynamic
   return () → dynamic => self::main::T;
diff --git a/pkg/front_end/testcases/arrow_function.dart.direct.transformed.expect b/pkg/front_end/testcases/arrow_function.dart.direct.transformed.expect
index ec2e898..fd2c981 100644
--- a/pkg/front_end/testcases/arrow_function.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/arrow_function.dart.direct.transformed.expect
@@ -2,5 +2,5 @@
 import self as self;
 import "dart:core" as core;
 
-static method main<T extends core::Object>() → dynamic
+static method main<T extends core::Object = dynamic>() → dynamic
   return () → dynamic => self::main::T;
diff --git a/pkg/front_end/testcases/arrow_function.dart.outline.expect b/pkg/front_end/testcases/arrow_function.dart.outline.expect
index 8304bc1..ebd9bdd 100644
--- a/pkg/front_end/testcases/arrow_function.dart.outline.expect
+++ b/pkg/front_end/testcases/arrow_function.dart.outline.expect
@@ -2,5 +2,5 @@
 import self as self;
 import "dart:core" as core;
 
-static method main<T extends core::Object>() → dynamic
+static method main<T extends core::Object = dynamic>() → dynamic
   ;
diff --git a/pkg/front_end/testcases/arrow_function.dart.strong.expect b/pkg/front_end/testcases/arrow_function.dart.strong.expect
index 4cea2f2..b1e02d2 100644
--- a/pkg/front_end/testcases/arrow_function.dart.strong.expect
+++ b/pkg/front_end/testcases/arrow_function.dart.strong.expect
@@ -2,5 +2,5 @@
 import self as self;
 import "dart:core" as core;
 
-static method main<T extends core::Object>() → dynamic
+static method main<T extends core::Object = dynamic>() → dynamic
   return () → core::Type => self::main::T;
diff --git a/pkg/front_end/testcases/arrow_function.dart.strong.transformed.expect b/pkg/front_end/testcases/arrow_function.dart.strong.transformed.expect
index 4cea2f2..b1e02d2 100644
--- a/pkg/front_end/testcases/arrow_function.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/arrow_function.dart.strong.transformed.expect
@@ -2,5 +2,5 @@
 import self as self;
 import "dart:core" as core;
 
-static method main<T extends core::Object>() → dynamic
+static method main<T extends core::Object = dynamic>() → dynamic
   return () → core::Type => self::main::T;
diff --git a/pkg/front_end/testcases/bug30695.dart.strong.expect b/pkg/front_end/testcases/bug30695.dart.strong.expect
index 618721b..f784954 100644
--- a/pkg/front_end/testcases/bug30695.dart.strong.expect
+++ b/pkg/front_end/testcases/bug30695.dart.strong.expect
@@ -15,4 +15,7 @@
   method foo() → dynamic
     return 42;
 }
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
+  foo() => 42;
+  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug32629.dart.direct.expect b/pkg/front_end/testcases/bug32629.dart.direct.expect
index 1f4307c..2269f15 100644
--- a/pkg/front_end/testcases/bug32629.dart.direct.expect
+++ b/pkg/front_end/testcases/bug32629.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Reducer<S extends core::Object> = (S, dynamic) → S;
+typedef Reducer<S extends core::Object = dynamic> = (S, dynamic) → S;
 class A extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
@@ -11,7 +11,7 @@
     return a;
   }
 }
-static method foo<S extends core::Object>((self::foo::S, dynamic) → self::foo::S v) → void {}
+static method foo<S extends core::Object = dynamic>((self::foo::S, dynamic) → self::foo::S v) → void {}
 static method main() → void {
   self::foo<core::String>(new self::A::•());
 }
diff --git a/pkg/front_end/testcases/bug32629.dart.direct.transformed.expect b/pkg/front_end/testcases/bug32629.dart.direct.transformed.expect
index 1f4307c..2269f15 100644
--- a/pkg/front_end/testcases/bug32629.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/bug32629.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Reducer<S extends core::Object> = (S, dynamic) → S;
+typedef Reducer<S extends core::Object = dynamic> = (S, dynamic) → S;
 class A extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
@@ -11,7 +11,7 @@
     return a;
   }
 }
-static method foo<S extends core::Object>((self::foo::S, dynamic) → self::foo::S v) → void {}
+static method foo<S extends core::Object = dynamic>((self::foo::S, dynamic) → self::foo::S v) → void {}
 static method main() → void {
   self::foo<core::String>(new self::A::•());
 }
diff --git a/pkg/front_end/testcases/bug32629.dart.outline.expect b/pkg/front_end/testcases/bug32629.dart.outline.expect
index d37f8be..fd95657 100644
--- a/pkg/front_end/testcases/bug32629.dart.outline.expect
+++ b/pkg/front_end/testcases/bug32629.dart.outline.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Reducer<S extends core::Object> = (S, dynamic) → S;
+typedef Reducer<S extends core::Object = dynamic> = (S, dynamic) → S;
 class A extends core::Object {
   synthetic constructor •() → void
     ;
   method call(dynamic a, dynamic b) → dynamic
     ;
 }
-static method foo<S extends core::Object>((self::foo::S, dynamic) → self::foo::S v) → void
+static method foo<S extends core::Object = dynamic>((self::foo::S, dynamic) → self::foo::S v) → void
   ;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/covariant_generic.dart.direct.expect b/pkg/front_end/testcases/covariant_generic.dart.direct.expect
index 6c077b6..7070b05 100644
--- a/pkg/front_end/testcases/covariant_generic.dart.direct.expect
+++ b/pkg/front_end/testcases/covariant_generic.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Callback<T extends core::Object> = (T) → void;
-class Foo<T extends core::Object> extends core::Object {
+typedef Callback<T extends core::Object = dynamic> = (T) → void;
+class Foo<T extends core::Object = dynamic> extends core::Object {
   final field self::Foo::T finalField;
   final field (self::Foo::T) → void callbackField;
   field self::Foo::T mutableField = null;
diff --git a/pkg/front_end/testcases/covariant_generic.dart.direct.transformed.expect b/pkg/front_end/testcases/covariant_generic.dart.direct.transformed.expect
index 6c077b6..7070b05 100644
--- a/pkg/front_end/testcases/covariant_generic.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/covariant_generic.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Callback<T extends core::Object> = (T) → void;
-class Foo<T extends core::Object> extends core::Object {
+typedef Callback<T extends core::Object = dynamic> = (T) → void;
+class Foo<T extends core::Object = dynamic> extends core::Object {
   final field self::Foo::T finalField;
   final field (self::Foo::T) → void callbackField;
   field self::Foo::T mutableField = null;
diff --git a/pkg/front_end/testcases/covariant_generic.dart.outline.expect b/pkg/front_end/testcases/covariant_generic.dart.outline.expect
index e0c1173..ca50348 100644
--- a/pkg/front_end/testcases/covariant_generic.dart.outline.expect
+++ b/pkg/front_end/testcases/covariant_generic.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Callback<T extends core::Object> = (T) → void;
-class Foo<T extends core::Object> extends core::Object {
+typedef Callback<T extends core::Object = dynamic> = (T) → void;
+class Foo<T extends core::Object = dynamic> extends core::Object {
   final field self::Foo::T finalField;
   final field (self::Foo::T) → void callbackField;
   field self::Foo::T mutableField;
diff --git a/pkg/front_end/testcases/expression/invalid.expression.yaml.expect b/pkg/front_end/testcases/expression/invalid.expression.yaml.expect
index 1ce824d..1e3cd80 100644
--- a/pkg/front_end/testcases/expression/invalid.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/invalid.expression.yaml.expect
@@ -1,4 +1,5 @@
 Errors: {
+  Can't find ')' to match '('. (@4)
   Expected an identifier, but got '*'. (@0)
   Method not found: 'foo'. (@1)
   Getter not found: ''. (@0)
diff --git a/pkg/front_end/testcases/expression/lib_nonctor.expression.yaml b/pkg/front_end/testcases/expression/lib_nonctor.expression.yaml
index bae7baa..637ef0c 100644
--- a/pkg/front_end/testcases/expression/lib_nonctor.expression.yaml
+++ b/pkg/front_end/testcases/expression/lib_nonctor.expression.yaml
@@ -6,4 +6,4 @@
 definitions: []
 position: "main.dart"
 expression: |
-  new Random();
+  new Random()
diff --git a/pkg/front_end/testcases/expression/nolib.expression.yaml.expect b/pkg/front_end/testcases/expression/nolib.expression.yaml.expect
index ba1f145..c46c67f 100644
--- a/pkg/front_end/testcases/expression/nolib.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/nolib.expression.yaml.expect
@@ -1,3 +1,4 @@
 Errors: {
 }
-<no procedure>
+method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
+  return 0;
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
index b5a35db..4802c5b 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
@@ -1,7 +1,7 @@
 Errors: {
-  A value of type 'main::A<dynamic>' can't be assigned to a variable of type 'main::A::debugExpr::T'. (@17)
+  A value of type 'main::A<dynamic>' can't be assigned to a variable of type 'T'. (@17)
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>() → dynamic
   return () → dart.core::Null {
-    main::A::debugExpr::T k = let final dynamic #t1 = let dynamic _ = null in invalid-expression "Error: A value of type 'main::A<dynamic>' can't be assigned to a variable of type 'main::A::debugExpr::T'.\nTry changing the type of the left hand side, or casting the right hand side to 'main::A::debugExpr::T'." in let final dynamic #t2 = new main::A::•<dynamic>() in null;
+    main::A::debugExpr::T k = let final dynamic #t1 = let dynamic _ = null in invalid-expression "org-dartlang-debug:synthetic_debug_expression:2:13: Error: A value of type 'main::A<dynamic>' can't be assigned to a variable of type 'T'.\nTry changing the type of the left hand side, or casting the right hand side to 'T'.\n  T k = new A();\n            ^" in let final dynamic #t2 = new main::A::•<dynamic>() in null;
   };
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.expect
index dc19dc1..197f600 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.expect
@@ -12,7 +12,7 @@
   print(void g<T>(T t) {});
              ^"]/* from null */;
 static method main() → dynamic {
-  dynamic x = let final <T extends core::Object>(T) → void f = <T extends core::Object>(T t) → dynamic {} in f;
+  dynamic x = let final <T extends core::Object = dynamic>(T) → void f = <T extends core::Object = dynamic>(T t) → dynamic {} in f;
   core::print(x.runtimeType);
-  core::print(let final <T extends core::Object>(T) → void g = <T extends core::Object>(T t) → dynamic {} in g);
+  core::print(let final <T extends core::Object = dynamic>(T) → void g = <T extends core::Object = dynamic>(T t) → dynamic {} in g);
 }
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.transformed.expect
index dc19dc1..197f600 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.transformed.expect
@@ -12,7 +12,7 @@
   print(void g<T>(T t) {});
              ^"]/* from null */;
 static method main() → dynamic {
-  dynamic x = let final <T extends core::Object>(T) → void f = <T extends core::Object>(T t) → dynamic {} in f;
+  dynamic x = let final <T extends core::Object = dynamic>(T) → void f = <T extends core::Object = dynamic>(T t) → dynamic {} in f;
   core::print(x.runtimeType);
-  core::print(let final <T extends core::Object>(T) → void g = <T extends core::Object>(T t) → dynamic {} in g);
+  core::print(let final <T extends core::Object = dynamic>(T) → void g = <T extends core::Object = dynamic>(T t) → dynamic {} in g);
 }
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.expect
index f1c5274..99ed439 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.expect
@@ -12,7 +12,7 @@
   print(void g<T>(T t) {});
              ^"]/* from null */;
 static method main() → dynamic {
-  <T extends core::Object>(T) → core::Null x = let final <T extends core::Object>(T) → core::Null f = <T extends core::Object>(T t) → core::Null {} in f;
+  <T extends core::Object = dynamic>(T) → core::Null x = let final <T extends core::Object = dynamic>(T) → core::Null f = <T extends core::Object = dynamic>(T t) → core::Null {} in f;
   core::print(x.{core::Object::runtimeType});
-  core::print(let final <T extends core::Object>(T) → core::Null g = <T extends core::Object>(T t) → core::Null {} in g);
+  core::print(let final <T extends core::Object = dynamic>(T) → core::Null g = <T extends core::Object = dynamic>(T t) → core::Null {} in g);
 }
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.transformed.expect
index f1c5274..99ed439 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.transformed.expect
@@ -12,7 +12,7 @@
   print(void g<T>(T t) {});
              ^"]/* from null */;
 static method main() → dynamic {
-  <T extends core::Object>(T) → core::Null x = let final <T extends core::Object>(T) → core::Null f = <T extends core::Object>(T t) → core::Null {} in f;
+  <T extends core::Object = dynamic>(T) → core::Null x = let final <T extends core::Object = dynamic>(T) → core::Null f = <T extends core::Object = dynamic>(T t) → core::Null {} in f;
   core::print(x.{core::Object::runtimeType});
-  core::print(let final <T extends core::Object>(T) → core::Null g = <T extends core::Object>(T t) → core::Null {} in g);
+  core::print(let final <T extends core::Object = dynamic>(T) → core::Null g = <T extends core::Object = dynamic>(T t) → core::Null {} in g);
 }
diff --git a/pkg/front_end/testcases/incremental.status b/pkg/front_end/testcases/incremental.status
index f14d52e..d5feffe 100644
--- a/pkg/front_end/testcases/incremental.status
+++ b/pkg/front_end/testcases/incremental.status
@@ -3,8 +3,3 @@
 # BSD-style license that can be found in the LICENSE.md file.
 
 # Status file for the test suite ../test/fasta/incremental_test.dart.
-
-dartino/override_field_with_method_conflict.incremental: Fail # These tests are the incremental version of tests like language_2/field_override* and language_2/override_field_method*
-dartino/override_getter_with_method_conflict.incremental: Fail # These tests are the incremental version of tests like language_2/field_override* and language_2/override_field_method*
-dartino/override_method_with_field_conflict.incremental: Fail # These tests are the incremental version of tests like language_2/field_override* and language_2/override_field_method*
-dartino/override_method_with_getter_conflict.incremental: Fail # These tests are the incremental version of tests like language_2/field_override* and language_2/override_field_method*
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/status.status b/pkg/front_end/testcases/incremental_initialize_from_dill/status.status
index 656e437..79a60b5 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/status.status
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/status.status
@@ -4,5 +4,4 @@
 
 # Status file for the test suite ../test/incremental_load_from_dill_yaml_test.dart.
 
-calculated_bounds_no_strongmode: Crash
 strongmode_mixins_2: Crash
diff --git a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.expect b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.expect
index 3cd8d21..4624781 100644
--- a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-abstract class D<T extends core::Object> extends core::Object {
+abstract class D<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::D::T t) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.transformed.expect
index 3cd8d21..4624781 100644
--- a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-abstract class D<T extends core::Object> extends core::Object {
+abstract class D<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::D::T t) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.outline.expect b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.outline.expect
index 66f08a3..09b40a0 100644
--- a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     ;
 }
-abstract class D<T extends core::Object> extends core::Object {
+abstract class D<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::D::T t) → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/assert.dart.direct.expect b/pkg/front_end/testcases/inference/assert.dart.direct.expect
index e5a1b8f..53b9899 100644
--- a/pkg/front_end/testcases/inference/assert.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/assert.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   assert(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference/assert.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/assert.dart.direct.transformed.expect
index e5a1b8f..53b9899 100644
--- a/pkg/front_end/testcases/inference/assert.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/assert.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   assert(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference/assert.dart.outline.expect b/pkg/front_end/testcases/inference/assert.dart.outline.expect
index ac49c9e..e8c03c5 100644
--- a/pkg/front_end/testcases/inference/assert.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/assert.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/inference/assert.dart.strong.expect b/pkg/front_end/testcases/inference/assert.dart.strong.expect
index 004b776..cfbd624 100644
--- a/pkg/front_end/testcases/inference/assert.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/assert.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   assert(self::f<core::bool>());
diff --git a/pkg/front_end/testcases/inference/assert.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/assert.dart.strong.transformed.expect
index 004b776..cfbd624 100644
--- a/pkg/front_end/testcases/inference/assert.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/assert.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   assert(self::f<core::bool>());
diff --git a/pkg/front_end/testcases/inference/assert_initializer.dart.direct.expect b/pkg/front_end/testcases/inference/assert_initializer.dart.direct.expect
index 602da12..a90d65d 100644
--- a/pkg/front_end/testcases/inference/assert_initializer.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/assert_initializer.dart.direct.expect
@@ -10,7 +10,7 @@
     : assert(self::f<dynamic>(), self::f<dynamic>()), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {
   assert(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference/assert_initializer.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/assert_initializer.dart.direct.transformed.expect
index 602da12..a90d65d 100644
--- a/pkg/front_end/testcases/inference/assert_initializer.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/assert_initializer.dart.direct.transformed.expect
@@ -10,7 +10,7 @@
     : assert(self::f<dynamic>(), self::f<dynamic>()), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {
   assert(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference/assert_initializer.dart.outline.expect b/pkg/front_end/testcases/inference/assert_initializer.dart.outline.expect
index 33bb051..5121bf1 100644
--- a/pkg/front_end/testcases/inference/assert_initializer.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/assert_initializer.dart.outline.expect
@@ -8,7 +8,7 @@
   constructor expressionAndMessage() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/assert_initializer.dart.strong.expect b/pkg/front_end/testcases/inference/assert_initializer.dart.strong.expect
index 27f0c32..f87c11c 100644
--- a/pkg/front_end/testcases/inference/assert_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/assert_initializer.dart.strong.expect
@@ -10,7 +10,7 @@
     : assert(self::f<core::bool>(), self::f<dynamic>()), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {
   assert(self::f<core::bool>());
diff --git a/pkg/front_end/testcases/inference/assert_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/assert_initializer.dart.strong.transformed.expect
index 27f0c32..f87c11c 100644
--- a/pkg/front_end/testcases/inference/assert_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/assert_initializer.dart.strong.transformed.expect
@@ -10,7 +10,7 @@
     : assert(self::f<core::bool>(), self::f<dynamic>()), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {
   assert(self::f<core::bool>());
diff --git a/pkg/front_end/testcases/inference/assign_local.dart.direct.expect b/pkg/front_end/testcases/inference/assign_local.dart.direct.expect
index 92719ee..35d51d7 100644
--- a/pkg/front_end/testcases/inference/assign_local.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/assign_local.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends self::A<self::B::T> {
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
   synthetic constructor •() → void
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/inference/assign_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/assign_local.dart.direct.transformed.expect
index 92719ee..35d51d7 100644
--- a/pkg/front_end/testcases/inference/assign_local.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/assign_local.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends self::A<self::B::T> {
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
   synthetic constructor •() → void
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/inference/assign_local.dart.outline.expect b/pkg/front_end/testcases/inference/assign_local.dart.outline.expect
index 134d614..43446c8 100644
--- a/pkg/front_end/testcases/inference/assign_local.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/assign_local.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class B<T extends core::Object> extends self::A<self::B::T> {
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/assign_local.dart.strong.expect b/pkg/front_end/testcases/inference/assign_local.dart.strong.expect
index e8e11fe..5eaea0d 100644
--- a/pkg/front_end/testcases/inference/assign_local.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/assign_local.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends self::A<self::B::T> {
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
   synthetic constructor •() → void
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/inference/assign_local.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/assign_local.dart.strong.transformed.expect
index e8e11fe..5eaea0d 100644
--- a/pkg/front_end/testcases/inference/assign_local.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/assign_local.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends self::A<self::B::T> {
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
   synthetic constructor •() → void
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/inference/bug30251.dart.direct.expect b/pkg/front_end/testcases/inference/bug30251.dart.direct.expect
index fdfd49f..b7f6d44 100644
--- a/pkg/front_end/testcases/inference/bug30251.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/bug30251.dart.direct.expect
@@ -8,6 +8,6 @@
     : self::C::x = self::f<dynamic>(1.+(p)), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>(self::f::T t) → self::f::T
+static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
   return t;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30251.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug30251.dart.direct.transformed.expect
index fdfd49f..b7f6d44 100644
--- a/pkg/front_end/testcases/inference/bug30251.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30251.dart.direct.transformed.expect
@@ -8,6 +8,6 @@
     : self::C::x = self::f<dynamic>(1.+(p)), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>(self::f::T t) → self::f::T
+static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
   return t;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30251.dart.outline.expect b/pkg/front_end/testcases/inference/bug30251.dart.outline.expect
index 8512f84..a19f31b 100644
--- a/pkg/front_end/testcases/inference/bug30251.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bug30251.dart.outline.expect
@@ -7,7 +7,7 @@
   constructor •(core::int p) → void
     ;
 }
-static method f<T extends core::Object>(self::f::T t) → self::f::T
+static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/bug30251.dart.strong.expect b/pkg/front_end/testcases/inference/bug30251.dart.strong.expect
index c3087fe..cb2070c 100644
--- a/pkg/front_end/testcases/inference/bug30251.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug30251.dart.strong.expect
@@ -8,6 +8,6 @@
     : self::C::x = self::f<core::int>(1.{core::num::+}(p)), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>(self::f::T t) → self::f::T
+static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
   return t;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30251.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug30251.dart.strong.transformed.expect
index c3087fe..cb2070c 100644
--- a/pkg/front_end/testcases/inference/bug30251.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30251.dart.strong.transformed.expect
@@ -8,6 +8,6 @@
     : self::C::x = self::f<core::int>(1.{core::num::+}(p)), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>(self::f::T t) → self::f::T
+static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
   return t;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.direct.expect b/pkg/front_end/testcases/inference/bug30624.dart.direct.expect
index 9a75e22..eeedbaf 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<E extends core::Object> extends core::Object {
+class C<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -29,5 +29,5 @@
     return 1.unary-();
   }
 }
-static method foo<E extends core::Object>(self::C<self::foo::E> c, (self::foo::E, self::foo::E) → core::int cmp) → void {}
+static method foo<E extends core::Object = dynamic>(self::C<self::foo::E> c, (self::foo::E, self::foo::E) → core::int cmp) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug30624.dart.direct.transformed.expect
index 9a75e22..eeedbaf 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<E extends core::Object> extends core::Object {
+class C<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -29,5 +29,5 @@
     return 1.unary-();
   }
 }
-static method foo<E extends core::Object>(self::C<self::foo::E> c, (self::foo::E, self::foo::E) → core::int cmp) → void {}
+static method foo<E extends core::Object = dynamic>(self::C<self::foo::E> c, (self::foo::E, self::foo::E) → core::int cmp) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.outline.expect b/pkg/front_end/testcases/inference/bug30624.dart.outline.expect
index f705538..ff60989 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<E extends core::Object> extends core::Object {
+class C<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method barA([(self::C::E, self::C::E) → core::int cmp]) → void
@@ -20,7 +20,7 @@
   static method _default(dynamic a, dynamic b) → core::int
     ;
 }
-static method foo<E extends core::Object>(self::C<self::foo::E> c, (self::foo::E, self::foo::E) → core::int cmp) → void
+static method foo<E extends core::Object = dynamic>(self::C<self::foo::E> c, (self::foo::E, self::foo::E) → core::int cmp) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.strong.expect b/pkg/front_end/testcases/inference/bug30624.dart.strong.expect
index 1f952f5..9a5f732 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<E extends core::Object> extends core::Object {
+class C<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -29,5 +29,5 @@
     return 1.{core::int::unary-}();
   }
 }
-static method foo<E extends core::Object>(self::C<self::foo::E> c, (self::foo::E, self::foo::E) → core::int cmp) → void {}
+static method foo<E extends core::Object = dynamic>(self::C<self::foo::E> c, (self::foo::E, self::foo::E) → core::int cmp) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect
index 1f952f5..9a5f732 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<E extends core::Object> extends core::Object {
+class C<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -29,5 +29,5 @@
     return 1.{core::int::unary-}();
   }
 }
-static method foo<E extends core::Object>(self::C<self::foo::E> c, (self::foo::E, self::foo::E) → core::int cmp) → void {}
+static method foo<E extends core::Object = dynamic>(self::C<self::foo::E> c, (self::foo::E, self::foo::E) → core::int cmp) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.expect b/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.expect
index b1b2544..93409b0 100644
--- a/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class ActionDispatcher<P extends core::Object> extends core::Object {
+class ActionDispatcher<P extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.transformed.expect
index b1b2544..93409b0 100644
--- a/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class ActionDispatcher<P extends core::Object> extends core::Object {
+class ActionDispatcher<P extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart.outline.expect b/pkg/front_end/testcases/inference/callable_generic_class.dart.outline.expect
index edb733d..309e3d2 100644
--- a/pkg/front_end/testcases/inference/callable_generic_class.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/callable_generic_class.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class ActionDispatcher<P extends core::Object> extends core::Object {
+class ActionDispatcher<P extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method call([self::ActionDispatcher::P value]) → void
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart.strong.expect b/pkg/front_end/testcases/inference/callable_generic_class.dart.strong.expect
index 3e59656..bce5d96 100644
--- a/pkg/front_end/testcases/inference/callable_generic_class.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/callable_generic_class.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class ActionDispatcher<P extends core::Object> extends core::Object {
+class ActionDispatcher<P extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/callable_generic_class.dart.strong.transformed.expect
index 3e59656..bce5d96 100644
--- a/pkg/front_end/testcases/inference/callable_generic_class.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/callable_generic_class.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class ActionDispatcher<P extends core::Object> extends core::Object {
+class ActionDispatcher<P extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.expect b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.expect
index 8145e11..d942073 100644
--- a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::List<self::C::T> x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.transformed.expect
index 8145e11..d942073 100644
--- a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::List<self::C::T> x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.outline.expect b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.outline.expect
index 0c2d0dc..dafb078 100644
--- a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::List<self::C::T> x) → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.strong.expect b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.strong.expect
index a952ea0..f11d58d 100644
--- a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::List<self::C::T> x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.strong.transformed.expect
index a952ea0..f11d58d 100644
--- a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::List<self::C::T> x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.expect
index 1def021..9a717b9 100644
--- a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.expect
@@ -12,7 +12,7 @@
     : super self::A::•()
     ;
 }
-class Foo<T extends self::A> extends core::Object {
+class Foo<T extends self::A = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.transformed.expect
index 1def021..9a717b9 100644
--- a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.transformed.expect
@@ -12,7 +12,7 @@
     : super self::A::•()
     ;
 }
-class Foo<T extends self::A> extends core::Object {
+class Foo<T extends self::A = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.strong.expect
index 4da3023..53339a4 100644
--- a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.strong.expect
@@ -12,7 +12,7 @@
     : super self::A::•()
     ;
 }
-class Foo<T extends self::A> extends core::Object {
+class Foo<T extends self::A = self::A> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.strong.transformed.expect
index 4da3023..53339a4 100644
--- a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.strong.transformed.expect
@@ -12,7 +12,7 @@
     : super self::A::•()
     ;
 }
-class Foo<T extends self::A> extends core::Object {
+class Foo<T extends self::A = self::A> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.expect
index 8a1923c..e4269a9 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t;
   constructor •(self::C::T t) → void
     : self::C::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.transformed.expect
index 8a1923c..e4269a9 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t;
   constructor •(self::C::T t) → void
     : self::C::t = t, super core::Object::•()
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 b902c2a..80cb335 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
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T t;
   constructor •(self::C::T t) → void
     : self::C::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
index d6841ff..d1bb8ee 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T t;
   constructor •(self::C::T t) → void
     : self::C::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.expect
index 619f0a3..872f905 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = () → T;
+typedef F<T extends core::Object = dynamic> = () → T;
 class A extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<T extends self::A> extends core::Object {
+class C<T extends self::A = dynamic> extends core::Object {
   constructor •(() → self::C::T f) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.transformed.expect
index 619f0a3..872f905 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = () → T;
+typedef F<T extends core::Object = dynamic> = () → T;
 class A extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<T extends self::A> extends core::Object {
+class C<T extends self::A = dynamic> extends core::Object {
   constructor •(() → self::C::T f) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.strong.expect
index 4d9c033..68d5644 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.strong.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = () → T;
+typedef F<T extends core::Object = dynamic> = () → T;
 class A extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<T extends self::A> extends core::Object {
+class C<T extends self::A = self::A> extends core::Object {
   constructor •(() → self::C::T f) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.expect
index c3c0ebc..dc33b93 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   final field self::C::T t;
   const constructor •(self::C::T t) → void
     : self::C::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.transformed.expect
index c3c0ebc..dc33b93 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   final field self::C::T t;
   const constructor •(self::C::T t) → void
     : self::C::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.strong.expect
index 366ee21..88d450f 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   final field self::C::T t;
   const constructor •(self::C::T t) → void
     : self::C::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.strong.transformed.expect
index 366ee21..88d450f 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   final field self::C::T t;
   const constructor •(self::C::T t) → void
     : self::C::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.expect
index f4cec98..b141829 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = dynamic> extends core::Object {
   final field self::C::T x;
   const constructor •(self::C::T x) → void
     : self::C::x = x, super core::Object::•()
     ;
 }
-class D<T extends core::num> extends core::Object {
+class D<T extends core::num = dynamic> extends core::Object {
   const constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.transformed.expect
index f4cec98..b141829 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = dynamic> extends core::Object {
   final field self::C::T x;
   const constructor •(self::C::T x) → void
     : self::C::x = x, super core::Object::•()
     ;
 }
-class D<T extends core::num> extends core::Object {
+class D<T extends core::num = dynamic> extends core::Object {
   const constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.strong.expect
index 97e2ca4..f90d5a7 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.strong.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = core::num> extends core::Object {
   final field self::C::T x;
   const constructor •(self::C::T x) → void
     : self::C::x = x, super core::Object::•()
     ;
 }
-class D<T extends core::num> extends core::Object {
+class D<T extends core::num = core::num> extends core::Object {
   const constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.strong.transformed.expect
index 97e2ca4..f90d5a7 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = core::num> extends core::Object {
   final field self::C::T x;
   const constructor •(self::C::T x) → void
     : self::C::x = x, super core::Object::•()
     ;
 }
-class D<T extends core::num> extends core::Object {
+class D<T extends core::num = core::num> extends core::Object {
   const constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.expect
index 1e8e0c0..740c1dd 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::List<self::C::T> list) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.transformed.expect
index 1e8e0c0..740c1dd 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::List<self::C::T> list) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.strong.expect
index 2950d68..4eeaeb3 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::List<self::C::T> list) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.strong.transformed.expect
index 2950d68..4eeaeb3 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::List<self::C::T> list) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.expect
index c9e1108..2f2411b 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t = null;
   constructor _() → void
     : super core::Object::•()
     ;
-  static factory •<T extends core::Object>(self::C::•::T t) → self::C<self::C::•::T> {
+  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T> {
     dynamic x = new self::C::_<self::C::•::T>();
     x.t = t;
     return x;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.transformed.expect
index c9e1108..2f2411b 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t = null;
   constructor _() → void
     : super core::Object::•()
     ;
-  static factory •<T extends core::Object>(self::C::•::T t) → self::C<self::C::•::T> {
+  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T> {
     dynamic x = new self::C::_<self::C::•::T>();
     x.t = t;
     return x;
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 835b191..72af9d8 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
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T t = null;
   constructor _() → void
     : super core::Object::•()
     ;
-  static factory •<T extends core::Object>(self::C::•::T t) → self::C<self::C::•::T> {
+  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T> {
     self::C<self::C::•::T> x = new self::C::_<self::C::•::T>();
     x.{self::C::t} = t;
     return x;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect
index 65a3466..cd824ab 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T t = null;
   constructor _() → void
     : super core::Object::•()
     ;
-  static factory •<T extends core::Object>(self::C::•::T t) → self::C<self::C::•::T> {
+  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T> {
     self::C<self::C::•::T> x = new self::C::_<self::C::•::T>();
     x.{self::C::t} = t;
     return x;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.expect
index 538fd28..5fbdc88 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   field self::A<self::A::T> f = new self::A::•<dynamic>();
   constructor •() → void
     : super core::Object::•()
     ;
-  static factory factory<T extends core::Object>() → self::A<self::A::factory::T>
+  static factory factory<T extends core::Object = dynamic>() → self::A<self::A::factory::T>
     return new self::A::•<dynamic>();
   method m() → self::A<self::A::T>
     return new self::A::•<dynamic>();
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.transformed.expect
index 538fd28..5fbdc88 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   field self::A<self::A::T> f = new self::A::•<dynamic>();
   constructor •() → void
     : super core::Object::•()
     ;
-  static factory factory<T extends core::Object>() → self::A<self::A::factory::T>
+  static factory factory<T extends core::Object = dynamic>() → self::A<self::A::factory::T>
     return new self::A::•<dynamic>();
   method m() → self::A<self::A::T>
     return new self::A::•<dynamic>();
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.strong.expect
index ba0820f..4989080 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::A<self::A::T> f = new self::A::•<self::A::T>();
   constructor •() → void
     : super core::Object::•()
     ;
-  static factory factory<T extends core::Object>() → self::A<self::A::factory::T>
+  static factory factory<T extends core::Object = dynamic>() → self::A<self::A::factory::T>
     return new self::A::•<self::A::factory::T>();
   method m() → self::A<self::A::T>
     return new self::A::•<self::A::T>();
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.strong.transformed.expect
index ba0820f..4989080 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::A<self::A::T> f = new self::A::•<self::A::T>();
   constructor •() → void
     : super core::Object::•()
     ;
-  static factory factory<T extends core::Object>() → self::A<self::A::factory::T>
+  static factory factory<T extends core::Object = dynamic>() → self::A<self::A::factory::T>
     return new self::A::•<self::A::factory::T>();
   method m() → self::A<self::A::T>
     return new self::A::•<self::A::T>();
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.expect
index f244bce..16daec8 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t = null;
   constructor named(core::List<self::C::T> t) → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.transformed.expect
index f244bce..16daec8 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t = null;
   constructor named(core::List<self::C::T> t) → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.strong.expect
index 0e487ea..b0115e5 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T t = null;
   constructor named(core::List<self::C::T> t) → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.strong.transformed.expect
index 0e487ea..b0115e5 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T t = null;
   constructor named(core::List<self::C::T> t) → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.expect
index b56ab2c..7fbdfc2 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t = null;
   constructor •() → void
     : super core::Object::•()
     ;
-  static factory named<T extends core::Object>(self::C::named::T t) → self::C<self::C::named::T> {
+  static factory named<T extends core::Object = dynamic>(self::C::named::T t) → self::C<self::C::named::T> {
     dynamic x = new self::C::•<self::C::named::T>();
     x.t = t;
     return x;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.transformed.expect
index b56ab2c..7fbdfc2 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t = null;
   constructor •() → void
     : super core::Object::•()
     ;
-  static factory named<T extends core::Object>(self::C::named::T t) → self::C<self::C::named::T> {
+  static factory named<T extends core::Object = dynamic>(self::C::named::T t) → self::C<self::C::named::T> {
     dynamic x = new self::C::•<self::C::named::T>();
     x.t = t;
     return x;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.strong.expect
index 1b757b3..9fd81aa 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T t = null;
   constructor •() → void
     : super core::Object::•()
     ;
-  static factory named<T extends core::Object>(self::C::named::T t) → self::C<self::C::named::T> {
+  static factory named<T extends core::Object = dynamic>(self::C::named::T t) → self::C<self::C::named::T> {
     self::C<self::C::named::T> x = new self::C::•<self::C::named::T>();
     x.{self::C::t} = t;
     return x;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.strong.transformed.expect
index 1b757b3..9fd81aa 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T t = null;
   constructor •() → void
     : super core::Object::•()
     ;
-  static factory named<T extends core::Object>(self::C::named::T t) → self::C<self::C::named::T> {
+  static factory named<T extends core::Object = dynamic>(self::C::named::T t) → self::C<self::C::named::T> {
     self::C<self::C::named::T> x = new self::C::•<self::C::named::T>();
     x.{self::C::t} = t;
     return x;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.expect
index 41cb4fa..a985558 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t;
   constructor •(self::C::T t) → void
     : self::C::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.transformed.expect
index 41cb4fa..a985558 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t;
   constructor •(self::C::T t) → void
     : self::C::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.strong.expect
index d250ca0..b2a5c1a 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T t;
   constructor •(self::C::T t) → void
     : self::C::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.strong.transformed.expect
index d250ca0..b2a5c1a 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T t;
   constructor •(self::C::T t) → void
     : self::C::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.expect
index d2fa30a..4683180 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object> extends core::Object {
+abstract class C<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
   abstract get t() → self::C::T;
   abstract set t(self::C::T x) → void;
-  static factory •<T extends core::Object>(self::C::•::T t) → self::C<self::C::•::T>
+  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
     let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object> extends core::Object implements self::C<self::CImpl::T> {
+class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
   field self::CImpl::T t;
   constructor •(self::CImpl::T t) → void
     : self::CImpl::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.transformed.expect
index d2fa30a..4683180 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.transformed.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object> extends core::Object {
+abstract class C<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
   abstract get t() → self::C::T;
   abstract set t(self::C::T x) → void;
-  static factory •<T extends core::Object>(self::C::•::T t) → self::C<self::C::•::T>
+  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
     let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object> extends core::Object implements self::C<self::CImpl::T> {
+class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
   field self::CImpl::T t;
   constructor •(self::CImpl::T t) → void
     : self::CImpl::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.expect
index 309c800..54b4372 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object> extends core::Object {
+abstract class C<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
   abstract get t() → self::C::T;
   abstract set t(generic-covariant-impl generic-covariant-interface self::C::T x) → void;
-  static factory •<T extends core::Object>(self::C::•::T t) → self::C<self::C::•::T>
+  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
     let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object> extends core::Object implements self::C<self::CImpl::T> {
+class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
   generic-covariant-impl generic-covariant-interface field self::CImpl::T t;
   constructor •(self::CImpl::T t) → void
     : self::CImpl::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.transformed.expect
index b46bcd1..2289573 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.transformed.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object> extends core::Object {
+abstract class C<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
   abstract get t() → self::C::T;
   abstract set t(generic-covariant-impl generic-covariant-interface self::C::T x) → void;
-  static factory •<T extends core::Object>(self::C::•::T t) → self::C<self::C::•::T>
+  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
     let<BottomType> #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object> extends core::Object implements self::C<self::CImpl::T> {
+class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
   generic-covariant-impl generic-covariant-interface field self::CImpl::T t;
   constructor •(self::CImpl::T t) → void
     : self::CImpl::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.expect
index 1975274..47f9df0 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object> extends core::Object {
+abstract class C<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
   abstract get t() → self::C::T;
   abstract set t(self::C::T x) → void;
-  static factory •<T extends core::Object>(self::C::•::T t) → self::C<self::C::•::T>
+  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
     let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object> extends core::Object implements self::C<self::CImpl::T> {
+class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
   field self::CImpl::T t;
   constructor _(self::CImpl::T t) → void
     : self::CImpl::t = t, super core::Object::•()
     ;
-  static factory •<T extends core::Object>(self::CImpl::•::T t) → self::CImpl<self::CImpl::•::T>
+  static factory •<T extends core::Object = dynamic>(self::CImpl::•::T t) → self::CImpl<self::CImpl::•::T>
     return new self::CImpl::_<dynamic>(t);
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.transformed.expect
index 1975274..47f9df0 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.transformed.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object> extends core::Object {
+abstract class C<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
   abstract get t() → self::C::T;
   abstract set t(self::C::T x) → void;
-  static factory •<T extends core::Object>(self::C::•::T t) → self::C<self::C::•::T>
+  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
     let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object> extends core::Object implements self::C<self::CImpl::T> {
+class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
   field self::CImpl::T t;
   constructor _(self::CImpl::T t) → void
     : self::CImpl::t = t, super core::Object::•()
     ;
-  static factory •<T extends core::Object>(self::CImpl::•::T t) → self::CImpl<self::CImpl::•::T>
+  static factory •<T extends core::Object = dynamic>(self::CImpl::•::T t) → self::CImpl<self::CImpl::•::T>
     return new self::CImpl::_<dynamic>(t);
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.outline.expect
index 37113f5..018e8a0 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.outline.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object> extends core::Object {
+abstract class C<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
   abstract get t() → self::C::T;
   abstract set t(self::C::T x) → void;
-  static factory •<T extends core::Object>(self::C::•::T t) → self::C<self::C::•::T>
+  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
     let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object> extends core::Object implements self::C<self::CImpl::T> {
+class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
   field self::CImpl::T t;
   constructor _(self::CImpl::T t) → void
     ;
-  static factory •<T extends core::Object>(self::CImpl::•::T t) → self::CImpl<self::CImpl::•::T>
+  static factory •<T extends core::Object = dynamic>(self::CImpl::•::T t) → self::CImpl<self::CImpl::•::T>
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.strong.expect
index 5e10461..111277c 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.strong.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object> extends core::Object {
+abstract class C<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
   abstract get t() → self::C::T;
   abstract set t(generic-covariant-impl generic-covariant-interface self::C::T x) → void;
-  static factory •<T extends core::Object>(self::C::•::T t) → self::C<self::C::•::T>
+  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
     let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object> extends core::Object implements self::C<self::CImpl::T> {
+class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
   generic-covariant-impl generic-covariant-interface field self::CImpl::T t;
   constructor _(self::CImpl::T t) → void
     : self::CImpl::t = t, super core::Object::•()
     ;
-  static factory •<T extends core::Object>(self::CImpl::•::T t) → self::CImpl<self::CImpl::•::T>
+  static factory •<T extends core::Object = dynamic>(self::CImpl::•::T t) → self::CImpl<self::CImpl::•::T>
     return new self::CImpl::_<self::CImpl::•::T>(t);
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.strong.transformed.expect
index e599360..14d4ed3 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.strong.transformed.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object> extends core::Object {
+abstract class C<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
   abstract get t() → self::C::T;
   abstract set t(generic-covariant-impl generic-covariant-interface self::C::T x) → void;
-  static factory •<T extends core::Object>(self::C::•::T t) → self::C<self::C::•::T>
-    let <T extends core::Object>(self::CImpl::•::T) → self::CImpl<self::CImpl::•::T> #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
+  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
+    let <T extends core::Object = dynamic>(self::CImpl::•::T) → self::CImpl<self::CImpl::•::T> #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object> extends core::Object implements self::C<self::CImpl::T> {
+class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
   generic-covariant-impl generic-covariant-interface field self::CImpl::T t;
   constructor _(self::CImpl::T t) → void
     : self::CImpl::t = t, super core::Object::•()
     ;
-  static factory •<T extends core::Object>(self::CImpl::•::T t) → self::CImpl<self::CImpl::•::T>
+  static factory •<T extends core::Object = dynamic>(self::CImpl::•::T t) → self::CImpl<self::CImpl::•::T>
     return new self::CImpl::_<self::CImpl::•::T>(t);
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.expect
index 25d5c94..24bc890 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class Clonable<T extends core::Object> extends core::Object {
+class Clonable<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class Pair<T extends self::Clonable<self::Pair::T>, U extends self::Clonable<self::Pair::U>> extends core::Object {
+class Pair<T extends self::Clonable<self::Pair::T> = dynamic, U extends self::Clonable<self::Pair::U> = dynamic> extends core::Object {
   field self::Pair::T t;
   field self::Pair::U u;
   constructor •(self::Pair::T t, self::Pair::U u) → void
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.transformed.expect
index 25d5c94..24bc890 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class Clonable<T extends core::Object> extends core::Object {
+class Clonable<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class Pair<T extends self::Clonable<self::Pair::T>, U extends self::Clonable<self::Pair::U>> extends core::Object {
+class Pair<T extends self::Clonable<self::Pair::T> = dynamic, U extends self::Clonable<self::Pair::U> = dynamic> extends core::Object {
   field self::Pair::T t;
   field self::Pair::U u;
   constructor •(self::Pair::T t, self::Pair::U u) → void
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect
index 6b36422..d22785f 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class Clonable<T extends core::Object> extends core::Object {
+class Clonable<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class Pair<T extends self::Clonable<self::Pair::T>, U extends self::Clonable<self::Pair::U>> extends core::Object {
+class Pair<T extends self::Clonable<self::Pair::T> = self::Clonable<dynamic>, U extends self::Clonable<self::Pair::U> = self::Clonable<dynamic>> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::Pair::T t;
   generic-covariant-impl generic-covariant-interface field self::Pair::U u;
   constructor •(self::Pair::T t, self::Pair::U u) → void
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect
index 6b36422..d22785f 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class Clonable<T extends core::Object> extends core::Object {
+class Clonable<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class Pair<T extends self::Clonable<self::Pair::T>, U extends self::Clonable<self::Pair::U>> extends core::Object {
+class Pair<T extends self::Clonable<self::Pair::T> = self::Clonable<dynamic>, U extends self::Clonable<self::Pair::U> = self::Clonable<dynamic>> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::Pair::T t;
   generic-covariant-impl generic-covariant-interface field self::Pair::U u;
   constructor •(self::Pair::T t, self::Pair::U u) → void
diff --git a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.expect
index dcf34f0..af3546f 100644
--- a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Pair<T extends core::Object, U extends core::Object> extends core::Object {
+class Pair<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   field self::Pair::T t;
   field self::Pair::U u;
   constructor •(self::Pair::T t, self::Pair::U u) → void
diff --git a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.transformed.expect
index dcf34f0..af3546f 100644
--- a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Pair<T extends core::Object, U extends core::Object> extends core::Object {
+class Pair<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   field self::Pair::T t;
   field self::Pair::U u;
   constructor •(self::Pair::T t, self::Pair::U u) → void
diff --git a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.strong.expect
index 7db8910..777d093 100644
--- a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Pair<T extends core::Object, U extends core::Object> extends core::Object {
+class Pair<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::Pair::T t;
   generic-covariant-impl generic-covariant-interface field self::Pair::U u;
   constructor •(self::Pair::T t, self::Pair::U u) → void
diff --git a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.strong.transformed.expect
index 7db8910..777d093 100644
--- a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Pair<T extends core::Object, U extends core::Object> extends core::Object {
+class Pair<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::Pair::T t;
   generic-covariant-impl generic-covariant-interface field self::Pair::U u;
   constructor •(self::Pair::T t, self::Pair::U u) → void
diff --git a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.direct.expect b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.direct.expect
index 3fbf5b6..f8dcee7 100644
--- a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object, T extends core::Object> = (S) → T;
-class A<T extends core::Object> extends core::Object {
+typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → T;
+class A<T extends core::Object = dynamic> extends core::Object {
   field (self::A::T) → self::A::T x;
   constructor •((self::A::T) → self::A::T x) → void
     : self::A::x = x, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.direct.transformed.expect
index 3fbf5b6..f8dcee7 100644
--- a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object, T extends core::Object> = (S) → T;
-class A<T extends core::Object> extends core::Object {
+typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → T;
+class A<T extends core::Object = dynamic> extends core::Object {
   field (self::A::T) → self::A::T x;
   constructor •((self::A::T) → self::A::T x) → void
     : self::A::x = x, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.expect b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.expect
index 4a97594..7fa4e4d 100644
--- a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object, T extends core::Object> = (S) → T;
-class A<T extends core::Object> extends core::Object {
+typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → T;
+class A<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field (self::A::T) → self::A::T x;
   constructor •((self::A::T) → self::A::T x) → void
     : self::A::x = x, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.transformed.expect
index 4a97594..7fa4e4d 100644
--- a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object, T extends core::Object> = (S) → T;
-class A<T extends core::Object> extends core::Object {
+typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → T;
+class A<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field (self::A::T) → self::A::T x;
   constructor •((self::A::T) → self::A::T x) → void
     : self::A::x = x, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.expect
index c798f57..4ad6c42 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = () → void;
+typedef F<T extends core::Object = dynamic> = () → void;
 class Foo extends core::Object {
   const constructor •(core::List<core::String> l) → void
     : super core::Object::•()
     ;
 }
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -17,7 +17,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>() → void {}
+  method m<T extends core::Object = dynamic>() → void {}
 }
-static method f<T extends core::Object>() → void {}
+static method f<T extends core::Object = dynamic>() → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.transformed.expect
index c798f57..4ad6c42 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = () → void;
+typedef F<T extends core::Object = dynamic> = () → void;
 class Foo extends core::Object {
   const constructor •(core::List<core::String> l) → void
     : super core::Object::•()
     ;
 }
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -17,7 +17,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>() → void {}
+  method m<T extends core::Object = dynamic>() → void {}
 }
-static method f<T extends core::Object>() → void {}
+static method f<T extends core::Object = dynamic>() → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.outline.expect
index 2c07f4f..bc221a6 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.outline.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = () → void;
+typedef F<T extends core::Object = dynamic> = () → void;
 class Foo extends core::Object {
   const constructor •(core::List<core::String> l) → void
     ;
 }
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
 class D extends core::Object {
   synthetic constructor •() → void
     ;
-  method m<T extends core::Object>() → void
+  method m<T extends core::Object = dynamic>() → void
     ;
 }
-static method f<T extends core::Object>() → void
+static method f<T extends core::Object = dynamic>() → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.expect
index 4d24a73..7f49df8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.expect
@@ -8,7 +8,7 @@
     ;
 }
 static method test() → void {
-  function f<T extends core::Object>() → void {}
-  dynamic x = <T extends core::Object>() → dynamic {};
+  function f<T extends core::Object = dynamic>() → void {}
+  dynamic x = <T extends core::Object = dynamic>() → dynamic {};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.transformed.expect
index 4d24a73..7f49df8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.transformed.expect
@@ -8,7 +8,7 @@
     ;
 }
 static method test() → void {
-  function f<T extends core::Object>() → void {}
-  dynamic x = <T extends core::Object>() → dynamic {};
+  function f<T extends core::Object = dynamic>() → void {}
+  dynamic x = <T extends core::Object = dynamic>() → dynamic {};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.expect
index faa662c..7a1ba88 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-abstract class MyStream<T extends core::Object> extends asy::Stream<self::MyStream::T> {
-  static factory •<T extends core::Object>() → self::MyStream<self::MyStream::•::T>
+abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
+  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
     return null;
 }
-static method F<T extends core::Object>() → self::F::T
+static method F<T extends core::Object = dynamic>() → self::F::T
   return null;
 static method f() → asy::Future<dynamic> async {
   dynamic d;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
index ef5dc3a..3ef1a43 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-abstract class MyStream<T extends core::Object> extends asy::Stream<self::MyStream::T> {
-  static factory •<T extends core::Object>() → self::MyStream<self::MyStream::•::T>
+abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
+  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
     return null;
 }
-static method F<T extends core::Object>() → self::F::T
+static method F<T extends core::Object = dynamic>() → self::F::T
   return null;
 static method f() → asy::Future<dynamic> /* originally async */ {
   final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.expect
index 86b9f5d..ad5f6d8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-abstract class MyStream<T extends core::Object> extends asy::Stream<self::MyStream::T> {
-  static factory •<T extends core::Object>() → self::MyStream<self::MyStream::•::T>
+abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
+  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
     return null;
 }
-static method F<T extends core::Object>() → self::F::T
+static method F<T extends core::Object = dynamic>() → self::F::T
   return null;
 static method f() → asy::Future<dynamic> async {
   dynamic d;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
index 2138cb0..7dee1bb 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-abstract class MyStream<T extends core::Object> extends asy::Stream<self::MyStream::T> {
-  static factory •<T extends core::Object>() → self::MyStream<self::MyStream::•::T>
+abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
+  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
     return null;
 }
-static method F<T extends core::Object>() → self::F::T
+static method F<T extends core::Object = dynamic>() → self::F::T
   return null;
 static method f() → asy::Future<dynamic> /* originally async */ {
   final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
diff --git a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.expect
index cb0d81e..93b9a23 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object, T extends core::Object> = ([S]) → T;
+typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = ([S]) → T;
 class Foo extends core::Object {
   field core::List<core::int> x;
   constructor •([core::List<core::int> x = const <dynamic>[1]]) → void
diff --git a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.transformed.expect
index cb0d81e..93b9a23 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object, T extends core::Object> = ([S]) → T;
+typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = ([S]) → T;
 class Foo extends core::Object {
   field core::List<core::int> x;
   constructor •([core::List<core::int> x = const <dynamic>[1]]) → void
diff --git a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.strong.expect
index 29996bd..40bcf29 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object, T extends core::Object> = ([S]) → T;
+typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = ([S]) → T;
 class Foo extends core::Object {
   field core::List<core::int> x;
   constructor •([core::List<core::int> x = const <core::int>[1]]) → void
diff --git a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.strong.transformed.expect
index 29996bd..40bcf29 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object, T extends core::Object> = ([S]) → T;
+typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = ([S]) → T;
 class Foo extends core::Object {
   field core::List<core::int> x;
   constructor •([core::List<core::int> x = const <core::int>[1]]) → void
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.expect
index ca9246e..bd69c63 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.transformed.expect
index ca9246e..bd69c63 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.transformed.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.expect
index b742af9..6c7e70c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.transformed.expect
index e377e03..8227e66 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.expect
index da516ac..771832d 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::A::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.transformed.expect
index da516ac..771832d 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::A::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.outline.expect
index 12d8079..f9d3fb9 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::A::T x) → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.strong.expect
index d0e29da..c52cb1b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::A::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.strong.transformed.expect
index d0e29da..c52cb1b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::A::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.direct.expect
index 12eb980..c3123ef 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object, T extends core::Object> = (S) → T;
+typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → T;
 static method test() → void {
   {
     (core::int) → core::String l0 = (core::int x) → dynamic => null;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.direct.transformed.expect
index 12eb980..c3123ef 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object, T extends core::Object> = (S) → T;
+typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → T;
 static method test() → void {
   {
     (core::int) → core::String l0 = (core::int x) → dynamic => null;
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 419a2d6..2f7fa93 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
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object, T extends core::Object> = (S) → T;
+typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → T;
 static method test() → void {
   {
     (core::int) → core::String l0 = (core::int x) → core::Null => null;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
index 7e72e90..d4df104 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object, T extends core::Object> = (S) → T;
+typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → T;
 static method test() → void {
   {
     (core::int) → core::String l0 = (core::int x) → core::Null => null;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.direct.expect
index 5ffe78d..169595b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.direct.expect
@@ -4,16 +4,16 @@
 
 static method main() → void {
   {
-    function f<T extends core::Object>(T x) → T
+    function f<T extends core::Object = dynamic>(T x) → T
       return null;
     dynamic v1 = f;
-    v1 = <S extends core::Object>(dynamic x) → dynamic => x;
+    v1 = <S extends core::Object = dynamic>(dynamic x) → dynamic => x;
   }
   {
-    function f<T extends core::Object>(T x) → core::List<T>
+    function f<T extends core::Object = dynamic>(T x) → core::List<T>
       return null;
     dynamic v2 = f;
-    v2 = <S extends core::Object>(dynamic x) → dynamic => <dynamic>[x];
+    v2 = <S extends core::Object = dynamic>(dynamic x) → dynamic => <dynamic>[x];
     core::Iterable<core::int> r = v2.call(42);
     core::Iterable<core::String> s = v2.call("hello");
     core::Iterable<core::List<core::int>> t = v2.call(<core::int>[]);
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.direct.transformed.expect
index 5ffe78d..169595b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.direct.transformed.expect
@@ -4,16 +4,16 @@
 
 static method main() → void {
   {
-    function f<T extends core::Object>(T x) → T
+    function f<T extends core::Object = dynamic>(T x) → T
       return null;
     dynamic v1 = f;
-    v1 = <S extends core::Object>(dynamic x) → dynamic => x;
+    v1 = <S extends core::Object = dynamic>(dynamic x) → dynamic => x;
   }
   {
-    function f<T extends core::Object>(T x) → core::List<T>
+    function f<T extends core::Object = dynamic>(T x) → core::List<T>
       return null;
     dynamic v2 = f;
-    v2 = <S extends core::Object>(dynamic x) → dynamic => <dynamic>[x];
+    v2 = <S extends core::Object = dynamic>(dynamic x) → dynamic => <dynamic>[x];
     core::Iterable<core::int> r = v2.call(42);
     core::Iterable<core::String> s = v2.call("hello");
     core::Iterable<core::List<core::int>> t = v2.call(<core::int>[]);
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.expect
index 995d542..8e6cf96 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class F3<T extends core::Object> extends core::Object {
+class F3<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::Iterable<core::Iterable<self::F3::T>> a) → void
     : super core::Object::•() {}
 }
-class F4<T extends core::Object> extends core::Object {
+class F4<T extends core::Object = dynamic> extends core::Object {
   constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → void
     : super core::Object::•() {}
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.transformed.expect
index 995d542..8e6cf96 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class F3<T extends core::Object> extends core::Object {
+class F3<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::Iterable<core::Iterable<self::F3::T>> a) → void
     : super core::Object::•() {}
 }
-class F4<T extends core::Object> extends core::Object {
+class F4<T extends core::Object = dynamic> extends core::Object {
   constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → void
     : super core::Object::•() {}
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.strong.expect
index 8c1b574..3cb6605 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.strong.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class F3<T extends core::Object> extends core::Object {
+class F3<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::Iterable<core::Iterable<self::F3::T>> a) → void
     : super core::Object::•() {}
 }
-class F4<T extends core::Object> extends core::Object {
+class F4<T extends core::Object = dynamic> extends core::Object {
   constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → void
     : super core::Object::•() {}
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.strong.transformed.expect
index 8c1b574..3cb6605 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class F3<T extends core::Object> extends core::Object {
+class F3<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::Iterable<core::Iterable<self::F3::T>> a) → void
     : super core::Object::•() {}
 }
-class F4<T extends core::Object> extends core::Object {
+class F4<T extends core::Object = dynamic> extends core::Object {
   constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → void
     : super core::Object::•() {}
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.expect
index 336e915..6ee04ff 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-class F0<T extends core::Object> extends core::Object {
+class F0<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::List<self::F0::T> a) → void
     : super core::Object::•() {}
 }
-class F1<T extends core::Object> extends core::Object {
+class F1<T extends core::Object = dynamic> extends core::Object {
   constructor •({core::List<self::F1::T> a = null}) → void
     : super core::Object::•() {}
 }
-class F2<T extends core::Object> extends core::Object {
+class F2<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::Iterable<self::F2::T> a) → void
     : super core::Object::•() {}
 }
-class F3<T extends core::Object> extends core::Object {
+class F3<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::Iterable<core::Iterable<self::F3::T>> a) → void
     : super core::Object::•() {}
 }
-class F4<T extends core::Object> extends core::Object {
+class F4<T extends core::Object = dynamic> extends core::Object {
   constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → void
     : super core::Object::•() {}
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.transformed.expect
index 336e915..6ee04ff 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.transformed.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-class F0<T extends core::Object> extends core::Object {
+class F0<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::List<self::F0::T> a) → void
     : super core::Object::•() {}
 }
-class F1<T extends core::Object> extends core::Object {
+class F1<T extends core::Object = dynamic> extends core::Object {
   constructor •({core::List<self::F1::T> a = null}) → void
     : super core::Object::•() {}
 }
-class F2<T extends core::Object> extends core::Object {
+class F2<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::Iterable<self::F2::T> a) → void
     : super core::Object::•() {}
 }
-class F3<T extends core::Object> extends core::Object {
+class F3<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::Iterable<core::Iterable<self::F3::T>> a) → void
     : super core::Object::•() {}
 }
-class F4<T extends core::Object> extends core::Object {
+class F4<T extends core::Object = dynamic> extends core::Object {
   constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → void
     : super core::Object::•() {}
 }
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 2984bb7..9d2e2a2 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
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-class F0<T extends core::Object> extends core::Object {
+class F0<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::List<self::F0::T> a) → void
     : super core::Object::•() {}
 }
-class F1<T extends core::Object> extends core::Object {
+class F1<T extends core::Object = dynamic> extends core::Object {
   constructor •({core::List<self::F1::T> a = null}) → void
     : super core::Object::•() {}
 }
-class F2<T extends core::Object> extends core::Object {
+class F2<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::Iterable<self::F2::T> a) → void
     : super core::Object::•() {}
 }
-class F3<T extends core::Object> extends core::Object {
+class F3<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::Iterable<core::Iterable<self::F3::T>> a) → void
     : super core::Object::•() {}
 }
-class F4<T extends core::Object> extends core::Object {
+class F4<T extends core::Object = dynamic> extends core::Object {
   constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → void
     : super core::Object::•() {}
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect
index 5aa4f1e..2517cb9 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-class F0<T extends core::Object> extends core::Object {
+class F0<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::List<self::F0::T> a) → void
     : super core::Object::•() {}
 }
-class F1<T extends core::Object> extends core::Object {
+class F1<T extends core::Object = dynamic> extends core::Object {
   constructor •({core::List<self::F1::T> a = null}) → void
     : super core::Object::•() {}
 }
-class F2<T extends core::Object> extends core::Object {
+class F2<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::Iterable<self::F2::T> a) → void
     : super core::Object::•() {}
 }
-class F3<T extends core::Object> extends core::Object {
+class F3<T extends core::Object = dynamic> extends core::Object {
   constructor •(core::Iterable<core::Iterable<self::F3::T>> a) → void
     : super core::Object::•() {}
 }
-class F4<T extends core::Object> extends core::Object {
+class F4<T extends core::Object = dynamic> extends core::Object {
   constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → void
     : super core::Object::•() {}
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart
index f2c349c..7ca127b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart
@@ -8,7 +8,7 @@
 void test() {
   {
     String f<S>(int x) => null;
-    var /*@type=<S extends Object>(int) -> String*/ v = f;
+    var /*@type=<S extends Object = dynamic>(int) -> String*/ v = f;
     v = <T> /*@returnType=Null*/ (int x) => null;
     v = <T> /*@returnType=String*/ (int x) => "hello";
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (String x) =>
@@ -20,7 +20,7 @@
   }
   {
     String f<S>(int x) => null;
-    var /*@type=<S extends Object>(int) -> String*/ v = f;
+    var /*@type=<S extends Object = dynamic>(int) -> String*/ v = f;
     v = <T> /*@returnType=Null*/ (/*@type=int*/ x) => null;
     v = <T> /*@returnType=String*/ (/*@type=int*/ x) => "hello";
     v = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ <
@@ -35,7 +35,7 @@
   }
   {
     List<String> f<S>(int x) => null;
-    var /*@type=<S extends Object>(int) -> List<String>*/ v = f;
+    var /*@type=<S extends Object = dynamic>(int) -> List<String>*/ v = f;
     v = <T> /*@returnType=Null*/ (int x) => null;
     v = <T> /*@returnType=List<String>*/ (int x) => /*@typeArgs=String*/ [
           "hello"
@@ -55,16 +55,17 @@
     int int2int<S>(int x) => null;
     String int2String<T>(int x) => null;
     String string2String<T>(String x) => null;
-    var /*@type=<S extends Object>(int) -> int*/ x = int2int;
+    var /*@type=<S extends Object = dynamic>(int) -> int*/ x = int2int;
     x = <T> /*@returnType=int*/ (/*@type=int*/ x) => x;
     x = <T> /*@returnType=int*/ (/*@type=int*/ x) => x /*@target=num::+*/ + 1;
-    var /*@type=<T extends Object>(int) -> String*/ y = int2String;
+    var /*@type=<T extends Object = dynamic>(int) -> String*/ y = int2String;
     y = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ <
             T> /*@returnType=String*/ (/*@type=int*/ x) =>
         x;
     y = <T> /*@returnType=String*/ (/*@type=int*/ x) => /*info:DYNAMIC_INVOKE, info:DYNAMIC_CAST*/ x
         .substring(3);
-    var /*@type=<T extends Object>(String) -> String*/ z = string2String;
+    var /*@type=<T extends Object = dynamic>(String) -> String*/ z =
+        string2String;
     z = <T> /*@returnType=String*/ (/*@type=String*/ x) =>
         x. /*@target=String::substring*/ substring(3);
   }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.direct.expect
index ae8eea6..f1cf2f0 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.direct.expect
@@ -4,58 +4,58 @@
 
 static method test() → void {
   {
-    function f<S extends core::Object>(core::int x) → core::String
+    function f<S extends core::Object = dynamic>(core::int x) → core::String
       return null;
     dynamic v = f;
-    v = <T extends core::Object>(core::int x) → dynamic => null;
-    v = <T extends core::Object>(core::int x) → dynamic => "hello";
-    v = <T extends core::Object>(core::String x) → dynamic => "hello";
-    v = <T extends core::Object>(core::int x) → dynamic => 3;
-    v = <T extends core::Object>(core::int x) → dynamic {
+    v = <T extends core::Object = dynamic>(core::int x) → dynamic => null;
+    v = <T extends core::Object = dynamic>(core::int x) → dynamic => "hello";
+    v = <T extends core::Object = dynamic>(core::String x) → dynamic => "hello";
+    v = <T extends core::Object = dynamic>(core::int x) → dynamic => 3;
+    v = <T extends core::Object = dynamic>(core::int x) → dynamic {
       return 3;
     };
   }
   {
-    function f<S extends core::Object>(core::int x) → core::String
+    function f<S extends core::Object = dynamic>(core::int x) → core::String
       return null;
     dynamic v = f;
-    v = <T extends core::Object>(dynamic x) → dynamic => null;
-    v = <T extends core::Object>(dynamic x) → dynamic => "hello";
-    v = <T extends core::Object>(dynamic x) → dynamic => 3;
-    v = <T extends core::Object>(dynamic x) → dynamic {
+    v = <T extends core::Object = dynamic>(dynamic x) → dynamic => null;
+    v = <T extends core::Object = dynamic>(dynamic x) → dynamic => "hello";
+    v = <T extends core::Object = dynamic>(dynamic x) → dynamic => 3;
+    v = <T extends core::Object = dynamic>(dynamic x) → dynamic {
       return 3;
     };
-    v = <T extends core::Object>(dynamic x) → dynamic {
+    v = <T extends core::Object = dynamic>(dynamic x) → dynamic {
       return x;
     };
   }
   {
-    function f<S extends core::Object>(core::int x) → core::List<core::String>
+    function f<S extends core::Object = dynamic>(core::int x) → core::List<core::String>
       return null;
     dynamic v = f;
-    v = <T extends core::Object>(core::int x) → dynamic => null;
-    v = <T extends core::Object>(core::int x) → dynamic => <dynamic>["hello"];
-    v = <T extends core::Object>(core::String x) → dynamic => <dynamic>["hello"];
-    v = <T extends core::Object>(core::int x) → dynamic => <dynamic>[3];
-    v = <T extends core::Object>(core::int x) → dynamic {
+    v = <T extends core::Object = dynamic>(core::int x) → dynamic => null;
+    v = <T extends core::Object = dynamic>(core::int x) → dynamic => <dynamic>["hello"];
+    v = <T extends core::Object = dynamic>(core::String x) → dynamic => <dynamic>["hello"];
+    v = <T extends core::Object = dynamic>(core::int x) → dynamic => <dynamic>[3];
+    v = <T extends core::Object = dynamic>(core::int x) → dynamic {
       return <dynamic>[3];
     };
   }
   {
-    function int2int<S extends core::Object>(core::int x) → core::int
+    function int2int<S extends core::Object = dynamic>(core::int x) → core::int
       return null;
-    function int2String<T extends core::Object>(core::int x) → core::String
+    function int2String<T extends core::Object = dynamic>(core::int x) → core::String
       return null;
-    function string2String<T extends core::Object>(core::String x) → core::String
+    function string2String<T extends core::Object = dynamic>(core::String x) → core::String
       return null;
     dynamic x = int2int;
-    x = <T extends core::Object>(dynamic x) → dynamic => x;
-    x = <T extends core::Object>(dynamic x) → dynamic => x.+(1);
+    x = <T extends core::Object = dynamic>(dynamic x) → dynamic => x;
+    x = <T extends core::Object = dynamic>(dynamic x) → dynamic => x.+(1);
     dynamic y = int2String;
-    y = <T extends core::Object>(dynamic x) → dynamic => x;
-    y = <T extends core::Object>(dynamic x) → dynamic => x.substring(3);
+    y = <T extends core::Object = dynamic>(dynamic x) → dynamic => x;
+    y = <T extends core::Object = dynamic>(dynamic x) → dynamic => x.substring(3);
     dynamic z = string2String;
-    z = <T extends core::Object>(dynamic x) → dynamic => x.substring(3);
+    z = <T extends core::Object = dynamic>(dynamic x) → dynamic => x.substring(3);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.direct.transformed.expect
index ae8eea6..f1cf2f0 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.direct.transformed.expect
@@ -4,58 +4,58 @@
 
 static method test() → void {
   {
-    function f<S extends core::Object>(core::int x) → core::String
+    function f<S extends core::Object = dynamic>(core::int x) → core::String
       return null;
     dynamic v = f;
-    v = <T extends core::Object>(core::int x) → dynamic => null;
-    v = <T extends core::Object>(core::int x) → dynamic => "hello";
-    v = <T extends core::Object>(core::String x) → dynamic => "hello";
-    v = <T extends core::Object>(core::int x) → dynamic => 3;
-    v = <T extends core::Object>(core::int x) → dynamic {
+    v = <T extends core::Object = dynamic>(core::int x) → dynamic => null;
+    v = <T extends core::Object = dynamic>(core::int x) → dynamic => "hello";
+    v = <T extends core::Object = dynamic>(core::String x) → dynamic => "hello";
+    v = <T extends core::Object = dynamic>(core::int x) → dynamic => 3;
+    v = <T extends core::Object = dynamic>(core::int x) → dynamic {
       return 3;
     };
   }
   {
-    function f<S extends core::Object>(core::int x) → core::String
+    function f<S extends core::Object = dynamic>(core::int x) → core::String
       return null;
     dynamic v = f;
-    v = <T extends core::Object>(dynamic x) → dynamic => null;
-    v = <T extends core::Object>(dynamic x) → dynamic => "hello";
-    v = <T extends core::Object>(dynamic x) → dynamic => 3;
-    v = <T extends core::Object>(dynamic x) → dynamic {
+    v = <T extends core::Object = dynamic>(dynamic x) → dynamic => null;
+    v = <T extends core::Object = dynamic>(dynamic x) → dynamic => "hello";
+    v = <T extends core::Object = dynamic>(dynamic x) → dynamic => 3;
+    v = <T extends core::Object = dynamic>(dynamic x) → dynamic {
       return 3;
     };
-    v = <T extends core::Object>(dynamic x) → dynamic {
+    v = <T extends core::Object = dynamic>(dynamic x) → dynamic {
       return x;
     };
   }
   {
-    function f<S extends core::Object>(core::int x) → core::List<core::String>
+    function f<S extends core::Object = dynamic>(core::int x) → core::List<core::String>
       return null;
     dynamic v = f;
-    v = <T extends core::Object>(core::int x) → dynamic => null;
-    v = <T extends core::Object>(core::int x) → dynamic => <dynamic>["hello"];
-    v = <T extends core::Object>(core::String x) → dynamic => <dynamic>["hello"];
-    v = <T extends core::Object>(core::int x) → dynamic => <dynamic>[3];
-    v = <T extends core::Object>(core::int x) → dynamic {
+    v = <T extends core::Object = dynamic>(core::int x) → dynamic => null;
+    v = <T extends core::Object = dynamic>(core::int x) → dynamic => <dynamic>["hello"];
+    v = <T extends core::Object = dynamic>(core::String x) → dynamic => <dynamic>["hello"];
+    v = <T extends core::Object = dynamic>(core::int x) → dynamic => <dynamic>[3];
+    v = <T extends core::Object = dynamic>(core::int x) → dynamic {
       return <dynamic>[3];
     };
   }
   {
-    function int2int<S extends core::Object>(core::int x) → core::int
+    function int2int<S extends core::Object = dynamic>(core::int x) → core::int
       return null;
-    function int2String<T extends core::Object>(core::int x) → core::String
+    function int2String<T extends core::Object = dynamic>(core::int x) → core::String
       return null;
-    function string2String<T extends core::Object>(core::String x) → core::String
+    function string2String<T extends core::Object = dynamic>(core::String x) → core::String
       return null;
     dynamic x = int2int;
-    x = <T extends core::Object>(dynamic x) → dynamic => x;
-    x = <T extends core::Object>(dynamic x) → dynamic => x.+(1);
+    x = <T extends core::Object = dynamic>(dynamic x) → dynamic => x;
+    x = <T extends core::Object = dynamic>(dynamic x) → dynamic => x.+(1);
     dynamic y = int2String;
-    y = <T extends core::Object>(dynamic x) → dynamic => x;
-    y = <T extends core::Object>(dynamic x) → dynamic => x.substring(3);
+    y = <T extends core::Object = dynamic>(dynamic x) → dynamic => x;
+    y = <T extends core::Object = dynamic>(dynamic x) → dynamic => x.substring(3);
     dynamic z = string2String;
-    z = <T extends core::Object>(dynamic x) → dynamic => x.substring(3);
+    z = <T extends core::Object = dynamic>(dynamic x) → dynamic => x.substring(3);
   }
 }
 static method main() → dynamic {}
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 4565308..03e0d17 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
@@ -4,20 +4,20 @@
 
 static method test() → void {
   {
-    function f<S extends core::Object>(core::int x) → core::String
+    function f<S extends core::Object = dynamic>(core::int x) → core::String
       return null;
-    <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 = 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'.
-Try 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'.
+    <S extends core::Object = dynamic>(core::int) → core::String v = f;
+    v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
+    v = <T extends core::Object = dynamic>(core::int x) → core::String => "hello";
+    v = let final dynamic #t1 = 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 = dynamic>(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::String'.
+Try changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::String'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (String x) =>
-                                                                ^" in let final dynamic #t2 = <T extends core::Object>(core::String x) → core::String => "hello" in null;
-    v = <T extends core::Object>(core::int x) → core::String => let final dynamic #t3 = 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'.
+                                                                ^" in let final dynamic #t2 = <T extends core::Object = dynamic>(core::String x) → core::String => "hello" in null;
+    v = <T extends core::Object = dynamic>(core::int x) → core::String => let final dynamic #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (int x) => 3;
                                                                            ^" in let final dynamic #t4 = 3 in null;
-    v = <T extends core::Object>(core::int x) → core::String {
+    v = <T extends core::Object = dynamic>(core::int x) → core::String {
       return let final dynamic #t5 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
@@ -25,22 +25,22 @@
     };
   }
   {
-    function f<S extends core::Object>(core::int x) → core::String
+    function f<S extends core::Object = dynamic>(core::int x) → core::String
       return null;
-    <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 #t7 = 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'.
+    <S extends core::Object = dynamic>(core::int) → core::String v = f;
+    v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
+    v = <T extends core::Object = dynamic>(core::int x) → core::String => "hello";
+    v = <T extends core::Object = dynamic>(core::int x) → core::String => let final dynamic #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         3;
         ^" in let final dynamic #t8 = 3 in null;
-    v = <T extends core::Object>(core::int x) → core::String {
+    v = <T extends core::Object = dynamic>(core::int x) → core::String {
       return let final dynamic #t9 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in let final dynamic #t10 = 3 in null;
     };
-    v = <T extends core::Object>(core::int x) → core::String {
+    v = <T extends core::Object = dynamic>(core::int x) → core::String {
       return let final dynamic #t11 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ x;
@@ -48,20 +48,20 @@
     };
   }
   {
-    function f<S extends core::Object>(core::int x) → core::List<core::String>
+    function f<S extends core::Object = dynamic>(core::int x) → core::List<core::String>
       return null;
-    <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 #t13 = 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>'.
-Try 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>'.
+    <S extends core::Object = dynamic>(core::int) → core::List<core::String> v = f;
+    v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
+    v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>["hello"];
+    v = let final dynamic #t13 = 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 = dynamic>(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
+Try changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=List<String>*/ (String
-                                                                      ^" in let final dynamic #t14 = <T extends core::Object>(core::String x) → core::List<core::String> => <core::String>["hello"] in null;
-    v = <T extends core::Object>(core::int x) → core::List<core::String> => <core::String>[let final dynamic #t15 = 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'.
+                                                                      ^" in let final dynamic #t14 = <T extends core::Object = dynamic>(core::String x) → core::List<core::String> => <core::String>["hello"] in null;
+    v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>[let final dynamic #t15 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                      ^" in let final dynamic #t16 = 3 in null];
-    v = <T extends core::Object>(core::int x) → core::List<core::String> {
+    v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> {
       return <core::String>[let final dynamic #t17 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
@@ -69,26 +69,26 @@
     };
   }
   {
-    function int2int<S extends core::Object>(core::int x) → core::int
+    function int2int<S extends core::Object = dynamic>(core::int x) → core::int
       return null;
-    function int2String<T extends core::Object>(core::int x) → core::String
+    function int2String<T extends core::Object = dynamic>(core::int x) → core::String
       return null;
-    function string2String<T extends core::Object>(core::String x) → core::String
+    function string2String<T extends core::Object = dynamic>(core::String x) → core::String
       return null;
-    <S extends core::Object>(core::int) → core::int x = int2int;
-    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 #t19 = 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'.
+    <S extends core::Object = dynamic>(core::int) → core::int x = int2int;
+    x = <T extends core::Object = dynamic>(core::int x) → core::int => x;
+    x = <T extends core::Object = dynamic>(core::int x) → core::int => x.{core::num::+}(1);
+    <T extends core::Object = dynamic>(core::int) → core::String y = int2String;
+    y = <T extends core::Object = dynamic>(core::int x) → core::String => let final dynamic #t19 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         x;
         ^" in let final dynamic #t20 = x in null;
-    y = <T extends core::Object>(core::int x) → core::String => (let final dynamic #t21 = 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'.
+    y = <T extends core::Object = dynamic>(core::int x) → core::String => (let final dynamic #t21 = 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'.
 Try correcting the name to the name of an existing method, or defining a method named 'substring'.
         .substring(3);
          ^") 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);
+    <T extends core::Object = dynamic>(core::String) → core::String z = string2String;
+    z = <T extends core::Object = dynamic>(core::String x) → core::String => x.{core::String::substring}(3);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
index c9bbbdd..fbc3370 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
@@ -4,20 +4,20 @@
 
 static method test() → void {
   {
-    function f<S extends core::Object>(core::int x) → core::String
+    function f<S extends core::Object = dynamic>(core::int x) → core::String
       return null;
-    <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 = let<BottomType> _ = 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'.
-Try 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'.
+    <S extends core::Object = dynamic>(core::int) → core::String v = f;
+    v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
+    v = <T extends core::Object = dynamic>(core::int x) → core::String => "hello";
+    v = let final dynamic #t1 = let<BottomType> _ = 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 = dynamic>(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::String'.
+Try changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::String'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (String x) =>
-                                                                ^" in let final <T extends core::Object>(core::String) → core::String #t2 = <T extends core::Object>(core::String x) → core::String => "hello" in null;
-    v = <T extends core::Object>(core::int x) → core::String => let final dynamic #t3 = let<BottomType> _ = 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'.
+                                                                ^" in let final <T extends core::Object = dynamic>(core::String) → core::String #t2 = <T extends core::Object = dynamic>(core::String x) → core::String => "hello" in null;
+    v = <T extends core::Object = dynamic>(core::int x) → core::String => let final dynamic #t3 = let<BottomType> _ = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (int x) => 3;
                                                                            ^" in let final core::int #t4 = 3 in null;
-    v = <T extends core::Object>(core::int x) → core::String {
+    v = <T extends core::Object = dynamic>(core::int x) → core::String {
       return let final dynamic #t5 = let<BottomType> _ = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
@@ -25,22 +25,22 @@
     };
   }
   {
-    function f<S extends core::Object>(core::int x) → core::String
+    function f<S extends core::Object = dynamic>(core::int x) → core::String
       return null;
-    <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 #t7 = let<BottomType> _ = 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'.
+    <S extends core::Object = dynamic>(core::int) → core::String v = f;
+    v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
+    v = <T extends core::Object = dynamic>(core::int x) → core::String => "hello";
+    v = <T extends core::Object = dynamic>(core::int x) → core::String => let final dynamic #t7 = let<BottomType> _ = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         3;
         ^" in let final core::int #t8 = 3 in null;
-    v = <T extends core::Object>(core::int x) → core::String {
+    v = <T extends core::Object = dynamic>(core::int x) → core::String {
       return let final dynamic #t9 = let<BottomType> _ = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in let final core::int #t10 = 3 in null;
     };
-    v = <T extends core::Object>(core::int x) → core::String {
+    v = <T extends core::Object = dynamic>(core::int x) → core::String {
       return let final dynamic #t11 = let<BottomType> _ = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ x;
@@ -48,20 +48,20 @@
     };
   }
   {
-    function f<S extends core::Object>(core::int x) → core::List<core::String>
+    function f<S extends core::Object = dynamic>(core::int x) → core::List<core::String>
       return null;
-    <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 #t13 = let<BottomType> _ = 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>'.
-Try 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>'.
+    <S extends core::Object = dynamic>(core::int) → core::List<core::String> v = f;
+    v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
+    v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>["hello"];
+    v = let final dynamic #t13 = let<BottomType> _ = 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 = dynamic>(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
+Try changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=List<String>*/ (String
-                                                                      ^" in let final <T extends core::Object>(core::String) → core::List<core::String> #t14 = <T extends core::Object>(core::String x) → core::List<core::String> => <core::String>["hello"] in null;
-    v = <T extends core::Object>(core::int x) → core::List<core::String> => <core::String>[let final dynamic #t15 = let<BottomType> _ = 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'.
+                                                                      ^" in let final <T extends core::Object = dynamic>(core::String) → core::List<core::String> #t14 = <T extends core::Object = dynamic>(core::String x) → core::List<core::String> => <core::String>["hello"] in null;
+    v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>[let final dynamic #t15 = let<BottomType> _ = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                      ^" in let final core::int #t16 = 3 in null];
-    v = <T extends core::Object>(core::int x) → core::List<core::String> {
+    v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> {
       return <core::String>[let final dynamic #t17 = let<BottomType> _ = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
@@ -69,26 +69,26 @@
     };
   }
   {
-    function int2int<S extends core::Object>(core::int x) → core::int
+    function int2int<S extends core::Object = dynamic>(core::int x) → core::int
       return null;
-    function int2String<T extends core::Object>(core::int x) → core::String
+    function int2String<T extends core::Object = dynamic>(core::int x) → core::String
       return null;
-    function string2String<T extends core::Object>(core::String x) → core::String
+    function string2String<T extends core::Object = dynamic>(core::String x) → core::String
       return null;
-    <S extends core::Object>(core::int) → core::int x = int2int;
-    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 #t19 = let<BottomType> _ = 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'.
+    <S extends core::Object = dynamic>(core::int) → core::int x = int2int;
+    x = <T extends core::Object = dynamic>(core::int x) → core::int => x;
+    x = <T extends core::Object = dynamic>(core::int x) → core::int => x.{core::num::+}(1);
+    <T extends core::Object = dynamic>(core::int) → core::String y = int2String;
+    y = <T extends core::Object = dynamic>(core::int x) → core::String => let final dynamic #t19 = let<BottomType> _ = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         x;
         ^" in let final core::int #t20 = x in null;
-    y = <T extends core::Object>(core::int x) → core::String => (let final core::int #t21 = x in let<BottomType> _ = 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'.
+    y = <T extends core::Object = dynamic>(core::int x) → core::String => (let final core::int #t21 = x in let<BottomType> _ = 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'.
 Try correcting the name to the name of an existing method, or defining a method named 'substring'.
         .substring(3);
          ^") 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);
+    <T extends core::Object = dynamic>(core::String) → core::String z = string2String;
+    z = <T extends core::Object = dynamic>(core::String x) → core::String => x.{core::String::substring}(3);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.expect
index e0aaab1..2f9e241 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<S extends core::Object, T extends core::Object> extends core::Object {
+class A<S extends core::Object = dynamic, T extends core::Object = dynamic> extends core::Object {
   field self::A::S x;
   field self::A::T y;
   constructor •(self::A::S x, self::A::T y) → void
@@ -12,7 +12,7 @@
     : self::A::x = x, self::A::y = y, super core::Object::•()
     ;
 }
-class B<S extends core::Object, T extends core::Object> extends self::A<self::B::T, self::B::S> {
+class B<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::A<self::B::T, self::B::S> {
   constructor •(self::B::S y, self::B::T x) → void
     : super self::A::•(x, y)
     ;
@@ -20,7 +20,7 @@
     : super self::A::named(x, y)
     ;
 }
-class C<S extends core::Object> extends self::B<self::C::S, self::C::S> {
+class C<S extends core::Object = dynamic> extends self::B<self::C::S, self::C::S> {
   constructor •(self::C::S a) → void
     : super self::B::•(a, a)
     ;
@@ -28,7 +28,7 @@
     : super self::B::named(a, a)
     ;
 }
-class D<S extends core::Object, T extends core::Object> extends self::B<self::D::T, core::int> {
+class D<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::B<self::D::T, core::int> {
   constructor •(self::D::T a) → void
     : super self::B::•(a, 3)
     ;
@@ -36,12 +36,12 @@
     : super self::B::named(a, 3)
     ;
 }
-class E<S extends core::Object, T extends core::Object> extends self::A<self::C<self::E::S>, self::E::T> {
+class E<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::A<self::C<self::E::S>, self::E::T> {
   constructor •(self::E::T a) → void
     : super self::A::•(null, a)
     ;
 }
-class F<S extends core::Object, T extends core::Object> extends self::A<self::F::S, self::F::T> {
+class F<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::A<self::F::S, self::F::T> {
   constructor •(self::F::S x, self::F::T y, {core::List<self::F::S> a = null, core::List<self::F::T> b = null}) → void
     : super self::A::•(x, y)
     ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.transformed.expect
index e0aaab1..2f9e241 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<S extends core::Object, T extends core::Object> extends core::Object {
+class A<S extends core::Object = dynamic, T extends core::Object = dynamic> extends core::Object {
   field self::A::S x;
   field self::A::T y;
   constructor •(self::A::S x, self::A::T y) → void
@@ -12,7 +12,7 @@
     : self::A::x = x, self::A::y = y, super core::Object::•()
     ;
 }
-class B<S extends core::Object, T extends core::Object> extends self::A<self::B::T, self::B::S> {
+class B<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::A<self::B::T, self::B::S> {
   constructor •(self::B::S y, self::B::T x) → void
     : super self::A::•(x, y)
     ;
@@ -20,7 +20,7 @@
     : super self::A::named(x, y)
     ;
 }
-class C<S extends core::Object> extends self::B<self::C::S, self::C::S> {
+class C<S extends core::Object = dynamic> extends self::B<self::C::S, self::C::S> {
   constructor •(self::C::S a) → void
     : super self::B::•(a, a)
     ;
@@ -28,7 +28,7 @@
     : super self::B::named(a, a)
     ;
 }
-class D<S extends core::Object, T extends core::Object> extends self::B<self::D::T, core::int> {
+class D<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::B<self::D::T, core::int> {
   constructor •(self::D::T a) → void
     : super self::B::•(a, 3)
     ;
@@ -36,12 +36,12 @@
     : super self::B::named(a, 3)
     ;
 }
-class E<S extends core::Object, T extends core::Object> extends self::A<self::C<self::E::S>, self::E::T> {
+class E<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::A<self::C<self::E::S>, self::E::T> {
   constructor •(self::E::T a) → void
     : super self::A::•(null, a)
     ;
 }
-class F<S extends core::Object, T extends core::Object> extends self::A<self::F::S, self::F::T> {
+class F<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::A<self::F::S, self::F::T> {
   constructor •(self::F::S x, self::F::T y, {core::List<self::F::S> a = null, core::List<self::F::T> b = null}) → void
     : super self::A::•(x, y)
     ;
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 b3047dd..5fc98c7 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
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<S extends core::Object, T extends core::Object> extends core::Object {
+class A<S extends core::Object = dynamic, T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::A::S x;
   generic-covariant-impl generic-covariant-interface field self::A::T y;
   constructor •(self::A::S x, self::A::T y) → void
@@ -12,7 +12,7 @@
     : self::A::x = x, self::A::y = y, super core::Object::•()
     ;
 }
-class B<S extends core::Object, T extends core::Object> extends self::A<self::B::T, self::B::S> {
+class B<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::A<self::B::T, self::B::S> {
   constructor •(self::B::S y, self::B::T x) → void
     : super self::A::•(x, y)
     ;
@@ -20,7 +20,7 @@
     : super self::A::named(x, y)
     ;
 }
-class C<S extends core::Object> extends self::B<self::C::S, self::C::S> {
+class C<S extends core::Object = dynamic> extends self::B<self::C::S, self::C::S> {
   constructor •(self::C::S a) → void
     : super self::B::•(a, a)
     ;
@@ -28,7 +28,7 @@
     : super self::B::named(a, a)
     ;
 }
-class D<S extends core::Object, T extends core::Object> extends self::B<self::D::T, core::int> {
+class D<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::B<self::D::T, core::int> {
   constructor •(self::D::T a) → void
     : super self::B::•(a, 3)
     ;
@@ -37,12 +37,12 @@
     ;
   abstract forwarding-stub set x(generic-covariant-impl core::int _) → void;
 }
-class E<S extends core::Object, T extends core::Object> extends self::A<self::C<self::E::S>, self::E::T> {
+class E<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::A<self::C<self::E::S>, self::E::T> {
   constructor •(self::E::T a) → void
     : super self::A::•(null, a)
     ;
 }
-class F<S extends core::Object, T extends core::Object> extends self::A<self::F::S, self::F::T> {
+class F<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::A<self::F::S, self::F::T> {
   constructor •(self::F::S x, self::F::T y, {core::List<self::F::S> a = null, core::List<self::F::T> b = null}) → void
     : super self::A::•(x, y)
     ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect
index 97104e0..1100687 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<S extends core::Object, T extends core::Object> extends core::Object {
+class A<S extends core::Object = dynamic, T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::A::S x;
   generic-covariant-impl generic-covariant-interface field self::A::T y;
   constructor •(self::A::S x, self::A::T y) → void
@@ -12,7 +12,7 @@
     : self::A::x = x, self::A::y = y, super core::Object::•()
     ;
 }
-class B<S extends core::Object, T extends core::Object> extends self::A<self::B::T, self::B::S> {
+class B<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::A<self::B::T, self::B::S> {
   constructor •(self::B::S y, self::B::T x) → void
     : super self::A::•(x, y)
     ;
@@ -20,7 +20,7 @@
     : super self::A::named(x, y)
     ;
 }
-class C<S extends core::Object> extends self::B<self::C::S, self::C::S> {
+class C<S extends core::Object = dynamic> extends self::B<self::C::S, self::C::S> {
   constructor •(self::C::S a) → void
     : super self::B::•(a, a)
     ;
@@ -28,7 +28,7 @@
     : super self::B::named(a, a)
     ;
 }
-class D<S extends core::Object, T extends core::Object> extends self::B<self::D::T, core::int> {
+class D<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::B<self::D::T, core::int> {
   constructor •(self::D::T a) → void
     : super self::B::•(a, 3)
     ;
@@ -37,12 +37,12 @@
     ;
   abstract forwarding-stub set x(generic-covariant-impl core::int _) → void;
 }
-class E<S extends core::Object, T extends core::Object> extends self::A<self::C<self::E::S>, self::E::T> {
+class E<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::A<self::C<self::E::S>, self::E::T> {
   constructor •(self::E::T a) → void
     : super self::A::•(null, a)
     ;
 }
-class F<S extends core::Object, T extends core::Object> extends self::A<self::F::S, self::F::T> {
+class F<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::A<self::F::S, self::F::T> {
   constructor •(self::F::S x, self::F::T y, {core::List<self::F::S> a = null, core::List<self::F::T> b = null}) → void
     : super self::A::•(x, y)
     ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.expect
index 85ea052..c243444 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Asserter<T extends core::Object> = (T) → void;
-typedef AsserterBuilder<S extends core::Object, T extends core::Object> = (S) → (T) → void;
+typedef Asserter<T extends core::Object = dynamic> = (T) → void;
+typedef AsserterBuilder<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → (T) → void;
 class DartType extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
@@ -26,7 +26,7 @@
     assertEOf.call(<dynamic>[self::_isInt, self::_isString]);
   }
 }
-abstract class G<T extends core::Object> extends core::Object {
+abstract class G<T extends core::Object = dynamic> extends core::Object {
   field (core::List<(self::DartType) → void>) → (self::DartType) → void assertAOf = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.transformed.expect
index 85ea052..c243444 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Asserter<T extends core::Object> = (T) → void;
-typedef AsserterBuilder<S extends core::Object, T extends core::Object> = (S) → (T) → void;
+typedef Asserter<T extends core::Object = dynamic> = (T) → void;
+typedef AsserterBuilder<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → (T) → void;
 class DartType extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
@@ -26,7 +26,7 @@
     assertEOf.call(<dynamic>[self::_isInt, self::_isString]);
   }
 }
-abstract class G<T extends core::Object> extends core::Object {
+abstract class G<T extends core::Object = dynamic> extends core::Object {
   field (core::List<(self::DartType) → void>) → (self::DartType) → void assertAOf = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.strong.expect
index 3339b4b..de41535 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Asserter<T extends core::Object> = (T) → void;
-typedef AsserterBuilder<S extends core::Object, T extends core::Object> = (S) → (T) → void;
+typedef Asserter<T extends core::Object = dynamic> = (T) → void;
+typedef AsserterBuilder<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → (T) → void;
 class DartType extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
@@ -26,7 +26,7 @@
     assertEOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
   }
 }
-abstract class G<T extends core::Object> extends core::Object {
+abstract class G<T extends core::Object = dynamic> extends core::Object {
   field (core::List<(self::DartType) → void>) → (self::DartType) → void assertAOf = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.strong.transformed.expect
index 3339b4b..de41535 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Asserter<T extends core::Object> = (T) → void;
-typedef AsserterBuilder<S extends core::Object, T extends core::Object> = (S) → (T) → void;
+typedef Asserter<T extends core::Object = dynamic> = (T) → void;
+typedef AsserterBuilder<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → (T) → void;
 class DartType extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
@@ -26,7 +26,7 @@
     assertEOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
   }
 }
-abstract class G<T extends core::Object> extends core::Object {
+abstract class G<T extends core::Object = dynamic> extends core::Object {
   field (core::List<(self::DartType) → void>) → (self::DartType) → void assertAOf = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.expect
index 2a6a8d9..bbe604f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-abstract class MyStream<T extends core::Object> extends asy::Stream<self::MyStream::T> {
-  static factory •<T extends core::Object>() → self::MyStream<self::MyStream::•::T>
+abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
+  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
     return null;
 }
 static method foo() → asy::Stream<core::List<core::int>> async* {
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.transformed.expect
index 55bf544..14c0f7c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-abstract class MyStream<T extends core::Object> extends asy::Stream<self::MyStream::T> {
-  static factory •<T extends core::Object>() → self::MyStream<self::MyStream::•::T>
+abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
+  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
     return null;
 }
 static method foo() → asy::Stream<core::List<core::int>> /* originally async* */ {
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 67bbde6..fcaf358 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
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-abstract class MyStream<T extends core::Object> extends asy::Stream<self::MyStream::T> {
-  static factory •<T extends core::Object>() → self::MyStream<self::MyStream::•::T>
+abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
+  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
     return null;
 }
 static method foo() → asy::Stream<core::List<core::int>> async* {
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.expect b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.expect
index a9ca0dd..01196f3 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.expect
@@ -8,6 +8,6 @@
     : self::C::x = self::f<dynamic>(), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.transformed.expect
index a9ca0dd..01196f3 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.transformed.expect
@@ -8,6 +8,6 @@
     : self::C::x = self::f<dynamic>(), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.outline.expect b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.outline.expect
index c3d8126..1a319e3 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.outline.expect
@@ -7,7 +7,7 @@
   constructor •() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.strong.expect b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.strong.expect
index 8924797..ebfd78a 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.strong.expect
@@ -8,6 +8,6 @@
     : self::C::x = self::f<core::int>(), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.strong.transformed.expect
index 8924797..ebfd78a 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.strong.transformed.expect
@@ -8,6 +8,6 @@
     : self::C::x = self::f<core::int>(), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.expect b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.expect
index d495b26..9057cb2 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.expect
@@ -14,6 +14,6 @@
     ;
   abstract get x() → core::int;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.transformed.expect
index d495b26..9057cb2 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.transformed.expect
@@ -14,6 +14,6 @@
     ;
   abstract get x() → core::int;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.outline.expect b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.outline.expect
index e0ab312..a7c7685 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.outline.expect
@@ -12,7 +12,7 @@
     ;
   abstract get x() → core::int;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.strong.expect b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.strong.expect
index ef576d9..e060b43 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.strong.expect
@@ -14,6 +14,6 @@
     ;
   abstract get x() → core::int;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.strong.transformed.expect
index ef576d9..e060b43 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.strong.transformed.expect
@@ -14,6 +14,6 @@
     ;
   abstract get x() → core::int;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.expect b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.expect
index a9ca0dd..01196f3 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.expect
@@ -8,6 +8,6 @@
     : self::C::x = self::f<dynamic>(), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.transformed.expect
index a9ca0dd..01196f3 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.transformed.expect
@@ -8,6 +8,6 @@
     : self::C::x = self::f<dynamic>(), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.outline.expect b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.outline.expect
index c3d8126..1a319e3 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.outline.expect
@@ -7,7 +7,7 @@
   constructor •() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.strong.expect b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.strong.expect
index 8924797..ebfd78a 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.strong.expect
@@ -8,6 +8,6 @@
     : self::C::x = self::f<core::int>(), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.strong.transformed.expect
index 8924797..ebfd78a 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.strong.transformed.expect
@@ -8,6 +8,6 @@
     : self::C::x = self::f<core::int>(), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.expect b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.expect
index dfabd77..f3969cb 100644
--- a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.expect
@@ -8,6 +8,6 @@
     : self::C::x = self::f<dynamic>(p), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>(self::f::T t) → self::f::T
+static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
   return t;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.transformed.expect
index dfabd77..f3969cb 100644
--- a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.transformed.expect
@@ -8,6 +8,6 @@
     : self::C::x = self::f<dynamic>(p), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>(self::f::T t) → self::f::T
+static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
   return t;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.outline.expect b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.outline.expect
index 8512f84..a19f31b 100644
--- a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.outline.expect
@@ -7,7 +7,7 @@
   constructor •(core::int p) → void
     ;
 }
-static method f<T extends core::Object>(self::f::T t) → self::f::T
+static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.strong.expect b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.strong.expect
index ba6f581f..e0950da 100644
--- a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.strong.expect
@@ -8,6 +8,6 @@
     : self::C::x = self::f<core::int>(p), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>(self::f::T t) → self::f::T
+static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
   return t;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.strong.transformed.expect
index ba6f581f..e0950da 100644
--- a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.strong.transformed.expect
@@ -8,6 +8,6 @@
     : self::C::x = self::f<core::int>(p), super core::Object::•()
     ;
 }
-static method f<T extends core::Object>(self::f::T t) → self::f::T
+static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
   return t;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then.dart.direct.expect b/pkg/front_end/testcases/inference/future_then.dart.direct.expect
index d9c0e0e..238fc77 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
index 80a20d3..d3553bd 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then.dart.outline.expect b/pkg/front_end/testcases/inference/future_then.dart.outline.expect
index bf89d40..0e4e4b9 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(self::MyFuture::T x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then.dart.strong.expect b/pkg/front_end/testcases/inference/future_then.dart.strong.expect
index b7c6c22..59ff30a 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
index 5caa1e0..5f0f486 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_2.dart.direct.expect
index 3290595..d6b1ae2 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
index 93b4078..433be3a 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect
index bf89d40..0e4e4b9 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(self::MyFuture::T x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_2.dart.strong.expect
index 264f452..c4514a8 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
index 8989332..4d6c659 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_3.dart.direct.expect
index fc2ec41..28f970f 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
index a94ad9c..05ea1f5 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect
index bf89d40..0e4e4b9 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(self::MyFuture::T x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_3.dart.strong.expect
index 496a434..41dd64d 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
index 78a4a61..90396a6 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_4.dart.direct.expect
index 627469a9..9d89e58 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
index ee00df9..ed1cac1 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect
index bf89d40..0e4e4b9 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(self::MyFuture::T x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_4.dart.strong.expect
index 0e9ab26..fb3eb9f 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
index 03446f5..ff00d40 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_5.dart.direct.expect
index cf8341b..d8ab165 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
index 2c79488..62658a3 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect
index bf89d40..0e4e4b9 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(self::MyFuture::T x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_5.dart.strong.expect
index 60a45b2..369cd48 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
index 495a584..3aba981 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_6.dart.direct.expect
index 59eca7d..be6b273 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
index 470f6c1..434b5d6 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect
index bf89d40..0e4e4b9 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(self::MyFuture::T x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_6.dart.strong.expect
index 03a4550..51d8ee3 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
index 01b2db8..2e7cc96 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.expect
index 6352e0d..60890bc 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
index 8b8e2a7..f2f15cd 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect
index bf89d40..0e4e4b9 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(self::MyFuture::T x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.expect
index 08ec64a..1d68a0b 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
index ff77eeb..a1d8145 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.expect
index 4884c6c..ffc7080 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
index 77323ea..2fa2c058 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
index bf89d40..0e4e4b9 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(self::MyFuture::T x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.expect
index 13b1486..0d784ca 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
index f272bfc..10610b3 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.expect
index 477583e..215e634 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
index 4fc92fe..ef2e0fb 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
index bf89d40..0e4e4b9 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(self::MyFuture::T x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.expect
index af297a2..d153459 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
index f2c3a2a..b2e6ed0 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.expect
index 73ac5c0..801d3e8 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
index dc2f85e..5ceaae0 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
index bf89d40..0e4e4b9 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(self::MyFuture::T x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.expect
index b3e8ccc..a6160a6 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
index 6c4ab09..1262645 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.expect
index 32dbcf8..94ca72c 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
index d7bf2f2..a20328a 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
index bf89d40..0e4e4b9 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(self::MyFuture::T x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.expect
index 8425b11..0fe0dcd 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
index f1cb720..de8bd3e 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.expect
index 2fb57b2..57291da 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
index 93c7048..77de0e0 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
index bf89d40..0e4e4b9 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(self::MyFuture::T x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.expect
index 47e72b3..55f02eb 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
index 48d5198..1dd34b9 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.expect
index 3f7d35c..2665c52 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
index f0608c1..cb0d0d1 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
index bf89d40..0e4e4b9 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(self::MyFuture::T x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.expect
index 0b16167..5bef4dd 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
index 186d1fe..a07f3c4 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.expect
index ad86cf9..4f7b85b 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.transformed.expect
index ad86cf9..4f7b85b 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect
index dd8d84a..b0ad581 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(self::MyFuture::T x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
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 e70813f..b8334ef 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
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
index 5f33f15..ae2f1fe 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.expect
index a47a67c..8e506d2 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.transformed.expect
index a47a67c..8e506d2 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
index dd8d84a..b0ad581 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(self::MyFuture::T x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
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 7a3e3e5..3557d61 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
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
index c45f7a3..13d7235 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.expect
index e107ab2..78825bf 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.transformed.expect
index e107ab2..78825bf 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
index f9939e0..f7f3336 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(self::MyFuture::T x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
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 d0de61c..ef64c92 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
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
index 7784c77..163b552 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.expect
index 2f01968..cf63b53 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(dynamic x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
index 5fc5f19..b058d42 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(dynamic x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
index 353c1be..cb95b45 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(dynamic x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.expect
index 722f2d6..fc102e4 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(dynamic x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
index 260e803..6385881 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(dynamic x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.expect
index e4c0c12..d08eb4f 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(dynamic x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
index 3010ada..fa93ea9 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(dynamic x) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
index 353c1be..cb95b45 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value(dynamic x) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.expect
index c539bcd..b2ae474 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(dynamic x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
index ee81fa3..ad3c572 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value(dynamic x) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.expect
index 2bdcc03..31c6b7a 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
index 5db5ef3..167fe79 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect
index 203722c..2bad4e8 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value([dynamic x]) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
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 c6c4632..07071bc 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
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
index e8e745e..2086318 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.expect
index c76f12a..e8e6411 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
index 87b4be0eb..24fedaa 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
index 203722c..2bad4e8 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value([dynamic x]) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.expect
index 5c9ecaf..83706a9 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
index 7eae3ec..6134e15 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.expect
index 7e03996..9027e83 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
index 665f3ee..aacc250 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
index 64f58e3..4e0c84c 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value([dynamic x]) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
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 a78fef7..ed51407 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
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
index ff49091..4dbee3a 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.expect
index a80ae91..4873748 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
index b952431..87239a3 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
index 64f58e3..4e0c84c 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     ;
   constructor value([dynamic x]) → void
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.expect
index d62bc1b..65901ec 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
index f3bd417..af8f590 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
-  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
   abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.expect
index 99a343c..cee5b68 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-static method id<T extends core::Object>(self::id::T x) → self::id::T
+static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
   return x;
 static method test() → dynamic async {
   asy::Future<core::String> f;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect
index 826a96d..91cb8b0 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-static method id<T extends core::Object>(self::id::T x) → self::id::T
+static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
   return x;
 static method test() → dynamic /* originally async */ {
   final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.outline.expect
index a323d38..92d9692 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method id<T extends core::Object>(self::id::T x) → self::id::T
+static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
   ;
 static method test() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.expect
index 2417d16..39e445a 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-static method id<T extends core::Object>(self::id::T x) → self::id::T
+static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
   return x;
 static method test() → dynamic async {
   asy::Future<core::String> f;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
index 0a3ce6b..92c8c6b 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-static method id<T extends core::Object>(self::id::T x) → self::id::T
+static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
   return x;
 static method test() → dynamic /* originally async */ {
   final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
diff --git a/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.direct.expect b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.direct.expect
index e583060..53ab933f 100644
--- a/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.direct.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef ToValue<T extends core::Object> = (T) → void;
+typedef ToValue<T extends core::Object = dynamic> = (T) → void;
 static method main() → dynamic {
-  function f<T extends core::Object>(T x) → (T) → void
+  function f<T extends core::Object = dynamic>(T x) → (T) → void
     return null;
   dynamic x = f.call<core::int>(42);
   dynamic y = f.call(42);
diff --git a/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.direct.transformed.expect
index e583060..53ab933f 100644
--- a/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.direct.transformed.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef ToValue<T extends core::Object> = (T) → void;
+typedef ToValue<T extends core::Object = dynamic> = (T) → void;
 static method main() → dynamic {
-  function f<T extends core::Object>(T x) → (T) → void
+  function f<T extends core::Object = dynamic>(T x) → (T) → void
     return null;
   dynamic x = f.call<core::int>(42);
   dynamic y = f.call(42);
diff --git a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.direct.expect
index a770f08..fe1c799 100644
--- a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<S extends core::Object, T extends core::Object>(self::f::S s) → self::f::T
+static method f<S extends core::Object = dynamic, T extends core::Object = dynamic>(self::f::S s) → self::f::T
   return null;
 static method main() → dynamic {
   core::String x = self::f<dynamic, dynamic>(42);
diff --git a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.direct.transformed.expect
index a770f08..fe1c799 100644
--- a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<S extends core::Object, T extends core::Object>(self::f::S s) → self::f::T
+static method f<S extends core::Object = dynamic, T extends core::Object = dynamic>(self::f::S s) → self::f::T
   return null;
 static method main() → dynamic {
   core::String x = self::f<dynamic, dynamic>(42);
diff --git a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.strong.expect
index e9fb8da..b410886 100644
--- a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<S extends core::Object, T extends core::Object>(self::f::S s) → self::f::T
+static method f<S extends core::Object = dynamic, T extends core::Object = dynamic>(self::f::S s) → self::f::T
   return null;
 static method main() → dynamic {
   core::String x = self::f<core::int, core::String>(42);
diff --git a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.strong.transformed.expect
index e9fb8da..b410886 100644
--- a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<S extends core::Object, T extends core::Object>(self::f::S s) → self::f::T
+static method f<S extends core::Object = dynamic, T extends core::Object = dynamic>(self::f::S s) → self::f::T
   return null;
 static method main() → dynamic {
   core::String x = self::f<core::int, core::String>(42);
diff --git a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.direct.expect
index 4b4f413..17b048c 100644
--- a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.direct.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<T extends core::Pattern> extends core::Object {
+class Foo<T extends core::Pattern = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method method<U extends self::Foo::T>(self::Foo::method::U u) → self::Foo::method::U
+  method method<U extends self::Foo::T = dynamic>(self::Foo::method::U u) → self::Foo::method::U
     return u;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.direct.transformed.expect
index 4b4f413..17b048c 100644
--- a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.direct.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<T extends core::Pattern> extends core::Object {
+class Foo<T extends core::Pattern = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method method<U extends self::Foo::T>(self::Foo::method::U u) → self::Foo::method::U
+  method method<U extends self::Foo::T = dynamic>(self::Foo::method::U u) → self::Foo::method::U
     return u;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.strong.expect
index 920bdcc..f365fb5 100644
--- a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.strong.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<T extends core::Pattern> extends core::Object {
+class Foo<T extends core::Pattern = core::Pattern> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method method<generic-covariant-impl generic-covariant-interface U extends self::Foo::T>(self::Foo::method::U u) → self::Foo::method::U
+  method method<generic-covariant-impl generic-covariant-interface U extends self::Foo::T = dynamic>(self::Foo::method::U u) → self::Foo::method::U
     return u;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.direct.expect
index 7e92972..4370627 100644
--- a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.direct.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
     return x;
 }
 class D extends self::C {
diff --git a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.direct.transformed.expect
index 7e92972..4370627 100644
--- a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
     return x;
 }
 class D extends self::C {
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 8514bf6..1d84eb1 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
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
     return x;
 }
 class D extends self::C {
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.direct.expect
index e070910..5ab9647 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>(core::List<self::f::T> s) → self::f::T
+static method f<T extends core::Object = dynamic>(core::List<self::f::T> s) → self::f::T
   return null;
 static method test() → dynamic {
   core::String x = self::f<dynamic>(<dynamic>["hi"]);
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.direct.transformed.expect
index e070910..5ab9647 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>(core::List<self::f::T> s) → self::f::T
+static method f<T extends core::Object = dynamic>(core::List<self::f::T> s) → self::f::T
   return null;
 static method test() → dynamic {
   core::String x = self::f<dynamic>(<dynamic>["hi"]);
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 5ac5390..a980b89 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
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>(core::List<self::f::T> s) → self::f::T
+static method f<T extends core::Object = dynamic>(core::List<self::f::T> s) → self::f::T
   return null;
 static method test() → dynamic {
   core::String x = self::f<core::String>(<core::String>["hi"]);
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect
index 4722ed3..4a81079 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>(core::List<self::f::T> s) → self::f::T
+static method f<T extends core::Object = dynamic>(core::List<self::f::T> s) → self::f::T
   return null;
 static method test() → dynamic {
   core::String x = self::f<core::String>(<core::String>["hi"]);
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.expect
index af643ea..f688995 100644
--- a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.expect
@@ -15,9 +15,9 @@
   synthetic constructor •() → void
     : super self::C::•()
     ;
-  method m<T extends core::Object>(self::D::m::T x) → self::D::m::T
+  method m<T extends core::Object = dynamic>(self::D::m::T x) → self::D::m::T
     return x;
-  method g<T extends core::Object>(self::D::g::T x) → self::D::g::T
+  method g<T extends core::Object = dynamic>(self::D::g::T x) → self::D::g::T
     return x;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.transformed.expect
index af643ea..f688995 100644
--- a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.transformed.expect
@@ -15,9 +15,9 @@
   synthetic constructor •() → void
     : super self::C::•()
     ;
-  method m<T extends core::Object>(self::D::m::T x) → self::D::m::T
+  method m<T extends core::Object = dynamic>(self::D::m::T x) → self::D::m::T
     return x;
-  method g<T extends core::Object>(self::D::g::T x) → self::D::g::T
+  method g<T extends core::Object = dynamic>(self::D::g::T x) → self::D::g::T
     return x;
 }
 static method main() → dynamic {
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 db0f902..7e4bcfc6 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
@@ -15,9 +15,9 @@
   synthetic constructor •() → void
     : super self::C::•()
     ;
-  method m<T extends core::Object>(self::D::m::T x) → self::D::m::T
+  method m<T extends core::Object = dynamic>(self::D::m::T x) → self::D::m::T
     return x;
-  method g<T extends core::Object>(self::D::g::T x) → self::D::g::T
+  method g<T extends core::Object = dynamic>(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:46: Error: Declared type variables of 'D::m' doesn't match those on overridden method 'C::m'.
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.expect
index 99e84b5..0f57adc 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<V extends core::Object> = (V) → void;
-class C<T extends core::Object> extends self::D<self::C::T> {
+typedef F<V extends core::Object = dynamic> = (V) → void;
+class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
-  method f<U extends core::Object>(dynamic x) → dynamic {}
+  method f<U extends core::Object = dynamic>(dynamic x) → dynamic {}
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends core::Object>(self::D::f::U u) → (self::D::f::U) → void
+  method f<U extends core::Object = dynamic>(self::D::f::U u) → (self::D::f::U) → void
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.transformed.expect
index 99e84b5..0f57adc 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<V extends core::Object> = (V) → void;
-class C<T extends core::Object> extends self::D<self::C::T> {
+typedef F<V extends core::Object = dynamic> = (V) → void;
+class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
-  method f<U extends core::Object>(dynamic x) → dynamic {}
+  method f<U extends core::Object = dynamic>(dynamic x) → dynamic {}
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends core::Object>(self::D::f::U u) → (self::D::f::U) → void
+  method f<U extends core::Object = dynamic>(self::D::f::U u) → (self::D::f::U) → void
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.strong.expect
index b141cc6..9e57aaf 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.strong.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<V extends core::Object> = (V) → void;
-class C<T extends core::Object> extends self::D<self::C::T> {
+typedef F<V extends core::Object = dynamic> = (V) → void;
+class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
-  method f<U extends core::Object>(self::C::f::U x) → (self::C::f::U) → void {}
+  method f<U extends core::Object = dynamic>(self::C::f::U x) → (self::C::f::U) → void {}
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends core::Object>(self::D::f::U u) → (self::D::f::U) → void
+  method f<U extends core::Object = dynamic>(self::D::f::U u) → (self::D::f::U) → void
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.strong.transformed.expect
index b141cc6..9e57aaf 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.strong.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<V extends core::Object> = (V) → void;
-class C<T extends core::Object> extends self::D<self::C::T> {
+typedef F<V extends core::Object = dynamic> = (V) → void;
+class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
-  method f<U extends core::Object>(self::C::f::U x) → (self::C::f::U) → void {}
+  method f<U extends core::Object = dynamic>(self::C::f::U x) → (self::C::f::U) → void {}
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends core::Object>(self::D::f::U u) → (self::D::f::U) → void
+  method f<U extends core::Object = dynamic>(self::D::f::U u) → (self::D::f::U) → void
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.expect
index 551a22b..17d6815 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef G<V extends core::Object> = () → core::List<V>;
-class C<T extends core::Object> extends self::D<self::C::T> {
+typedef G<V extends core::Object = dynamic> = () → core::List<V>;
+class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
-  method f<U extends core::Object>(dynamic g) → dynamic
+  method f<U extends core::Object = dynamic>(dynamic g) → dynamic
     return null;
 }
-abstract class D<T extends core::Object> extends core::Object {
+abstract class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  abstract method f<U extends core::Object>(() → core::List<self::D::f::U> g) → void;
+  abstract method f<U extends core::Object = dynamic>(() → core::List<self::D::f::U> g) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.transformed.expect
index 551a22b..17d6815 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef G<V extends core::Object> = () → core::List<V>;
-class C<T extends core::Object> extends self::D<self::C::T> {
+typedef G<V extends core::Object = dynamic> = () → core::List<V>;
+class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
-  method f<U extends core::Object>(dynamic g) → dynamic
+  method f<U extends core::Object = dynamic>(dynamic g) → dynamic
     return null;
 }
-abstract class D<T extends core::Object> extends core::Object {
+abstract class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  abstract method f<U extends core::Object>(() → core::List<self::D::f::U> g) → void;
+  abstract method f<U extends core::Object = dynamic>(() → core::List<self::D::f::U> g) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.strong.expect
index 4e1632a..d201593 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.strong.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef G<V extends core::Object> = () → core::List<V>;
-class C<T extends core::Object> extends self::D<self::C::T> {
+typedef G<V extends core::Object = dynamic> = () → core::List<V>;
+class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
-  method f<U extends core::Object>(() → core::List<self::C::f::U> g) → void
+  method f<U extends core::Object = dynamic>(() → core::List<self::C::f::U> g) → void
     return null;
 }
-abstract class D<T extends core::Object> extends core::Object {
+abstract class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  abstract method f<U extends core::Object>(() → core::List<self::D::f::U> g) → void;
+  abstract method f<U extends core::Object = dynamic>(() → core::List<self::D::f::U> g) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.strong.transformed.expect
index 4e1632a..d201593 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.strong.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef G<V extends core::Object> = () → core::List<V>;
-class C<T extends core::Object> extends self::D<self::C::T> {
+typedef G<V extends core::Object = dynamic> = () → core::List<V>;
+class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
-  method f<U extends core::Object>(() → core::List<self::C::f::U> g) → void
+  method f<U extends core::Object = dynamic>(() → core::List<self::C::f::U> g) → void
     return null;
 }
-abstract class D<T extends core::Object> extends core::Object {
+abstract class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  abstract method f<U extends core::Object>(() → core::List<self::D::f::U> g) → void;
+  abstract method f<U extends core::Object = dynamic>(() → core::List<self::D::f::U> g) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.expect
index 4465b65..4b020dd 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<V extends core::Object> = () → V;
-class C<T extends core::Object> extends self::D<self::C::T> {
+typedef F<V extends core::Object = dynamic> = () → V;
+class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
-  method f<U extends core::Object>(dynamic x) → dynamic {}
+  method f<U extends core::Object = dynamic>(dynamic x) → dynamic {}
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends core::Object>(self::D::f::U u) → () → self::D::f::U
+  method f<U extends core::Object = dynamic>(self::D::f::U u) → () → self::D::f::U
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.transformed.expect
index 4465b65..4b020dd 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<V extends core::Object> = () → V;
-class C<T extends core::Object> extends self::D<self::C::T> {
+typedef F<V extends core::Object = dynamic> = () → V;
+class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
-  method f<U extends core::Object>(dynamic x) → dynamic {}
+  method f<U extends core::Object = dynamic>(dynamic x) → dynamic {}
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends core::Object>(self::D::f::U u) → () → self::D::f::U
+  method f<U extends core::Object = dynamic>(self::D::f::U u) → () → self::D::f::U
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.strong.expect
index eb9055b..53feefd 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.strong.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<V extends core::Object> = () → V;
-class C<T extends core::Object> extends self::D<self::C::T> {
+typedef F<V extends core::Object = dynamic> = () → V;
+class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
-  method f<U extends core::Object>(self::C::f::U x) → () → self::C::f::U {}
+  method f<U extends core::Object = dynamic>(self::C::f::U x) → () → self::C::f::U {}
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends core::Object>(self::D::f::U u) → () → self::D::f::U
+  method f<U extends core::Object = dynamic>(self::D::f::U u) → () → self::D::f::U
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.strong.transformed.expect
index eb9055b..53feefd 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.strong.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<V extends core::Object> = () → V;
-class C<T extends core::Object> extends self::D<self::C::T> {
+typedef F<V extends core::Object = dynamic> = () → V;
+class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
-  method f<U extends core::Object>(self::C::f::U x) → () → self::C::f::U {}
+  method f<U extends core::Object = dynamic>(self::C::f::U x) → () → self::C::f::U {}
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends core::Object>(self::D::f::U u) → () → self::D::f::U
+  method f<U extends core::Object = dynamic>(self::D::f::U u) → () → self::D::f::U
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.expect
index 3a68a44..5f8ac38 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::num>(self::C::m::T x, self::C::m::T y) → self::C::m::T
+  method m<T extends core::num = dynamic>(self::C::m::T x, self::C::m::T y) → self::C::m::T
     return null;
 }
 static method test() → dynamic {
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.transformed.expect
index 3a68a44..5f8ac38 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.transformed.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::num>(self::C::m::T x, self::C::m::T y) → self::C::m::T
+  method m<T extends core::num = dynamic>(self::C::m::T x, self::C::m::T y) → self::C::m::T
     return null;
 }
 static method test() → dynamic {
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 7774f17..7572fdd 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
@@ -7,7 +7,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::num>(self::C::m::T x, self::C::m::T y) → self::C::m::T
+  method m<T extends core::num = dynamic>(self::C::m::T x, self::C::m::T y) → self::C::m::T
     return null;
 }
 static method test() → dynamic {
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
index a11c923..a687df6 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::num>(self::C::m::T x, self::C::m::T y) → self::C::m::T
+  method m<T extends core::num = dynamic>(self::C::m::T x, self::C::m::T y) → self::C::m::T
     return null;
 }
 static method test() → dynamic {
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.expect
index 41749ee..65e0f43 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.expect
@@ -6,14 +6,14 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
     return x;
 }
 class D extends self::C {
   synthetic constructor •() → void
     : super self::C::•()
     ;
-  method m<S extends core::Object>(dynamic x) → dynamic
+  method m<S extends core::Object = dynamic>(dynamic x) → dynamic
     return x;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.transformed.expect
index 41749ee..65e0f43 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.transformed.expect
@@ -6,14 +6,14 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
     return x;
 }
 class D extends self::C {
   synthetic constructor •() → void
     : super self::C::•()
     ;
-  method m<S extends core::Object>(dynamic x) → dynamic
+  method m<S extends core::Object = dynamic>(dynamic x) → dynamic
     return x;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.strong.expect
index 671ce41..b58c879 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.strong.expect
@@ -6,14 +6,14 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
     return x;
 }
 class D extends self::C {
   synthetic constructor •() → void
     : super self::C::•()
     ;
-  method m<S extends core::Object>(self::D::m::S x) → self::D::m::S
+  method m<S extends core::Object = dynamic>(self::D::m::S x) → self::D::m::S
     return x;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.strong.transformed.expect
index 671ce41..b58c879 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.strong.transformed.expect
@@ -6,14 +6,14 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
     return x;
 }
 class D extends self::C {
   synthetic constructor •() → void
     : super self::C::•()
     ;
-  method m<S extends core::Object>(self::D::m::S x) → self::D::m::S
+  method m<S extends core::Object = dynamic>(self::D::m::S x) → self::D::m::S
     return x;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.direct.expect
index 1c4540d..cdb7f17 100644
--- a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef F = (core::int) → core::Iterable<core::num>;
 typedef G = (core::double) → core::List<core::int>;
-static method generic<T extends core::Object>((self::generic::T) → dynamic a, (self::generic::T) → dynamic b) → self::generic::T
+static method generic<T extends core::Object = dynamic>((self::generic::T) → dynamic a, (self::generic::T) → dynamic b) → self::generic::T
   return null;
 static method main() → dynamic {
   dynamic v = self::generic<dynamic>(((core::int) → core::Iterable<core::num> f) → dynamic => null, ((core::double) → core::List<core::int> g) → dynamic => null);
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.direct.transformed.expect
index 1c4540d..cdb7f17 100644
--- a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef F = (core::int) → core::Iterable<core::num>;
 typedef G = (core::double) → core::List<core::int>;
-static method generic<T extends core::Object>((self::generic::T) → dynamic a, (self::generic::T) → dynamic b) → self::generic::T
+static method generic<T extends core::Object = dynamic>((self::generic::T) → dynamic a, (self::generic::T) → dynamic b) → self::generic::T
   return null;
 static method main() → dynamic {
   dynamic v = self::generic<dynamic>(((core::int) → core::Iterable<core::num> f) → dynamic => null, ((core::double) → core::List<core::int> g) → dynamic => null);
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.expect
index 0aafd64..cd5eddc 100644
--- a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.expect
@@ -4,7 +4,7 @@
 
 typedef F = (core::int) → core::Iterable<core::num>;
 typedef G = (core::double) → core::List<core::int>;
-static method generic<T extends core::Object>((self::generic::T) → dynamic a, (self::generic::T) → dynamic b) → self::generic::T
+static method generic<T extends core::Object = dynamic>((self::generic::T) → dynamic a, (self::generic::T) → dynamic b) → self::generic::T
   return null;
 static method main() → dynamic {
   (core::num) → core::List<core::int> v = self::generic<(core::num) → core::List<core::int>>(((core::int) → core::Iterable<core::num> f) → core::Null => null, ((core::double) → core::List<core::int> g) → core::Null => null);
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.transformed.expect
index 0aafd64..cd5eddc 100644
--- a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef F = (core::int) → core::Iterable<core::num>;
 typedef G = (core::double) → core::List<core::int>;
-static method generic<T extends core::Object>((self::generic::T) → dynamic a, (self::generic::T) → dynamic b) → self::generic::T
+static method generic<T extends core::Object = dynamic>((self::generic::T) → dynamic a, (self::generic::T) → dynamic b) → self::generic::T
   return null;
 static method main() → dynamic {
   (core::num) → core::List<core::int> v = self::generic<(core::num) → core::List<core::int>>(((core::int) → core::Iterable<core::num> f) → core::Null => null, ((core::double) → core::List<core::int> g) → core::Null => null);
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.expect b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.expect
index e98bebc..bf38d28 100644
--- a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<E extends core::Object> extends core::Object {
+abstract class C<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -12,7 +12,7 @@
   static method _compareAny(dynamic a, dynamic b) → core::int {
     throw "unimplemented";
   }
-  static method sort2<E extends core::Object>(self::C<self::C::sort2::E> a, (self::C::sort2::E, self::C::sort2::E) → core::int compare) → void {
+  static method sort2<E extends core::Object = dynamic>(self::C<self::C::sort2::E> a, (self::C::sort2::E, self::C::sort2::E) → core::int compare) → void {
     throw "unimplemented";
   }
 }
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.transformed.expect
index e98bebc..bf38d28 100644
--- a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<E extends core::Object> extends core::Object {
+abstract class C<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -12,7 +12,7 @@
   static method _compareAny(dynamic a, dynamic b) → core::int {
     throw "unimplemented";
   }
-  static method sort2<E extends core::Object>(self::C<self::C::sort2::E> a, (self::C::sort2::E, self::C::sort2::E) → core::int compare) → void {
+  static method sort2<E extends core::Object = dynamic>(self::C<self::C::sort2::E> a, (self::C::sort2::E, self::C::sort2::E) → core::int compare) → void {
     throw "unimplemented";
   }
 }
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.outline.expect b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.outline.expect
index 3ab1e85..dcee7af 100644
--- a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.outline.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<E extends core::Object> extends core::Object {
+abstract class C<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method sort([(self::C::E, self::C::E) → core::int compare]) → void
     ;
   static method _compareAny(dynamic a, dynamic b) → core::int
     ;
-  static method sort2<E extends core::Object>(self::C<self::C::sort2::E> a, (self::C::sort2::E, self::C::sort2::E) → core::int compare) → void
+  static method sort2<E extends core::Object = dynamic>(self::C<self::C::sort2::E> a, (self::C::sort2::E, self::C::sort2::E) → core::int compare) → void
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.strong.expect b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.strong.expect
index 949aa38..12798a4 100644
--- a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<E extends core::Object> extends core::Object {
+abstract class C<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -12,7 +12,7 @@
   static method _compareAny(dynamic a, dynamic b) → core::int {
     throw "unimplemented";
   }
-  static method sort2<E extends core::Object>(self::C<self::C::sort2::E> a, (self::C::sort2::E, self::C::sort2::E) → core::int compare) → void {
+  static method sort2<E extends core::Object = dynamic>(self::C<self::C::sort2::E> a, (self::C::sort2::E, self::C::sort2::E) → core::int compare) → void {
     throw "unimplemented";
   }
 }
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.strong.transformed.expect
index 949aa38..12798a4 100644
--- a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<E extends core::Object> extends core::Object {
+abstract class C<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -12,7 +12,7 @@
   static method _compareAny(dynamic a, dynamic b) → core::int {
     throw "unimplemented";
   }
-  static method sort2<E extends core::Object>(self::C<self::C::sort2::E> a, (self::C::sort2::E, self::C::sort2::E) → core::int compare) → void {
+  static method sort2<E extends core::Object = dynamic>(self::C<self::C::sort2::E> a, (self::C::sort2::E, self::C::sort2::E) → core::int compare) → void {
     throw "unimplemented";
   }
 }
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.expect
index 2b083f0..c5a8995 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.expect
@@ -46,6 +46,6 @@
     dynamic v7 = let final dynamic #t2 = this.{self::Test::member} in let final dynamic #t3 = this.{self::Test::member} = #t2.-(1) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.transformed.expect
index 2b083f0..c5a8995 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.transformed.expect
@@ -46,6 +46,6 @@
     dynamic v7 = let final dynamic #t2 = this.{self::Test::member} in let final dynamic #t3 = this.{self::Test::member} = #t2.-(1) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.outline.expect
index 031084f..ca2db03 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.outline.expect
@@ -29,7 +29,7 @@
   method test() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.strong.expect
index 9efe1fd..06514fa 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.strong.expect
@@ -46,6 +46,6 @@
     self::B v7 = let final self::B #t2 = this.{self::Test::member} in let final self::B #t3 = this.{self::Test::member} = #t2.{self::B::-}(1) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.strong.transformed.expect
index 9efe1fd..06514fa 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.strong.transformed.expect
@@ -46,6 +46,6 @@
     self::B v7 = let final self::B #t2 = this.{self::Test::member} in let final self::B #t3 = this.{self::Test::member} = #t2.{self::B::-}(1) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.expect
index 38a2aec..a8ccc13 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.expect
@@ -54,6 +54,6 @@
     dynamic v7 = let final dynamic #t38 = t in let final dynamic #t39 = self::f<dynamic>() in let final dynamic #t40 = #t38.[](#t39) in let final dynamic #t41 = #t38.[]=(#t39, #t40.-(1)) in #t40;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.transformed.expect
index 38a2aec..a8ccc13 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.transformed.expect
@@ -54,6 +54,6 @@
     dynamic v7 = let final dynamic #t38 = t in let final dynamic #t39 = self::f<dynamic>() in let final dynamic #t40 = #t38.[](#t39) in let final dynamic #t41 = #t38.[]=(#t39, #t40.-(1)) in #t40;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.outline.expect
index ff1db0b..8286554 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.outline.expect
@@ -36,7 +36,7 @@
   method test() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.strong.expect
index 5675288..62bd534 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.strong.expect
@@ -54,6 +54,6 @@
     self::B v7 = let final self::Test #t38 = t in let final dynamic #t39 = self::f<dynamic>() in let final self::B #t40 = #t38.{self::Test::[]}(#t39 as{TypeError} self::Index) in let final void #t41 = #t38.{self::Test::[]=}(#t39 as{TypeError} self::Index, #t40.{self::B::-}(1)) in #t40;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.strong.transformed.expect
index 5675288..62bd534 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.strong.transformed.expect
@@ -54,6 +54,6 @@
     self::B v7 = let final self::Test #t38 = t in let final dynamic #t39 = self::f<dynamic>() in let final self::B #t40 = #t38.{self::Test::[]}(#t39 as{TypeError} self::Index) in let final void #t41 = #t38.{self::Test::[]=}(#t39 as{TypeError} self::Index, #t40.{self::B::-}(1)) in #t40;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.expect
index d8df616..ed16eaa 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.expect
@@ -58,6 +58,6 @@
     dynamic v7 = let final dynamic #t27 = self::f<dynamic>() in let final dynamic #t28 = super.{self::Base::[]}(#t27) in let final dynamic #t29 = super.{self::Base::[]=}(#t27, #t28.-(1)) in #t28;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.transformed.expect
index d8df616..ed16eaa 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.transformed.expect
@@ -58,6 +58,6 @@
     dynamic v7 = let final dynamic #t27 = self::f<dynamic>() in let final dynamic #t28 = super.{self::Base::[]}(#t27) in let final dynamic #t29 = super.{self::Base::[]=}(#t27, #t28.-(1)) in #t28;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.outline.expect
index 421df3f..1d2a695 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.outline.expect
@@ -40,7 +40,7 @@
   method test() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.strong.expect
index 1b1837a..6b4c7fe 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.strong.expect
@@ -58,6 +58,6 @@
     self::B v7 = let final dynamic #t27 = self::f<dynamic>() in let final self::B #t28 = super.{self::Base::[]}(#t27 as{TypeError} self::Index) in let final void #t29 = super.{self::Base::[]=}(#t27 as{TypeError} self::Index, #t28.{self::B::-}(1)) in #t28;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.strong.transformed.expect
index 1b1837a..6b4c7fe 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.strong.transformed.expect
@@ -58,6 +58,6 @@
     self::B v7 = let final dynamic #t27 = self::f<dynamic>() in let final self::B #t28 = super.{self::Base::[]}(#t27 as{TypeError} self::Index) in let final void #t29 = super.{self::Base::[]=}(#t27 as{TypeError} self::Index, #t28.{self::B::-}(1)) in #t28;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.expect
index 80bc52f..ac3de09 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.expect
@@ -53,6 +53,6 @@
     dynamic v7 = let final dynamic #t27 = self::f<dynamic>() in let final dynamic #t28 = this.[](#t27) in let final dynamic #t29 = this.[]=(#t27, #t28.-(1)) in #t28;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.transformed.expect
index 80bc52f..ac3de09 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.transformed.expect
@@ -53,6 +53,6 @@
     dynamic v7 = let final dynamic #t27 = self::f<dynamic>() in let final dynamic #t28 = this.[](#t27) in let final dynamic #t29 = this.[]=(#t27, #t28.-(1)) in #t28;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.outline.expect
index ff1db0b..8286554 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.outline.expect
@@ -36,7 +36,7 @@
   method test() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.expect
index 781c625..81add7c 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.expect
@@ -53,6 +53,6 @@
     self::B v7 = let final dynamic #t27 = self::f<dynamic>() in let final self::B #t28 = this.{self::Test::[]}(#t27 as{TypeError} self::Index) in let final void #t29 = this.{self::Test::[]=}(#t27 as{TypeError} self::Index, #t28.{self::B::-}(1)) in #t28;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.transformed.expect
index 781c625..81add7c 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.transformed.expect
@@ -53,6 +53,6 @@
     self::B v7 = let final dynamic #t27 = self::f<dynamic>() in let final self::B #t28 = this.{self::Test::[]}(#t27 as{TypeError} self::Index) in let final void #t29 = this.{self::Test::[]=}(#t27 as{TypeError} self::Index, #t28.{self::B::-}(1)) in #t28;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.expect
index 3566c8f..e94bc2f 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.expect
@@ -25,7 +25,7 @@
     : super self::B::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   self::B local;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.transformed.expect
index 3566c8f..e94bc2f 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.transformed.expect
@@ -25,7 +25,7 @@
     : super self::B::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   self::B local;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.outline.expect
index e4b381c..7db001d 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.outline.expect
@@ -22,7 +22,7 @@
   synthetic constructor •() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.strong.expect
index 22bf885..917a5ff 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.strong.expect
@@ -25,7 +25,7 @@
     : super self::B::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   self::B local;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.strong.transformed.expect
index 22bf885..917a5ff 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.strong.transformed.expect
@@ -25,7 +25,7 @@
     : super self::B::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   self::B local;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.expect
index 8dd8737..519248d 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.expect
@@ -46,6 +46,6 @@
     dynamic v7 = let final dynamic #t12 = t in let final dynamic #t13 = #t12.member in let final dynamic #t14 = #t12.member = #t13.-(1) in #t13;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.transformed.expect
index 8dd8737..519248d 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.transformed.expect
@@ -46,6 +46,6 @@
     dynamic v7 = let final dynamic #t12 = t in let final dynamic #t13 = #t12.member in let final dynamic #t14 = #t12.member = #t13.-(1) in #t13;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.outline.expect
index de60c09..c483408 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.outline.expect
@@ -29,7 +29,7 @@
   static method test(self::Test t) → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.strong.expect
index 69aa5fc..84dd210 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.strong.expect
@@ -46,6 +46,6 @@
     self::B v7 = let final self::Test #t12 = t in let final self::B #t13 = #t12.{self::Test::member} in let final self::B #t14 = #t12.{self::Test::member} = #t13.{self::B::-}(1) in #t13;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.strong.transformed.expect
index 69aa5fc..84dd210 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.strong.transformed.expect
@@ -46,6 +46,6 @@
     self::B v7 = let final self::Test #t12 = t in let final self::B #t13 = #t12.{self::Test::member} in let final self::B #t14 = #t12.{self::Test::member} = #t13.{self::B::-}(1) in #t13;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.expect
index 94d0d64..5513712 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.expect
@@ -46,6 +46,6 @@
     dynamic v7 = let final dynamic #t14 = t in #t14.==(null) ? null : let final dynamic #t15 = #t14.member in let final dynamic #t16 = #t14.member = #t15.-(1) in #t15;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.transformed.expect
index 94d0d64..5513712 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.transformed.expect
@@ -46,6 +46,6 @@
     dynamic v7 = let final dynamic #t14 = t in #t14.==(null) ? null : let final dynamic #t15 = #t14.member in let final dynamic #t16 = #t14.member = #t15.-(1) in #t15;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.outline.expect
index de60c09..c483408 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.outline.expect
@@ -29,7 +29,7 @@
   static method test(self::Test t) → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.strong.expect
index 941a4b2..abecc5d 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.strong.expect
@@ -46,6 +46,6 @@
     self::B v7 = let final self::Test #t14 = t in #t14.==(null) ?{self::B} null : let final self::B #t15 = #t14.{self::Test::member} in let final self::B #t16 = #t14.{self::Test::member} = #t15.{self::B::-}(1) in #t15;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.strong.transformed.expect
index 941a4b2..abecc5d 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.strong.transformed.expect
@@ -46,6 +46,6 @@
     self::B v7 = let final self::Test #t14 = t in #t14.==(null) ?{self::B} null : let final self::B #t15 = #t14.{self::Test::member} in let final self::B #t16 = #t14.{self::Test::member} = #t15.{self::B::-}(1) in #t15;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.expect
index 9f3a3bf..a4ec9d8 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.expect
@@ -51,6 +51,6 @@
     dynamic v7 = let final dynamic #t2 = super.{self::Base::member} in let final dynamic #t3 = super.{self::Base::member} = #t2.-(1) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.transformed.expect
index 9f3a3bf..a4ec9d8 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.transformed.expect
@@ -51,6 +51,6 @@
     dynamic v7 = let final dynamic #t2 = super.{self::Base::member} in let final dynamic #t3 = super.{self::Base::member} = #t2.-(1) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.outline.expect
index 077e4d6..8aa62bc 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.outline.expect
@@ -33,7 +33,7 @@
   method test() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.strong.expect
index 65a0233..609bc691 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.strong.expect
@@ -51,6 +51,6 @@
     self::B v7 = let final self::B #t2 = super.{self::Base::member} in let final self::B #t3 = super.{self::Base::member} = #t2.{self::B::-}(1) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.strong.transformed.expect
index 65a0233..609bc691 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.strong.transformed.expect
@@ -51,6 +51,6 @@
     self::B v7 = let final self::B #t2 = super.{self::Base::member} in let final self::B #t3 = super.{self::Base::member} = #t2.{self::B::-}(1) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.expect
index f3c9f8d..02325a0 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.expect
@@ -27,7 +27,7 @@
     ;
 }
 static field self::B topLevelVariable;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test_topLevelVariable() → void {
   self::topLevelVariable = self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.transformed.expect
index f3c9f8d..02325a0 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.transformed.expect
@@ -27,7 +27,7 @@
     ;
 }
 static field self::B topLevelVariable;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test_topLevelVariable() → void {
   self::topLevelVariable = self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.outline.expect
index e348b03..dca7f38 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.outline.expect
@@ -24,7 +24,7 @@
     ;
 }
 static field self::B topLevelVariable;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method test_topLevelVariable() → void
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.strong.expect
index e66e6c8..5199214 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.strong.expect
@@ -27,7 +27,7 @@
     ;
 }
 static field self::B topLevelVariable;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test_topLevelVariable() → void {
   self::topLevelVariable = self::f<self::B>();
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.strong.transformed.expect
index e66e6c8..5199214 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.strong.transformed.expect
@@ -27,7 +27,7 @@
     ;
 }
 static field self::B topLevelVariable;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test_topLevelVariable() → void {
   self::topLevelVariable = self::f<self::B>();
diff --git a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.expect
index de0ee9c..d80578b 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<T extends core::Object> extends core::Object {
+abstract class A<T extends core::Object = dynamic> extends core::Object {
   field core::List<self::A::T> z = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.transformed.expect
index de0ee9c..d80578b 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<T extends core::Object> extends core::Object {
+abstract class A<T extends core::Object = dynamic> extends core::Object {
   field core::List<self::A::T> z = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.outline.expect
index 1d6e2bc..bb96bee 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<T extends core::Object> extends core::Object {
+abstract class A<T extends core::Object = dynamic> extends core::Object {
   field core::List<self::A::T> z;
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.strong.expect
index e1b8859..3139312 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<T extends core::Object> extends core::Object {
+abstract class A<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field core::List<self::A::T> z = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.strong.transformed.expect
index e1b8859..3139312 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<T extends core::Object> extends core::Object {
+abstract class A<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field core::List<self::A::T> z = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.expect
index 79ae48f..4b95c54 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(core::int a, {core::String b = null, self::C::m::T c = null}) → self::C::m::T
+  method m<T extends core::Object = dynamic>(core::int a, {core::String b = null, self::C::m::T c = null}) → self::C::m::T
     return null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.transformed.expect
index 79ae48f..4b95c54 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(core::int a, {core::String b = null, self::C::m::T c = null}) → self::C::m::T
+  method m<T extends core::Object = dynamic>(core::int a, {core::String b = null, self::C::m::T c = null}) → self::C::m::T
     return null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.strong.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.strong.expect
index 3e03634..bd07f13 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.strong.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(core::int a, {core::String b = null, self::C::m::T c = null}) → self::C::m::T
+  method m<T extends core::Object = dynamic>(core::int a, {core::String b = null, self::C::m::T c = null}) → self::C::m::T
     return null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.strong.transformed.expect
index 3e03634..bd07f13 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(core::int a, {core::String b = null, self::C::m::T c = null}) → self::C::m::T
+  method m<T extends core::Object = dynamic>(core::int a, {core::String b = null, self::C::m::T c = null}) → self::C::m::T
     return null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.expect
index b3f2fc0..2641064 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(core::int a, [self::C::m::T b = null]) → self::C::m::T
+  method m<T extends core::Object = dynamic>(core::int a, [self::C::m::T b = null]) → self::C::m::T
     return null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.transformed.expect
index b3f2fc0..2641064 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(core::int a, [self::C::m::T b = null]) → self::C::m::T
+  method m<T extends core::Object = dynamic>(core::int a, [self::C::m::T b = null]) → self::C::m::T
     return null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.strong.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.strong.expect
index 7f57027..58dcecf 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.strong.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(core::int a, [self::C::m::T b = null]) → self::C::m::T
+  method m<T extends core::Object = dynamic>(core::int a, [self::C::m::T b = null]) → self::C::m::T
     return null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.strong.transformed.expect
index 7f57027..58dcecf 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(core::int a, [self::C::m::T b = null]) → self::C::m::T
+  method m<T extends core::Object = dynamic>(core::int a, [self::C::m::T b = null]) → self::C::m::T
     return null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.expect
index c4ff57c..e4e7bd1 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(core::int a, [core::String b = null, self::C::m::T c = null]) → self::C::m::T
+  method m<T extends core::Object = dynamic>(core::int a, [core::String b = null, self::C::m::T c = null]) → self::C::m::T
     return null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.transformed.expect
index c4ff57c..e4e7bd1 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(core::int a, [core::String b = null, self::C::m::T c = null]) → self::C::m::T
+  method m<T extends core::Object = dynamic>(core::int a, [core::String b = null, self::C::m::T c = null]) → self::C::m::T
     return null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.strong.expect
index 4b84fa0..10a9999 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.strong.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(core::int a, [core::String b = null, self::C::m::T c = null]) → self::C::m::T
+  method m<T extends core::Object = dynamic>(core::int a, [core::String b = null, self::C::m::T c = null]) → self::C::m::T
     return null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.strong.transformed.expect
index 4b84fa0..10a9999 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(core::int a, [core::String b = null, self::C::m::T c = null]) → self::C::m::T
+  method m<T extends core::Object = dynamic>(core::int a, [core::String b = null, self::C::m::T c = null]) → self::C::m::T
     return null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.expect
index c9998b1..bfa9057 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
     return x;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.transformed.expect
index c9998b1..bfa9057 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
     return x;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.strong.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.strong.expect
index 1d672d3..da75fda 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.strong.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
     return x;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.strong.transformed.expect
index 1d672d3..da75fda 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method m<T extends core::Object>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
     return x;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.direct.expect b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.direct.expect
index 3ae0ee0..3fc4e1c 100644
--- a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.direct.expect
@@ -12,7 +12,7 @@
     : super self::Resource::•()
     ;
 }
-class Foo<T extends core::Object> extends core::Object {
+class Foo<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::Foo::T t) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.direct.transformed.expect
index 3ae0ee0..3fc4e1c 100644
--- a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.direct.transformed.expect
@@ -12,7 +12,7 @@
     : super self::Resource::•()
     ;
 }
-class Foo<T extends core::Object> extends core::Object {
+class Foo<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::Foo::T t) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.strong.expect b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.strong.expect
index 61a99de..517d849 100644
--- a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.strong.expect
@@ -12,7 +12,7 @@
     : super self::Resource::•()
     ;
 }
-class Foo<T extends core::Object> extends core::Object {
+class Foo<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::Foo::T t) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.strong.transformed.expect
index 61a99de..517d849 100644
--- a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.strong.transformed.expect
@@ -12,7 +12,7 @@
     : super self::Resource::•()
     ;
 }
-class Foo<T extends core::Object> extends core::Object {
+class Foo<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::Foo::T t) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.expect b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.expect
index cb7e421..d4ee51b 100644
--- a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.expect
@@ -15,7 +15,7 @@
     ;
   abstract method x(() → dynamic value) → void;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method g(self::B b) → dynamic {
   b.x(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.transformed.expect
index cb7e421..d4ee51b 100644
--- a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.transformed.expect
@@ -15,7 +15,7 @@
     ;
   abstract method x(() → dynamic value) → void;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method g(self::B b) → dynamic {
   b.x(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.outline.expect b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.outline.expect
index 00d3cbe..4ee1701 100644
--- a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.outline.expect
@@ -13,7 +13,7 @@
     ;
   abstract method x(() → dynamic value) → void;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method g(self::B b) → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.strong.expect b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.strong.expect
index f0e5701..dd7fcd8 100644
--- a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.strong.expect
@@ -15,7 +15,7 @@
     ;
   abstract method x(() → dynamic value) → void;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method g(self::B b) → dynamic {
   b.{self::B::x}(self::f<() → dynamic>());
diff --git a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.strong.transformed.expect
index f0e5701..dd7fcd8 100644
--- a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.strong.transformed.expect
@@ -15,7 +15,7 @@
     ;
   abstract method x(() → dynamic value) → void;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method g(self::B b) → dynamic {
   b.{self::B::x}(self::f<() → dynamic>());
diff --git a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.expect b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.expect
index d15047a..ddb9de6 100644
--- a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.expect
@@ -15,7 +15,7 @@
     ;
   abstract set x(() → dynamic value) → void;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method g(self::B b) → dynamic {
   b.x = self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.transformed.expect
index d15047a..ddb9de6 100644
--- a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.transformed.expect
@@ -15,7 +15,7 @@
     ;
   abstract set x(() → dynamic value) → void;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method g(self::B b) → dynamic {
   b.x = self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.outline.expect b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.outline.expect
index f550eb1..e8bf885 100644
--- a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.outline.expect
@@ -13,7 +13,7 @@
     ;
   abstract set x(() → dynamic value) → void;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method g(self::B b) → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.strong.expect b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.strong.expect
index dafd372..d9e3fdf 100644
--- a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.strong.expect
@@ -15,7 +15,7 @@
     ;
   abstract set x(() → dynamic value) → void;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method g(self::B b) → dynamic {
   b.{self::B::x} = self::f<() → dynamic>();
diff --git a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.strong.transformed.expect
index dafd372..d9e3fdf 100644
--- a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.strong.transformed.expect
@@ -15,7 +15,7 @@
     ;
   abstract set x(() → dynamic value) → void;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method g(self::B b) → dynamic {
   b.{self::B::x} = self::f<() → dynamic>();
diff --git a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.direct.expect
index 7e9227c..0964033 100644
--- a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic x = throw self::f<dynamic>();
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method g() → void {
   dynamic x = throw self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.direct.transformed.expect
index 7e9227c..0964033 100644
--- a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic x = throw self::f<dynamic>();
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method g() → void {
   dynamic x = throw self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.outline.expect
index 8e0e7e2..61ee50c 100644
--- a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic x;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method g() → void
   ;
diff --git a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.strong.expect
index 7e9227c..0964033 100644
--- a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic x = throw self::f<dynamic>();
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method g() → void {
   dynamic x = throw self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.strong.transformed.expect
index 7e9227c..0964033 100644
--- a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic x = throw self::f<dynamic>();
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method g() → void {
   dynamic x = throw self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.expect
index cb1b1b6..10fb95d 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   final field self::A::T x = null;
   final field self::A::T w = null;
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.transformed.expect
index cb1b1b6..10fb95d 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   final field self::A::T x = null;
   final field self::A::T w = null;
   synthetic constructor •() → void
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 f6f271d..680dc9c 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
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   final field self::A::T x = null;
   final field self::A::T w = null;
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
index b41ed11..cecd7ae 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   final field self::A::T x = null;
   final field self::A::T w = null;
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.expect
index 3aa3a9c..b834ab4 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   field self::A::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object> extends self::A<self::B::E> {
+class B<E extends core::Object = dynamic> extends self::A<self::B::E> {
   field self::B::E y = null;
   synthetic constructor •() → void
     : super self::A::•()
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.transformed.expect
index 3aa3a9c..b834ab4 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   field self::A::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object> extends self::A<self::B::E> {
+class B<E extends core::Object = dynamic> extends self::A<self::B::E> {
   field self::B::E y = null;
   synthetic constructor •() → void
     : super self::A::•()
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 870f4ed..df2a21a 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
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::A::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object> extends self::A<self::B::E> {
+class B<E extends core::Object = dynamic> extends self::A<self::B::E> {
   generic-covariant-impl generic-covariant-interface field self::B::E y = null;
   synthetic constructor •() → void
     : super self::A::•()
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect
index 30e1bb6..06e2b22 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::A::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object> extends self::A<self::B::E> {
+class B<E extends core::Object = dynamic> extends self::A<self::B::E> {
   generic-covariant-impl generic-covariant-interface field self::B::E y = null;
   synthetic constructor •() → void
     : super self::A::•()
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.expect
index b9909f6..d3df882 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I<E extends core::Object> extends core::Object {
+abstract class I<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method m(dynamic a, (dynamic, self::I::E) → core::String f) → core::String;
 }
-abstract class A<E extends core::Object> extends core::Object implements self::I<self::A::E> {
+abstract class A<E extends core::Object = dynamic> extends core::Object implements self::I<self::A::E> {
   const constructor •() → void
     : super core::Object::•()
     ;
@@ -20,7 +20,7 @@
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object> extends self::A<self::B::E> implements self::M {
+class B<E extends core::Object = dynamic> extends self::A<self::B::E> implements self::M {
   const constructor •() → void
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.transformed.expect
index b9909f6..d3df882 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I<E extends core::Object> extends core::Object {
+abstract class I<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method m(dynamic a, (dynamic, self::I::E) → core::String f) → core::String;
 }
-abstract class A<E extends core::Object> extends core::Object implements self::I<self::A::E> {
+abstract class A<E extends core::Object = dynamic> extends core::Object implements self::I<self::A::E> {
   const constructor •() → void
     : super core::Object::•()
     ;
@@ -20,7 +20,7 @@
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object> extends self::A<self::B::E> implements self::M {
+class B<E extends core::Object = dynamic> extends self::A<self::B::E> implements self::M {
   const constructor •() → void
     : super self::A::•()
     ;
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 7c59a35..8bd9cd0 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
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I<E extends core::Object> extends core::Object {
+abstract class I<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method m(dynamic a, (dynamic, self::I::E) → core::String f) → core::String;
 }
-abstract class A<E extends core::Object> extends core::Object implements self::I<self::A::E> {
+abstract class A<E extends core::Object = dynamic> extends core::Object implements self::I<self::A::E> {
   const constructor •() → void
     : super core::Object::•()
     ;
@@ -20,7 +20,7 @@
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object> extends self::A<self::B::E> implements self::M {
+class B<E extends core::Object = dynamic> extends self::A<self::B::E> implements self::M {
   const constructor •() → void
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect
index 9d7b98a..5c0657a 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I<E extends core::Object> extends core::Object {
+abstract class I<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method m(dynamic a, (dynamic, self::I::E) → core::String f) → core::String;
 }
-abstract class A<E extends core::Object> extends core::Object implements self::I<self::A::E> {
+abstract class A<E extends core::Object = dynamic> extends core::Object implements self::I<self::A::E> {
   const constructor •() → void
     : super core::Object::•()
     ;
@@ -20,7 +20,7 @@
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object> extends self::A<self::B::E> implements self::M {
+class B<E extends core::Object = dynamic> extends self::A<self::B::E> implements self::M {
   const constructor •() → void
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.expect
index 97f9b08..b9c1563 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "./infer_types_on_generic_instantiations_in_library_cycle_a.dart" as inf;
 
-abstract class A<E extends core::Object> extends core::Object implements inf::I<self::A::E> {
+abstract class A<E extends core::Object = dynamic> extends core::Object implements inf::I<self::A::E> {
   final field self::A::E value = null;
   const constructor •() → void
     : super core::Object::•()
@@ -15,7 +15,7 @@
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object> extends self::A<self::B::E> implements self::M {
+class B<E extends core::Object = dynamic> extends self::A<self::B::E> implements self::M {
   const constructor •() → void
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.transformed.expect
index 97f9b08..b9c1563 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "./infer_types_on_generic_instantiations_in_library_cycle_a.dart" as inf;
 
-abstract class A<E extends core::Object> extends core::Object implements inf::I<self::A::E> {
+abstract class A<E extends core::Object = dynamic> extends core::Object implements inf::I<self::A::E> {
   final field self::A::E value = null;
   const constructor •() → void
     : super core::Object::•()
@@ -15,7 +15,7 @@
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object> extends self::A<self::B::E> implements self::M {
+class B<E extends core::Object = dynamic> extends self::A<self::B::E> implements self::M {
   const constructor •() → void
     : super self::A::•()
     ;
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 33ef878..a3154f4 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "./infer_types_on_generic_instantiations_in_library_cycle_a.dart" as inf;
 
-abstract class A<E extends core::Object> extends core::Object implements inf::I<self::A::E> {
+abstract class A<E extends core::Object = dynamic> extends core::Object implements inf::I<self::A::E> {
   final field self::A::E value = null;
   const constructor •() → void
     : super core::Object::•()
@@ -15,7 +15,7 @@
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object> extends self::A<self::B::E> implements self::M {
+class B<E extends core::Object = dynamic> extends self::A<self::B::E> implements self::M {
   const constructor •() → void
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
index e7bb4e0..53741ec 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "./infer_types_on_generic_instantiations_in_library_cycle_a.dart" as inf;
 
-abstract class A<E extends core::Object> extends core::Object implements inf::I<self::A::E> {
+abstract class A<E extends core::Object = dynamic> extends core::Object implements inf::I<self::A::E> {
   final field self::A::E value = null;
   const constructor •() → void
     : super core::Object::•()
@@ -15,7 +15,7 @@
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object> extends self::A<self::B::E> implements self::M {
+class B<E extends core::Object = dynamic> extends self::A<self::B::E> implements self::M {
   const constructor •() → void
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.expect
index b26d0cb..83c90ce 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
 
-abstract class I<E extends core::Object> extends core::Object {
+abstract class I<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.transformed.expect
index b26d0cb..83c90ce 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
 
-abstract class I<E extends core::Object> extends core::Object {
+abstract class I<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
index b26d0cb..83c90ce 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
 
-abstract class I<E extends core::Object> extends core::Object {
+abstract class I<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect
index b26d0cb..83c90ce 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
 
-abstract class I<E extends core::Object> extends core::Object {
+abstract class I<E extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.expect
index f45b7c8..dafc844 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   final field self::A::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.transformed.expect
index f45b7c8..dafc844 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   final field self::A::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.strong.expect
index 032d625..615fcf8 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   final field self::A::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.expect
index d9c5ceb..4c5fd78 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class Bar<T extends core::Iterable<core::String>> extends core::Object {
+class Bar<T extends core::Iterable<core::String> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -18,7 +18,7 @@
     }
   }
 }
-class Baz<T extends core::Object, E extends core::Iterable<self::Baz::T>, S extends self::Baz::E> extends core::Object {
+class Baz<T extends core::Object = dynamic, E extends core::Iterable<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.transformed.expect
index d9c5ceb..4c5fd78 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.transformed.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class Bar<T extends core::Iterable<core::String>> extends core::Object {
+class Bar<T extends core::Iterable<core::String> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -18,7 +18,7 @@
     }
   }
 }
-class Baz<T extends core::Object, E extends core::Iterable<self::Baz::T>, S extends self::Baz::E> extends core::Object {
+class Baz<T extends core::Object = dynamic, E extends core::Iterable<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
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 e02a9c4..0b9e781 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
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class Bar<T extends core::Iterable<core::String>> extends core::Object {
+class Bar<T extends core::Iterable<core::String> = core::Iterable<core::String>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -21,7 +21,7 @@
     }
   }
 }
-class Baz<T extends core::Object, E extends core::Iterable<self::Baz::T>, S extends self::Baz::E> extends core::Object {
+class Baz<T extends core::Object = dynamic, E extends core::Iterable<self::Baz::T> = core::Iterable<dynamic>, S extends self::Baz::E = core::Iterable<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
index a4e6e95..2f136bc 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class Bar<T extends core::Iterable<core::String>> extends core::Object {
+class Bar<T extends core::Iterable<core::String> = core::Iterable<core::String>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -21,7 +21,7 @@
     }
   }
 }
-class Baz<T extends core::Object, E extends core::Iterable<self::Baz::T>, S extends self::Baz::E> extends core::Object {
+class Baz<T extends core::Object = dynamic, E extends core::Iterable<self::Baz::T> = core::Iterable<dynamic>, S extends self::Baz::E = core::Iterable<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.expect
index 6421db3..a243798 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.expect
@@ -9,7 +9,7 @@
     : super core::Object::•()
     ;
 }
-class Bar<T extends asy::Stream<core::String>> extends core::Object {
+class Bar<T extends asy::Stream<core::String> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -19,7 +19,7 @@
     }
   }
 }
-class Baz<T extends core::Object, E extends asy::Stream<self::Baz::T>, S extends self::Baz::E> extends core::Object {
+class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -30,8 +30,8 @@
     }
   }
 }
-abstract class MyStream<T extends core::Object> extends asy::Stream<self::MyStream::T> {
-  static factory •<T extends core::Object>() → self::MyStream<self::MyStream::•::T>
+abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
+  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
     return null;
 }
 static method test() → dynamic async {
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
index bfda42e..f8f99d3 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
@@ -9,7 +9,7 @@
     : super core::Object::•()
     ;
 }
-class Bar<T extends asy::Stream<core::String>> extends core::Object {
+class Bar<T extends asy::Stream<core::String> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -64,7 +64,7 @@
     return :completer.{asy::Completer::future};
   }
 }
-class Baz<T extends core::Object, E extends asy::Stream<self::Baz::T>, S extends self::Baz::E> extends core::Object {
+class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -120,8 +120,8 @@
     return :completer.{asy::Completer::future};
   }
 }
-abstract class MyStream<T extends core::Object> extends asy::Stream<self::MyStream::T> {
-  static factory •<T extends core::Object>() → self::MyStream<self::MyStream::•::T>
+abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
+  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
     return null;
 }
 static method test() → dynamic /* originally async */ {
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
index 0abefd8..312b175 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
@@ -8,20 +8,20 @@
   synthetic constructor •() → void
     ;
 }
-class Bar<T extends asy::Stream<core::String>> extends core::Object {
+class Bar<T extends asy::Stream<core::String> = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method foo(self::Bar::T t) → dynamic
     ;
 }
-class Baz<T extends core::Object, E extends asy::Stream<self::Baz::T>, S extends self::Baz::E> extends core::Object {
+class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method foo(self::Baz::S t) → dynamic
     ;
 }
-abstract class MyStream<T extends core::Object> extends asy::Stream<self::MyStream::T> {
-  static factory •<T extends core::Object>() → self::MyStream<self::MyStream::•::T>
+abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
+  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
     ;
 }
 static method test() → dynamic
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 98d998a..43e0fad 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
@@ -9,7 +9,7 @@
     : super core::Object::•()
     ;
 }
-class Bar<T extends asy::Stream<core::String>> extends core::Object {
+class Bar<T extends asy::Stream<core::String> = asy::Stream<core::String>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -22,7 +22,7 @@
     }
   }
 }
-class Baz<T extends core::Object, E extends asy::Stream<self::Baz::T>, S extends self::Baz::E> extends core::Object {
+class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = asy::Stream<dynamic>, S extends self::Baz::E = asy::Stream<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -36,8 +36,8 @@
     }
   }
 }
-abstract class MyStream<T extends core::Object> extends asy::Stream<self::MyStream::T> {
-  static factory •<T extends core::Object>() → self::MyStream<self::MyStream::•::T>
+abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
+  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
     return null;
 }
 static method test() → dynamic async {
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
index cf338e2..bb29f89 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
     : super core::Object::•()
     ;
 }
-class Bar<T extends asy::Stream<core::String>> extends core::Object {
+class Bar<T extends asy::Stream<core::String> = asy::Stream<core::String>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -67,7 +67,7 @@
     return :completer.{asy::Completer::future};
   }
 }
-class Baz<T extends core::Object, E extends asy::Stream<self::Baz::T>, S extends self::Baz::E> extends core::Object {
+class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = asy::Stream<dynamic>, S extends self::Baz::E = asy::Stream<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -126,8 +126,8 @@
     return :completer.{asy::Completer::future};
   }
 }
-abstract class MyStream<T extends core::Object> extends asy::Stream<self::MyStream::T> {
-  static factory •<T extends core::Object>() → self::MyStream<self::MyStream::•::T>
+abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
+  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
     return null;
 }
 static method test() → dynamic /* originally async */ {
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.direct.expect
index ab7a925..b9fa6d2 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.direct.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = () → T;
+typedef F<T extends core::Object = dynamic> = () → T;
 static final field dynamic x = <core::String, () → core::int>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.direct.transformed.expect
index ab7a925..b9fa6d2 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.direct.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = () → T;
+typedef F<T extends core::Object = dynamic> = () → T;
 static final field dynamic x = <core::String, () → core::int>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.strong.expect
index 017095d..40eb28c 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.strong.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = () → T;
+typedef F<T extends core::Object = dynamic> = () → T;
 static final field core::Map<core::String, () → core::int> x = <core::String, () → core::int>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.strong.transformed.expect
index 017095d..40eb28c 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.strong.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = () → T;
+typedef F<T extends core::Object = dynamic> = () → T;
 static final field core::Map<core::String, () → core::int> x = <core::String, () → core::int>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.expect
index 9a8589f..eb85185 100644
--- a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B<core::List<self::A::T>> b) → void
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.transformed.expect
index 9a8589f..eb85185 100644
--- a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B<core::List<self::A::T>> b) → void
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.outline.expect
index 91dce6c..fdd5f51 100644
--- a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B<core::List<self::A::T>> b) → void
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.strong.expect
index 65851c3..c5b34ab 100644
--- a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B<core::List<self::A::T>> b) → void
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.strong.transformed.expect
index 65851c3..c5b34ab 100644
--- a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B<core::List<self::A::T>> b) → void
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.expect
index 7464b33..003db25 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.expect
@@ -6,9 +6,9 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(self::C::f::T x) → self::C::f::T
+  method f<T extends core::Object = dynamic>(self::C::f::T x) → self::C::f::T
     return x;
-  static method g<T extends core::Object>(self::C::g::T x) → self::C::g::T
+  static method g<T extends core::Object = dynamic>(self::C::g::T x) → self::C::g::T
     return x;
 }
 class D extends self::C {
@@ -20,10 +20,10 @@
     func = super.{self::C::f};
   }
 }
-static method f<T extends core::Object>(self::f::T x) → self::f::T
+static method f<T extends core::Object = dynamic>(self::f::T x) → self::f::T
   return x;
 static method test() → void {
-  function h<T extends core::Object>(T x) → T
+  function h<T extends core::Object = dynamic>(T x) → T
     return x;
   (core::int) → core::int func;
   func = self::f;
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.transformed.expect
index 7464b33..003db25 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.transformed.expect
@@ -6,9 +6,9 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(self::C::f::T x) → self::C::f::T
+  method f<T extends core::Object = dynamic>(self::C::f::T x) → self::C::f::T
     return x;
-  static method g<T extends core::Object>(self::C::g::T x) → self::C::g::T
+  static method g<T extends core::Object = dynamic>(self::C::g::T x) → self::C::g::T
     return x;
 }
 class D extends self::C {
@@ -20,10 +20,10 @@
     func = super.{self::C::f};
   }
 }
-static method f<T extends core::Object>(self::f::T x) → self::f::T
+static method f<T extends core::Object = dynamic>(self::f::T x) → self::f::T
   return x;
 static method test() → void {
-  function h<T extends core::Object>(T x) → T
+  function h<T extends core::Object = dynamic>(T x) → T
     return x;
   (core::int) → core::int func;
   func = self::f;
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.outline.expect
index cac8ab3..425d634 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.outline.expect
@@ -5,9 +5,9 @@
 class C extends core::Object {
   synthetic constructor •() → void
     ;
-  method f<T extends core::Object>(self::C::f::T x) → self::C::f::T
+  method f<T extends core::Object = dynamic>(self::C::f::T x) → self::C::f::T
     ;
-  static method g<T extends core::Object>(self::C::g::T x) → self::C::g::T
+  static method g<T extends core::Object = dynamic>(self::C::g::T x) → self::C::g::T
     ;
 }
 class D extends self::C {
@@ -16,7 +16,7 @@
   method test() → void
     ;
 }
-static method f<T extends core::Object>(self::f::T x) → self::f::T
+static method f<T extends core::Object = dynamic>(self::f::T x) → self::f::T
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.expect
index 24d056a..5f9428d 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.expect
@@ -6,9 +6,9 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(self::C::f::T x) → self::C::f::T
+  method f<T extends core::Object = dynamic>(self::C::f::T x) → self::C::f::T
     return x;
-  static method g<T extends core::Object>(self::C::g::T x) → self::C::g::T
+  static method g<T extends core::Object = dynamic>(self::C::g::T x) → self::C::g::T
     return x;
 }
 class D extends self::C {
@@ -20,10 +20,10 @@
     func = super.{self::C::f}<core::int>;
   }
 }
-static method f<T extends core::Object>(self::f::T x) → self::f::T
+static method f<T extends core::Object = dynamic>(self::f::T x) → self::f::T
   return x;
 static method test() → void {
-  function h<T extends core::Object>(T x) → T
+  function h<T extends core::Object = dynamic>(T x) → T
     return x;
   (core::int) → core::int func;
   func = self::f<core::int>;
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.transformed.expect
index 24d056a..5f9428d 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.transformed.expect
@@ -6,9 +6,9 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(self::C::f::T x) → self::C::f::T
+  method f<T extends core::Object = dynamic>(self::C::f::T x) → self::C::f::T
     return x;
-  static method g<T extends core::Object>(self::C::g::T x) → self::C::g::T
+  static method g<T extends core::Object = dynamic>(self::C::g::T x) → self::C::g::T
     return x;
 }
 class D extends self::C {
@@ -20,10 +20,10 @@
     func = super.{self::C::f}<core::int>;
   }
 }
-static method f<T extends core::Object>(self::f::T x) → self::f::T
+static method f<T extends core::Object = dynamic>(self::f::T x) → self::f::T
   return x;
 static method test() → void {
-  function h<T extends core::Object>(T x) → T
+  function h<T extends core::Object = dynamic>(T x) → T
     return x;
   (core::int) → core::int func;
   func = self::f<core::int>;
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.expect
index 407abc7..254d3c1 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends core::Object>(self::C::f::U x) → (self::C::T) → void
+  method f<U extends core::Object = dynamic>(self::C::f::U x) → (self::C::T) → void
     return (dynamic y) → dynamic {};
 }
 static method test(self::C<core::String> c) → void {
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.transformed.expect
index 407abc7..254d3c1 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends core::Object>(self::C::f::U x) → (self::C::T) → void
+  method f<U extends core::Object = dynamic>(self::C::f::U x) → (self::C::T) → void
     return (dynamic y) → dynamic {};
 }
 static method test(self::C<core::String> c) → void {
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.outline.expect
index 743f43f..2ec6364 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
-  method f<U extends core::Object>(self::C::f::U x) → (self::C::T) → void
+  method f<U extends core::Object = dynamic>(self::C::f::U x) → (self::C::T) → void
     ;
 }
 static method test(self::C<core::String> c) → void
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
index 5dc12db..e3ccda9 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends core::Object>(self::C::f::U x) → (self::C::T) → void
+  method f<U extends core::Object = dynamic>(self::C::f::U x) → (self::C::T) → void
     return (self::C::T y) → core::Null {};
 }
 static method test(self::C<core::String> c) → void {
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
index 5dc12db..e3ccda9 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends core::Object>(self::C::f::U x) → (self::C::T) → void
+  method f<U extends core::Object = dynamic>(self::C::f::U x) → (self::C::T) → void
     return (self::C::T y) → core::Null {};
 }
 static method test(self::C<core::String> c) → void {
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.direct.expect
index 258ba0e..59e7aab 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method test(<T extends core::Object>(T) → T f) → void {
+static method test(<T extends core::Object = dynamic>(T) → T f) → void {
   (core::int) → core::int func;
   func = f.call;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.direct.transformed.expect
index 258ba0e..59e7aab 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method test(<T extends core::Object>(T) → T f) → void {
+static method test(<T extends core::Object = dynamic>(T) → T f) → void {
   (core::int) → core::int func;
   func = f.call;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.outline.expect
index 65e10ba..30f8885 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method test(<T extends core::Object>(T) → T f) → void
+static method test(<T extends core::Object = dynamic>(T) → T f) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.expect
index ac05240..e7c62a1 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.expect
@@ -2,12 +2,12 @@
 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<dynamic> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class A<T extends core::int> extends core::Object {
+class A<T extends core::int = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.transformed.expect
index ac05240..e7c62a1 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 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<dynamic> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class A<T extends core::int> extends core::Object {
+class A<T extends core::int = dynamic> extends core::Object {
   synthetic constructor •() → void
     : 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 1675d51..57b9777 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,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends self::A<core::int>> extends core::Object {
+class B<T extends self::A<core::int> = self::A<core::int>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class A<T extends core::int> extends core::Object {
+class A<T extends core::int = core::int> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.strong.transformed.expect
index 1675d51..57b9777 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends self::A<core::int>> extends core::Object {
+class B<T extends self::A<core::int> = self::A<core::int>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class A<T extends core::int> extends core::Object {
+class A<T extends core::int = core::int> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.expect
index a8450dd..38b7a42 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int> extends core::Object {
+class A<T extends core::int = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic>> extends core::Object {
+class B<T extends self::A<dynamic> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.transformed.expect
index a8450dd..38b7a42 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int> extends core::Object {
+class A<T extends core::int = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic>> extends core::Object {
+class B<T extends self::A<dynamic> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
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 c47d4b1..42ff84b 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
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int> extends core::Object {
+class A<T extends core::int = core::int> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<core::int>> extends core::Object {
+class B<T extends self::A<core::int> = self::A<core::int>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.strong.transformed.expect
index c47d4b1..42ff84b 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int> extends core::Object {
+class A<T extends core::int = core::int> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<core::int>> extends core::Object {
+class B<T extends self::A<core::int> = self::A<core::int>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.expect
index d39e0fe..dfb57c4 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic>> extends core::Object {
+class B<T extends self::A<dynamic> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.transformed.expect
index d39e0fe..dfb57c4 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic>> extends core::Object {
+class B<T extends self::A<dynamic> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
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 1b49427..ad11219 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
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic>> extends core::Object {
+class B<T extends self::A<dynamic> = self::A<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.strong.transformed.expect
index 1b49427..ad11219 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic>> extends core::Object {
+class B<T extends self::A<dynamic> = self::A<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.expect
index c31aed4..d78301f 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int> extends core::Object {
+class A<T extends core::int = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.transformed.expect
index c31aed4..d78301f 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int> extends core::Object {
+class A<T extends core::int = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
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 250e9df..006a1e5 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
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int> extends core::Object {
+class A<T extends core::int = core::int> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.strong.transformed.expect
index 250e9df..006a1e5 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int> extends core::Object {
+class A<T extends core::int = core::int> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.expect
index c31aed4..d78301f 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int> extends core::Object {
+class A<T extends core::int = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.transformed.expect
index c31aed4..d78301f 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int> extends core::Object {
+class A<T extends core::int = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
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 250e9df..006a1e5 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
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int> extends core::Object {
+class A<T extends core::int = core::int> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.strong.transformed.expect
index 250e9df..006a1e5 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int> extends core::Object {
+class A<T extends core::int = core::int> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.expect
index ab2d9ba..cbe8ecd 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.transformed.expect
index ab2d9ba..cbe8ecd 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.expect
index 8e3e3d3..ab4b6a5 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.transformed.expect
index 8e3e3d3..ab4b6a5 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.expect
index e062f16..83feed9 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.transformed.expect
index e062f16..83feed9 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.strong.expect
index 75d4b70..9efc5a7 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.strong.transformed.expect
index 75d4b70..9efc5a7 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.expect
index 3a30a80..b4bf7c0 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class B<T extends self::A> extends core::Object {
+class B<T extends self::A = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.transformed.expect
index 3a30a80..b4bf7c0 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class B<T extends self::A> extends core::Object {
+class B<T extends self::A = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
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 7ac3b90d..e97dd63 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
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class B<T extends self::A> extends core::Object {
+class B<T extends self::A = self::A> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.strong.transformed.expect
index 7ac3b90d..e97dd63 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class B<T extends self::A> extends core::Object {
+class B<T extends self::A = self::A> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.expect b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.expect
index d80777c..5513c11 100644
--- a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t;
   constructor •(self::C::T t) → void
     : self::C::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.transformed.expect
index d80777c..5513c11 100644
--- a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t;
   constructor •(self::C::T t) → void
     : self::C::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.outline.expect b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.outline.expect
index 55cf657..883eda4 100644
--- a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t;
   constructor •(self::C::T t) → void
     ;
diff --git a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.strong.expect b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.strong.expect
index 55e11e2..68853a4 100644
--- a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T t;
   constructor •(self::C::T t) → void
     : self::C::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.strong.transformed.expect
index 55e11e2..68853a4 100644
--- a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T t;
   constructor •(self::C::T t) → void
     : self::C::t = t, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.expect
index 0d4c4d9..faa9af9 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.expect
@@ -6,10 +6,10 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>() → self::D<self::C::f::T>
+  method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
     return null;
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.transformed.expect
index 0d4c4d9..faa9af9 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.transformed.expect
@@ -6,10 +6,10 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>() → self::D<self::C::f::T>
+  method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
     return null;
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.strong.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.strong.expect
index 28b0bd9..100098d 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.strong.expect
@@ -6,10 +6,10 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>() → self::D<self::C::f::T>
+  method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
     return null;
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.strong.transformed.expect
index 28b0bd9..100098d 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.strong.transformed.expect
@@ -6,10 +6,10 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>() → self::D<self::C::f::T>
+  method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
     return null;
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.expect
index 2409e0e2..9812401 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.expect
@@ -6,10 +6,10 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>() → self::D<self::C::f::T>
+  method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
     return null;
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.transformed.expect
index 2409e0e2..9812401 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.transformed.expect
@@ -6,10 +6,10 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>() → self::D<self::C::f::T>
+  method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
     return null;
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.strong.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.strong.expect
index e7701fd..03106b1 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.strong.expect
@@ -6,10 +6,10 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>() → self::D<self::C::f::T>
+  method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
     return null;
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.strong.transformed.expect
index e7701fd..03106b1 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.strong.transformed.expect
@@ -6,10 +6,10 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>() → self::D<self::C::f::T>
+  method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
     return null;
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.expect
index f986cdf..ed2b11c 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.expect
@@ -6,10 +6,10 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  static method f<T extends core::Object>() → self::D<self::C::f::T>
+  static method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
     return null;
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.transformed.expect
index f986cdf..ed2b11c 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.transformed.expect
@@ -6,10 +6,10 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  static method f<T extends core::Object>() → self::D<self::C::f::T>
+  static method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
     return null;
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.strong.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.strong.expect
index 5a6e1b5..62f476b 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.strong.expect
@@ -6,10 +6,10 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  static method f<T extends core::Object>() → self::D<self::C::f::T>
+  static method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
     return null;
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.strong.transformed.expect
index 5a6e1b5..62f476b 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.strong.transformed.expect
@@ -6,10 +6,10 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  static method f<T extends core::Object>() → self::D<self::C::f::T>
+  static method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
     return null;
 }
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.expect
index 9b0f603..eb7c958 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
 static field dynamic g = self::f<core::int>();
-static method f<T extends core::Object>() → self::D<self::f::T>
+static method f<T extends core::Object = dynamic>() → self::D<self::f::T>
   return null;
 static method main() → dynamic {
   self::g;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.transformed.expect
index 9b0f603..eb7c958 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
 static field dynamic g = self::f<core::int>();
-static method f<T extends core::Object>() → self::D<self::f::T>
+static method f<T extends core::Object = dynamic>() → self::D<self::f::T>
   return null;
 static method main() → dynamic {
   self::g;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.strong.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.strong.expect
index 711c11f..ede5169 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.strong.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
 static field self::D<core::int> g = self::f<core::int>();
-static method f<T extends core::Object>() → self::D<self::f::T>
+static method f<T extends core::Object = dynamic>() → self::D<self::f::T>
   return null;
 static method main() → dynamic {
   self::g;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.strong.transformed.expect
index 711c11f..ede5169 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
 static field self::D<core::int> g = self::f<core::int>();
-static method f<T extends core::Object>() → self::D<self::f::T>
+static method f<T extends core::Object = dynamic>() → self::D<self::f::T>
   return null;
 static method main() → dynamic {
   self::g;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.expect
index 5bb0107b..b56f103 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object, Y extends core::String> extends self::I<self::M0::X> {
+class M0<X extends core::Object = dynamic, Y extends core::String = dynamic> extends self::I<self::M0::X> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.transformed.expect
index babd076..985fb07 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object, Y extends core::String> extends self::I<self::M0::X> {
+class M0<X extends core::Object = dynamic, Y extends core::String = dynamic> extends self::I<self::M0::X> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect
index d2d243e..43c1de6 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class M0<X extends core::Object, Y extends core::String> extends self::I<self::M0::X> {
+class M0<X extends core::Object = dynamic, Y extends core::String = dynamic> extends self::I<self::M0::X> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.expect
index c88b202..46148e92 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object, Y extends core::String> extends self::I<self::M0::X> {
+class M0<X extends core::Object = dynamic, Y extends core::String = core::String> extends self::I<self::M0::X> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.transformed.expect
index 3dfcef8..149f1f7 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object, Y extends core::String> extends self::I<self::M0::X> {
+class M0<X extends core::Object = dynamic, Y extends core::String = core::String> extends self::I<self::M0::X> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.expect
index 99c0ac1..afaa901 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object, Y extends self::M0::X> extends self::I<self::M0::X> {
+class M0<X extends core::Object = dynamic, Y extends self::M0::X = dynamic> extends self::I<self::M0::X> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.transformed.expect
index 88b88c5..76f85c6 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object, Y extends self::M0::X> extends self::I<self::M0::X> {
+class M0<X extends core::Object = dynamic, Y extends self::M0::X = dynamic> extends self::I<self::M0::X> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.outline.expect
index b32af06..715d575 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class M0<X extends core::Object, Y extends self::M0::X> extends self::I<self::M0::X> {
+class M0<X extends core::Object = dynamic, Y extends self::M0::X = dynamic> extends self::I<self::M0::X> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.expect
index fc43a81..4df303d 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object, Y extends self::M0::X> extends self::I<self::M0::X> {
+class M0<X extends core::Object = dynamic, Y extends self::M0::X = dynamic> extends self::I<self::M0::X> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.transformed.expect
index db58674..49745bb 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object, Y extends self::M0::X> extends self::I<self::M0::X> {
+class M0<X extends core::Object = dynamic, Y extends self::M0::X = dynamic> extends self::I<self::M0::X> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.expect
index 1bf2b7f..8d308b9 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object, Y extends core::Comparable<self::M0::Y>> extends self::I<self::M0::X> {
+class M0<X extends core::Object = dynamic, Y extends core::Comparable<self::M0::Y> = dynamic> extends self::I<self::M0::X> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.transformed.expect
index af781d1..4b68fa6 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object, Y extends core::Comparable<self::M0::Y>> extends self::I<self::M0::X> {
+class M0<X extends core::Object = dynamic, Y extends core::Comparable<self::M0::Y> = dynamic> extends self::I<self::M0::X> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect
index 5a8614d..df1859b 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class M0<X extends core::Object, Y extends core::Comparable<self::M0::Y>> extends self::I<self::M0::X> {
+class M0<X extends core::Object = dynamic, Y extends core::Comparable<self::M0::Y> = dynamic> extends self::I<self::M0::X> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.expect
index 261aee6..661c0f5 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object, Y extends core::Comparable<self::M0::Y>> extends self::I<self::M0::X> {
+class M0<X extends core::Object = dynamic, Y extends core::Comparable<self::M0::Y> = core::Comparable<dynamic>> extends self::I<self::M0::X> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.transformed.expect
index c7f6535..b13c5c1 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object, Y extends core::Comparable<self::M0::Y>> extends self::I<self::M0::X> {
+class M0<X extends core::Object = dynamic, Y extends core::Comparable<self::M0::Y> = core::Comparable<dynamic>> extends self::I<self::M0::X> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.expect
index 732cded..b84a7e5e 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class J<X extends core::Object> extends core::Object {
+class J<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-abstract class _M0&I&J<X extends core::Object, Y extends core::Object> = self::I<self::_M0&I&J::X> with self::J<self::_M0&I&J::Y> {
+abstract class _M0&I&J<X extends core::Object = dynamic, Y extends core::Object = dynamic> = self::I<self::_M0&I&J::X> with self::J<self::_M0&I&J::Y> {
 }
-class M0<X extends core::Object, Y extends core::Object> extends self::_M0&I&J<self::M0::X, self::M0::Y> {
+class M0<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::_M0&I&J<self::M0::X, self::M0::Y> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.transformed.expect
index 6bd4312..2feb2bd 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.transformed.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class J<X extends core::Object> extends core::Object {
+class J<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-abstract class _M0&I&J<X extends core::Object, Y extends core::Object> extends self::I<self::_M0&I&J::X> implements self::J<self::_M0&I&J::Y> {
+abstract class _M0&I&J<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::I<self::_M0&I&J::X> implements self::J<self::_M0&I&J::Y> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M0<X extends core::Object, Y extends core::Object> extends self::_M0&I&J<self::M0::X, self::M0::Y> {
+class M0<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::_M0&I&J<self::M0::X, self::M0::Y> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.outline.expect
index 5d417f7..6ea16975 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.outline.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class J<X extends core::Object> extends core::Object {
+class J<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-abstract class _M0&I&J<X extends core::Object, Y extends core::Object> = self::I<self::_M0&I&J::X> with self::J<self::_M0&I&J::Y> {
+abstract class _M0&I&J<X extends core::Object = dynamic, Y extends core::Object = dynamic> = self::I<self::_M0&I&J::X> with self::J<self::_M0&I&J::Y> {
 }
-class M0<X extends core::Object, Y extends core::Object> extends self::_M0&I&J<self::M0::X, self::M0::Y> {
+class M0<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::_M0&I&J<self::M0::X, self::M0::Y> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.expect
index 92d614a..d395781 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class J<X extends core::Object> extends core::Object {
+class J<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-abstract class _M0&I&J<X extends core::Object, Y extends core::Object> = self::I<self::_M0&I&J::X> with self::J<self::_M0&I&J::Y> {
+abstract class _M0&I&J<X extends core::Object = dynamic, Y extends core::Object = dynamic> = self::I<self::_M0&I&J::X> with self::J<self::_M0&I&J::Y> {
 }
-class M0<X extends core::Object, Y extends core::Object> extends self::_M0&I&J<self::M0::X, self::M0::Y> {
+class M0<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::_M0&I&J<self::M0::X, self::M0::Y> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.transformed.expect
index b0a644f..9173943 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.transformed.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class J<X extends core::Object> extends core::Object {
+class J<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-abstract class _M0&I&J<X extends core::Object, Y extends core::Object> extends self::I<self::_M0&I&J::X> implements self::J<self::_M0&I&J::Y> {
+abstract class _M0&I&J<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::I<self::_M0&I&J::X> implements self::J<self::_M0&I&J::Y> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M0<X extends core::Object, Y extends core::Object> extends self::_M0&I&J<self::M0::X, self::M0::Y> {
+class M0<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::_M0&I&J<self::M0::X, self::M0::Y> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.expect
index ce175b8..5328a92 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends self::I<core::List<self::M0::T>> {
+class M0<T extends core::Object = dynamic> extends self::I<core::List<self::M0::T>> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<core::List<self::M1::T>> {
+class M1<T extends core::Object = dynamic> extends self::I<core::List<self::M1::T>> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M2<T extends core::Object> extends self::M1<core::Map<self::M2::T, self::M2::T>> {
+class M2<T extends core::Object = dynamic> extends self::M1<core::Map<self::M2::T, self::M2::T>> {
   synthetic constructor •() → void
     : super self::M1::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.transformed.expect
index 47d99df..bcf0add 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.transformed.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends self::I<core::List<self::M0::T>> {
+class M0<T extends core::Object = dynamic> extends self::I<core::List<self::M0::T>> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<core::List<self::M1::T>> {
+class M1<T extends core::Object = dynamic> extends self::I<core::List<self::M1::T>> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M2<T extends core::Object> extends self::M1<core::Map<self::M2::T, self::M2::T>> {
+class M2<T extends core::Object = dynamic> extends self::M1<core::Map<self::M2::T, self::M2::T>> {
   synthetic constructor •() → void
     : super self::M1::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.outline.expect
index a626b7e..e08bdb7 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.outline.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class M0<T extends core::Object> extends self::I<core::List<self::M0::T>> {
+class M0<T extends core::Object = dynamic> extends self::I<core::List<self::M0::T>> {
   synthetic constructor •() → void
     ;
 }
-class M1<T extends core::Object> extends self::I<core::List<self::M1::T>> {
+class M1<T extends core::Object = dynamic> extends self::I<core::List<self::M1::T>> {
   synthetic constructor •() → void
     ;
 }
-class M2<T extends core::Object> extends self::M1<core::Map<self::M2::T, self::M2::T>> {
+class M2<T extends core::Object = dynamic> extends self::M1<core::Map<self::M2::T, self::M2::T>> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.expect
index bc3f07d..83ed933 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends self::I<core::List<self::M0::T>> {
+class M0<T extends core::Object = dynamic> extends self::I<core::List<self::M0::T>> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<core::List<self::M1::T>> {
+class M1<T extends core::Object = dynamic> extends self::I<core::List<self::M1::T>> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M2<T extends core::Object> extends self::M1<core::Map<self::M2::T, self::M2::T>> {
+class M2<T extends core::Object = dynamic> extends self::M1<core::Map<self::M2::T, self::M2::T>> {
   synthetic constructor •() → void
     : super self::M1::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.transformed.expect
index bab9455..274d765 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.transformed.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends self::I<core::List<self::M0::T>> {
+class M0<T extends core::Object = dynamic> extends self::I<core::List<self::M0::T>> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<core::List<self::M1::T>> {
+class M1<T extends core::Object = dynamic> extends self::I<core::List<self::M1::T>> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M2<T extends core::Object> extends self::M1<core::Map<self::M2::T, self::M2::T>> {
+class M2<T extends core::Object = dynamic> extends self::M1<core::Map<self::M2::T, self::M2::T>> {
   synthetic constructor •() → void
     : super self::M1::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.expect
index 58630ac..99b8e77 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.transformed.expect
index 94e9c02..f099c87 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.outline.expect
index e7482bf..faaabfd 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.outline.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class M0<T extends core::Object> extends self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
   synthetic constructor •() → void
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.expect
index a21a809..2c2aa5c 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.transformed.expect
index f1c52e6..701b84c 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.expect
index 848a79e..708e099 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M2<T extends core::Object> extends self::I<self::M2::T> {
+class M2<T extends core::Object = dynamic> extends self::I<self::M2::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.transformed.expect
index 3988528..07fd39a 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.transformed.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M2<T extends core::Object> extends self::I<self::M2::T> {
+class M2<T extends core::Object = dynamic> extends self::I<self::M2::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.outline.expect
index acc4658..d20ff99 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.outline.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class M0<T extends core::Object> extends self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
   synthetic constructor •() → void
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     ;
 }
-class M2<T extends core::Object> extends self::I<self::M2::T> {
+class M2<T extends core::Object = dynamic> extends self::I<self::M2::T> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.expect
index 036d56c..cea7021 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M2<T extends core::Object> extends self::I<self::M2::T> {
+class M2<T extends core::Object = dynamic> extends self::I<self::M2::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.transformed.expect
index 42ec419..d8aadbfc 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.transformed.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
 }
-class M2<T extends core::Object> extends self::I<self::M2::T> {
+class M2<T extends core::Object = dynamic> extends self::I<self::M2::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.expect
index a9749fe..cf9d1f4 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends core::Object implements self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.transformed.expect
index e737000..53f5baf 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends core::Object implements self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
index f83992c..79c34df 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class M0<T extends core::Object> extends core::Object implements self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
   synthetic constructor •() → void
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
index a9749fe..cf9d1f4 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends core::Object implements self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.expect
index b341add..8d072fe 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends core::Object implements self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.transformed.expect
index 2b4d638..d6e5c6c 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends core::Object implements self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect
index 46f1868..9c4a906 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class M0<T extends core::Object> extends core::Object implements self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
   synthetic constructor •() → void
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect
index b341add..8d072fe 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends core::Object implements self::I<self::M0::T> {
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M1<T extends core::Object> extends self::I<self::M1::T> {
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
   synthetic constructor •() → void
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.expect
index f15969d..7268b70 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object, Y extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends core::Object implements self::I<self::M0::T, core::int> {
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::int> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M1<T extends core::Object> extends core::Object implements self::I<core::String, self::M1::T> {
+class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::String, self::M1::T> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.transformed.expect
index 1f32528..c6ca47c 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object, Y extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends core::Object implements self::I<self::M0::T, core::int> {
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::int> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M1<T extends core::Object> extends core::Object implements self::I<core::String, self::M1::T> {
+class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::String, self::M1::T> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
index 4e5c65c..558e05a 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object, Y extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class M0<T extends core::Object> extends core::Object implements self::I<self::M0::T, core::int> {
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::int> {
   synthetic constructor •() → void
     ;
 }
-class M1<T extends core::Object> extends core::Object implements self::I<core::String, self::M1::T> {
+class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::String, self::M1::T> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
index f15969d..7268b70 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object, Y extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends core::Object implements self::I<self::M0::T, core::int> {
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::int> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M1<T extends core::Object> extends core::Object implements self::I<core::String, self::M1::T> {
+class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::String, self::M1::T> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.expect
index 1cf79e6..9b8dd77 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object, Y extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends core::Object implements self::I<self::M0::T, core::List<self::M0::T>> {
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::List<self::M0::T>> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M1<T extends core::Object> extends core::Object implements self::I<core::List<self::M1::T>, self::M1::T> {
+class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::List<self::M1::T>, self::M1::T> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.transformed.expect
index 3819847..cc0d501 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object, Y extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends core::Object implements self::I<self::M0::T, core::List<self::M0::T>> {
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::List<self::M0::T>> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M1<T extends core::Object> extends core::Object implements self::I<core::List<self::M1::T>, self::M1::T> {
+class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::List<self::M1::T>, self::M1::T> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
index 82b7624..0486b4b 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object, Y extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class M0<T extends core::Object> extends core::Object implements self::I<self::M0::T, core::List<self::M0::T>> {
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::List<self::M0::T>> {
   synthetic constructor •() → void
     ;
 }
-class M1<T extends core::Object> extends core::Object implements self::I<core::List<self::M1::T>, self::M1::T> {
+class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::List<self::M1::T>, self::M1::T> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
index 1cf79e6..9b8dd77 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class I<X extends core::Object, Y extends core::Object> extends core::Object {
+class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object> extends core::Object implements self::I<self::M0::T, core::List<self::M0::T>> {
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::List<self::M0::T>> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class M1<T extends core::Object> extends core::Object implements self::I<core::List<self::M1::T>, self::M1::T> {
+class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::List<self::M1::T>, self::M1::T> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.expect
index a535f30..3526479 100644
--- a/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<U extends core::Object, V extends core::Object> = (U) → V;
-class Foo<T extends core::Object> extends core::Object {
+typedef F<U extends core::Object = dynamic, V extends core::Object = dynamic> = (U) → V;
+class Foo<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -26,7 +26,7 @@
   get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
     return <dynamic, dynamic>{};
 }
-class Bar<T extends core::Object> extends core::Object {
+class Bar<T extends core::Object = dynamic> extends core::Object {
   const constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.transformed.expect
index a535f30..3526479 100644
--- a/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<U extends core::Object, V extends core::Object> = (U) → V;
-class Foo<T extends core::Object> extends core::Object {
+typedef F<U extends core::Object = dynamic, V extends core::Object = dynamic> = (U) → V;
+class Foo<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -26,7 +26,7 @@
   get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
     return <dynamic, dynamic>{};
 }
-class Bar<T extends core::Object> extends core::Object {
+class Bar<T extends core::Object = dynamic> extends core::Object {
   const constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.outline.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.outline.expect
index 393359f..96fab41 100644
--- a/pkg/front_end/testcases/inference/non_const_invocation.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/non_const_invocation.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<U extends core::Object, V extends core::Object> = (U) → V;
-class Foo<T extends core::Object> extends core::Object {
+typedef F<U extends core::Object = dynamic, V extends core::Object = dynamic> = (U) → V;
+class Foo<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   get v1() → self::Bar<self::Foo::T>
@@ -25,7 +25,7 @@
   get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
     ;
 }
-class Bar<T extends core::Object> extends core::Object {
+class Bar<T extends core::Object = dynamic> extends core::Object {
   const constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.expect
index 2175864..b943f9f 100644
--- a/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<U extends core::Object, V extends core::Object> = (U) → V;
-class Foo<T extends core::Object> extends core::Object {
+typedef F<U extends core::Object = dynamic, V extends core::Object = dynamic> = (U) → V;
+class Foo<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -26,7 +26,7 @@
   get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
     return <self::Foo::T, (self::Foo::T) → self::Foo::T>{};
 }
-class Bar<T extends core::Object> extends core::Object {
+class Bar<T extends core::Object = dynamic> extends core::Object {
   const constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.transformed.expect
index 2175864..b943f9f 100644
--- a/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<U extends core::Object, V extends core::Object> = (U) → V;
-class Foo<T extends core::Object> extends core::Object {
+typedef F<U extends core::Object = dynamic, V extends core::Object = dynamic> = (U) → V;
+class Foo<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -26,7 +26,7 @@
   get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
     return <self::Foo::T, (self::Foo::T) → self::Foo::T>{};
 }
-class Bar<T extends core::Object> extends core::Object {
+class Bar<T extends core::Object = dynamic> extends core::Object {
   const constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.expect
index e517d09..b8a8312 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor optional(([self::C::T]) → void func) → void
     : super core::Object::•() {}
   constructor named(({x: self::C::T}) → void func) → void
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.transformed.expect
index e517d09..b8a8312 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor optional(([self::C::T]) → void func) → void
     : super core::Object::•() {}
   constructor named(({x: self::C::T}) → void func) → void
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.outline.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.outline.expect
index d3b9d37..08422b2 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor optional(([self::C::T]) → void func) → void
     ;
   constructor named(({x: self::C::T}) → void func) → void
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.expect
index c8d5b63..8ac8dc0 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor optional(([self::C::T]) → void func) → void
     : super core::Object::•() {}
   constructor named(({x: self::C::T}) → void func) → void
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.transformed.expect
index c8d5b63..8ac8dc0 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor optional(([self::C::T]) → void func) → void
     : super core::Object::•() {}
   constructor named(({x: self::C::T}) → void func) → void
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.direct.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.direct.expect
index e939b9e..793b217 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.direct.expect
@@ -14,7 +14,7 @@
     ;
   abstract method bar() → void;
 }
-static method f<T extends self::B>(self::f::T a) → void {
+static method f<T extends self::B = dynamic>(self::f::T a) → void {
   if(a is core::String) {
     a.foo();
   }
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.direct.transformed.expect
index e939b9e..793b217 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.direct.transformed.expect
@@ -14,7 +14,7 @@
     ;
   abstract method bar() → void;
 }
-static method f<T extends self::B>(self::f::T a) → void {
+static method f<T extends self::B = dynamic>(self::f::T a) → void {
   if(a is core::String) {
     a.foo();
   }
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect
index 53eed9a..040b762 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect
@@ -12,7 +12,7 @@
     ;
   abstract method bar() → void;
 }
-static method f<T extends self::B>(self::f::T a) → void
+static method f<T extends self::B = dynamic>(self::f::T a) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.strong.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.strong.expect
index 56d7592..a25cdbd 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.strong.expect
@@ -14,7 +14,7 @@
     ;
   abstract method bar() → void;
 }
-static method f<T extends self::B>(self::f::T a) → void {
+static method f<T extends self::B = dynamic>(self::f::T a) → void {
   if(a is core::String) {
     a.{self::B::foo}();
   }
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.strong.transformed.expect
index 56d7592..a25cdbd 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.strong.transformed.expect
@@ -14,7 +14,7 @@
     ;
   abstract method bar() → void;
 }
-static method f<T extends self::B>(self::f::T a) → void {
+static method f<T extends self::B = dynamic>(self::f::T a) → void {
   if(a is core::String) {
     a.{self::B::foo}();
   }
diff --git a/pkg/front_end/testcases/inference/property_set.dart.direct.expect b/pkg/front_end/testcases/inference/property_set.dart.direct.expect
index c247031..f50e2b3 100644
--- a/pkg/front_end/testcases/inference/property_set.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/property_set.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   field core::List<self::A::T> x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/property_set.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/property_set.dart.direct.transformed.expect
index c247031..f50e2b3 100644
--- a/pkg/front_end/testcases/inference/property_set.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/property_set.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   field core::List<self::A::T> x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/property_set.dart.outline.expect b/pkg/front_end/testcases/inference/property_set.dart.outline.expect
index e693bd9..c3e10a3 100644
--- a/pkg/front_end/testcases/inference/property_set.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/property_set.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   field core::List<self::A::T> x;
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/inference/property_set.dart.strong.expect b/pkg/front_end/testcases/inference/property_set.dart.strong.expect
index 699d136..97ca7fe 100644
--- a/pkg/front_end/testcases/inference/property_set.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/property_set.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field core::List<self::A::T> x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/property_set.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/property_set.dart.strong.transformed.expect
index 699d136..97ca7fe 100644
--- a/pkg/front_end/testcases/inference/property_set.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/property_set.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field core::List<self::A::T> x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/recursive_generic_function.dart.direct.expect b/pkg/front_end/testcases/inference/recursive_generic_function.dart.direct.expect
index 4af9ac5..df0ef92 100644
--- a/pkg/front_end/testcases/inference/recursive_generic_function.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/recursive_generic_function.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method _mergeSort<T extends core::Object>((self::_mergeSort::T) → self::_mergeSort::T list, (self::_mergeSort::T, self::_mergeSort::T) → core::int compare, (self::_mergeSort::T) → self::_mergeSort::T target) → void {
+static method _mergeSort<T extends core::Object = dynamic>((self::_mergeSort::T) → self::_mergeSort::T list, (self::_mergeSort::T, self::_mergeSort::T) → core::int compare, (self::_mergeSort::T) → self::_mergeSort::T target) → void {
   self::_mergeSort<dynamic>(list, compare, target);
   self::_mergeSort<dynamic>(list, compare, list);
   self::_mergeSort<dynamic>(target, compare, target);
diff --git a/pkg/front_end/testcases/inference/recursive_generic_function.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/recursive_generic_function.dart.direct.transformed.expect
index 4af9ac5..df0ef92 100644
--- a/pkg/front_end/testcases/inference/recursive_generic_function.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/recursive_generic_function.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method _mergeSort<T extends core::Object>((self::_mergeSort::T) → self::_mergeSort::T list, (self::_mergeSort::T, self::_mergeSort::T) → core::int compare, (self::_mergeSort::T) → self::_mergeSort::T target) → void {
+static method _mergeSort<T extends core::Object = dynamic>((self::_mergeSort::T) → self::_mergeSort::T list, (self::_mergeSort::T, self::_mergeSort::T) → core::int compare, (self::_mergeSort::T) → self::_mergeSort::T target) → void {
   self::_mergeSort<dynamic>(list, compare, target);
   self::_mergeSort<dynamic>(list, compare, list);
   self::_mergeSort<dynamic>(target, compare, target);
diff --git a/pkg/front_end/testcases/inference/recursive_generic_function.dart.outline.expect b/pkg/front_end/testcases/inference/recursive_generic_function.dart.outline.expect
index 31cc717..3b14cff 100644
--- a/pkg/front_end/testcases/inference/recursive_generic_function.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/recursive_generic_function.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method _mergeSort<T extends core::Object>((self::_mergeSort::T) → self::_mergeSort::T list, (self::_mergeSort::T, self::_mergeSort::T) → core::int compare, (self::_mergeSort::T) → self::_mergeSort::T target) → void
+static method _mergeSort<T extends core::Object = dynamic>((self::_mergeSort::T) → self::_mergeSort::T list, (self::_mergeSort::T, self::_mergeSort::T) → core::int compare, (self::_mergeSort::T) → self::_mergeSort::T target) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/recursive_generic_function.dart.strong.expect b/pkg/front_end/testcases/inference/recursive_generic_function.dart.strong.expect
index ab23a10..60a3552 100644
--- a/pkg/front_end/testcases/inference/recursive_generic_function.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/recursive_generic_function.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method _mergeSort<T extends core::Object>((self::_mergeSort::T) → self::_mergeSort::T list, (self::_mergeSort::T, self::_mergeSort::T) → core::int compare, (self::_mergeSort::T) → self::_mergeSort::T target) → void {
+static method _mergeSort<T extends core::Object = dynamic>((self::_mergeSort::T) → self::_mergeSort::T list, (self::_mergeSort::T, self::_mergeSort::T) → core::int compare, (self::_mergeSort::T) → self::_mergeSort::T target) → void {
   self::_mergeSort<self::_mergeSort::T>(list, compare, target);
   self::_mergeSort<self::_mergeSort::T>(list, compare, list);
   self::_mergeSort<self::_mergeSort::T>(target, compare, target);
diff --git a/pkg/front_end/testcases/inference/recursive_generic_function.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/recursive_generic_function.dart.strong.transformed.expect
index ab23a10..60a3552 100644
--- a/pkg/front_end/testcases/inference/recursive_generic_function.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/recursive_generic_function.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method _mergeSort<T extends core::Object>((self::_mergeSort::T) → self::_mergeSort::T list, (self::_mergeSort::T, self::_mergeSort::T) → core::int compare, (self::_mergeSort::T) → self::_mergeSort::T target) → void {
+static method _mergeSort<T extends core::Object = dynamic>((self::_mergeSort::T) → self::_mergeSort::T list, (self::_mergeSort::T, self::_mergeSort::T) → core::int compare, (self::_mergeSort::T) → self::_mergeSort::T target) → void {
   self::_mergeSort<self::_mergeSort::T>(list, compare, target);
   self::_mergeSort<self::_mergeSort::T>(list, compare, list);
   self::_mergeSort<self::_mergeSort::T>(target, compare, target);
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.expect
index 2dcf59c..06e16af 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = dynamic> extends core::Object {
   field self::C::T a = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.transformed.expect
index 2dcf59c..06e16af 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = dynamic> extends core::Object {
   field self::C::T a = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.strong.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.strong.expect
index 7a020fb..88e493b 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = core::num> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T a = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.strong.transformed.expect
index 7a020fb..88e493b 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = core::num> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T a = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.expect
index 33580fd..4b188010 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = dynamic> extends core::Object {
   field self::C::T a = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.transformed.expect
index 33580fd..4b188010 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = dynamic> extends core::Object {
   field self::C::T a = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.strong.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.strong.expect
index 15431c7..97ae897 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = core::num> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T a = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.strong.transformed.expect
index 15431c7..97ae897 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = core::num> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T a = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.expect
index a4422e2..fbd611f 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = dynamic> extends core::Object {
   field self::C::T a = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.transformed.expect
index a4422e2..fbd611f 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = dynamic> extends core::Object {
   field self::C::T a = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.strong.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.strong.expect
index 6410fb3..a33fa5e 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = core::num> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T a = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.strong.transformed.expect
index 6410fb3..a33fa5e 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num> extends core::Object {
+class C<T extends core::num = core::num> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T a = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/super_index_set.dart.direct.expect b/pkg/front_end/testcases/inference/super_index_set.dart.direct.expect
index 041e05e..0134a2a 100644
--- a/pkg/front_end/testcases/inference/super_index_set.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_index_set.dart.direct.expect
@@ -17,6 +17,6 @@
     super.{self::B::[]=}(self::f<dynamic>(), self::f<dynamic>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_index_set.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_index_set.dart.direct.transformed.expect
index 041e05e..0134a2a 100644
--- a/pkg/front_end/testcases/inference/super_index_set.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_index_set.dart.direct.transformed.expect
@@ -17,6 +17,6 @@
     super.{self::B::[]=}(self::f<dynamic>(), self::f<dynamic>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_index_set.dart.outline.expect b/pkg/front_end/testcases/inference/super_index_set.dart.outline.expect
index 9d1472d..95d7070 100644
--- a/pkg/front_end/testcases/inference/super_index_set.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_index_set.dart.outline.expect
@@ -16,7 +16,7 @@
   method h() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/super_index_set.dart.strong.expect b/pkg/front_end/testcases/inference/super_index_set.dart.strong.expect
index 6908392..defc412 100644
--- a/pkg/front_end/testcases/inference/super_index_set.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_index_set.dart.strong.expect
@@ -17,6 +17,6 @@
     super.{self::B::[]=}(self::f<dynamic>() as{TypeError} core::int, self::f<core::String>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_index_set.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/super_index_set.dart.strong.transformed.expect
index 6908392..defc412 100644
--- a/pkg/front_end/testcases/inference/super_index_set.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_index_set.dart.strong.transformed.expect
@@ -17,6 +17,6 @@
     super.{self::B::[]=}(self::f<dynamic>() as{TypeError} core::int, self::f<core::String>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.expect
index cd3af92..22405f9 100644
--- a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   operator []=(core::Map<core::int, self::B::T> x, core::List<self::B::T> y) → void {}
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
@@ -18,6 +18,6 @@
     super.{self::B::[]=}(self::f<dynamic>(), self::f<dynamic>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.transformed.expect
index cd3af92..22405f9 100644
--- a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   operator []=(core::Map<core::int, self::B::T> x, core::List<self::B::T> y) → void {}
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
@@ -18,6 +18,6 @@
     super.{self::B::[]=}(self::f<dynamic>(), self::f<dynamic>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.outline.expect b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.outline.expect
index 9ef3f0c..e45d970 100644
--- a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.outline.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   operator []=(core::Map<core::int, self::B::T> x, core::List<self::B::T> y) → void
     ;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     ;
   operator []=(core::Object x, core::Object y) → void
@@ -17,7 +17,7 @@
   method h() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.strong.expect b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.strong.expect
index a5cd75e..3f4ad5b 100644
--- a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.strong.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   operator []=(generic-covariant-impl generic-covariant-interface core::Map<core::int, self::B::T> x, generic-covariant-impl generic-covariant-interface core::List<self::B::T> y) → void {}
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
@@ -18,6 +18,6 @@
     super.{self::B::[]=}(self::f<dynamic>() as{TypeError} core::Map<core::int, asy::Future<self::C::U>>, self::f<core::List<asy::Future<self::C::U>>>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.strong.transformed.expect
index a5cd75e..3f4ad5b 100644
--- a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.strong.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   operator []=(generic-covariant-impl generic-covariant-interface core::Map<core::int, self::B::T> x, generic-covariant-impl generic-covariant-interface core::List<self::B::T> y) → void {}
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
@@ -18,6 +18,6 @@
     super.{self::B::[]=}(self::f<dynamic>() as{TypeError} core::Map<core::int, asy::Future<self::C::U>>, self::f<core::List<asy::Future<self::C::U>>>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_initializer.dart.direct.expect b/pkg/front_end/testcases/inference/super_initializer.dart.direct.expect
index 1d9a2bf..f973b94 100644
--- a/pkg/front_end/testcases/inference/super_initializer.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_initializer.dart.direct.expect
@@ -12,6 +12,6 @@
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_initializer.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_initializer.dart.direct.transformed.expect
index 1d9a2bf..f973b94 100644
--- a/pkg/front_end/testcases/inference/super_initializer.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_initializer.dart.direct.transformed.expect
@@ -12,6 +12,6 @@
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_initializer.dart.outline.expect b/pkg/front_end/testcases/inference/super_initializer.dart.outline.expect
index 3ad68e3..e148d16 100644
--- a/pkg/front_end/testcases/inference/super_initializer.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_initializer.dart.outline.expect
@@ -10,7 +10,7 @@
   constructor •(core::int x) → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/super_initializer.dart.strong.expect b/pkg/front_end/testcases/inference/super_initializer.dart.strong.expect
index e36e82d..c0a9963 100644
--- a/pkg/front_end/testcases/inference/super_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_initializer.dart.strong.expect
@@ -12,6 +12,6 @@
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/super_initializer.dart.strong.transformed.expect
index e36e82d..c0a9963 100644
--- a/pkg/front_end/testcases/inference/super_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_initializer.dart.strong.transformed.expect
@@ -12,6 +12,6 @@
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.expect
index e6ba748..349bb55 100644
--- a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B::T t) → void
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object> extends self::B<core::List<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<core::List<self::C::U>> {
   constructor •() → void
     : super self::B::•(self::f<dynamic>())
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.transformed.expect
index e6ba748..349bb55 100644
--- a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.transformed.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B::T t) → void
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object> extends self::B<core::List<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<core::List<self::C::U>> {
   constructor •() → void
     : super self::B::•(self::f<dynamic>())
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.outline.expect b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.outline.expect
index 68d8998..c748dab 100644
--- a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.outline.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B::T t) → void
     ;
 }
-class C<U extends core::Object> extends self::B<core::List<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<core::List<self::C::U>> {
   constructor •() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.strong.expect b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.strong.expect
index da5d5a2..f357c51 100644
--- a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.strong.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B::T t) → void
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object> extends self::B<core::List<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<core::List<self::C::U>> {
   constructor •() → void
     : super self::B::•(self::f<core::List<self::C::U>>())
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.strong.transformed.expect
index da5d5a2..f357c51 100644
--- a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.strong.transformed.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B::T t) → void
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object> extends self::B<core::List<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<core::List<self::C::U>> {
   constructor •() → void
     : super self::B::•(self::f<core::List<self::C::U>>())
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.expect
index bcfab27..31245d1 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method g(self::E<self::B::T> x) → self::D<self::B::T>
     return null;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
@@ -30,6 +30,6 @@
     dynamic x = super.{self::B::g}(self::f<dynamic>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.transformed.expect
index bcfab27..31245d1 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.transformed.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method g(self::E<self::B::T> x) → self::D<self::B::T>
     return null;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
@@ -30,6 +30,6 @@
     dynamic x = super.{self::B::g}(self::f<dynamic>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.outline.expect b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.outline.expect
index 4d0679c..0186853 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.outline.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method g(self::E<self::B::T> x) → self::D<self::B::T>
     ;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     ;
   method g(core::Object x) → self::E<asy::Future<self::C::U>>
@@ -25,7 +25,7 @@
   method h() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.strong.expect b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.strong.expect
index 973b188..d492a07 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.strong.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method g(generic-covariant-impl generic-covariant-interface self::E<self::B::T> x) → self::D<self::B::T>
     return null;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
@@ -30,6 +30,6 @@
     self::D<asy::Future<self::C::U>> x = super.{self::B::g}(self::f<self::E<asy::Future<self::C::U>>>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.strong.transformed.expect
index 973b188..d492a07 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.strong.transformed.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method g(generic-covariant-impl generic-covariant-interface self::E<self::B::T> x) → self::D<self::B::T>
     return null;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
@@ -30,6 +30,6 @@
     self::D<asy::Future<self::C::U>> x = super.{self::B::g}(self::f<self::E<asy::Future<self::C::U>>>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.expect
index 8ee6c1c..a191aad 100644
--- a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   field self::D<self::B::T> x = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.transformed.expect
index 8ee6c1c..a191aad 100644
--- a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.transformed.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   field self::D<self::B::T> x = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.outline.expect b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.outline.expect
index 04cb684..5c18f14 100644
--- a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.outline.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   field self::D<self::B::T> x;
   synthetic constructor •() → void
     ;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     ;
   get x() → self::E<asy::Future<self::C::U>>
diff --git a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.strong.expect b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.strong.expect
index 5841a0d..f8bd96c 100644
--- a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.strong.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::D<self::B::T> x = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.strong.transformed.expect
index 5841a0d..f8bd96c 100644
--- a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.strong.transformed.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::D<self::B::T> x = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.expect
index f4bec43..df509d6 100644
--- a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   field self::D<self::B::T> x = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
@@ -30,6 +30,6 @@
     super.{self::B::x} = self::f<dynamic>();
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.transformed.expect
index f4bec43..df509d6 100644
--- a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.transformed.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   field self::D<self::B::T> x = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
@@ -30,6 +30,6 @@
     super.{self::B::x} = self::f<dynamic>();
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.outline.expect b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.outline.expect
index 97fbb9b..aa354a1 100644
--- a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.outline.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   field self::D<self::B::T> x;
   synthetic constructor •() → void
     ;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     ;
   get x() → self::E<asy::Future<self::C::U>>
@@ -26,7 +26,7 @@
   method g() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.strong.expect b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.strong.expect
index 3103ff0..db2885e 100644
--- a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.strong.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::D<self::B::T> x = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
@@ -30,6 +30,6 @@
     super.{self::B::x} = self::f<self::D<asy::Future<self::C::U>>>();
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.strong.transformed.expect
index 3103ff0..db2885e 100644
--- a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.strong.transformed.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::D<self::B::T> x = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
@@ -30,6 +30,6 @@
     super.{self::B::x} = self::f<self::D<asy::Future<self::C::U>>>();
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/this_reference.dart.direct.expect b/pkg/front_end/testcases/inference/this_reference.dart.direct.expect
index b04ed9d..bb11426 100644
--- a/pkg/front_end/testcases/inference/this_reference.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/this_reference.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/this_reference.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/this_reference.dart.direct.transformed.expect
index b04ed9d..bb11426 100644
--- a/pkg/front_end/testcases/inference/this_reference.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/this_reference.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/this_reference.dart.outline.expect b/pkg/front_end/testcases/inference/this_reference.dart.outline.expect
index c506387..26fb9e8 100644
--- a/pkg/front_end/testcases/inference/this_reference.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/this_reference.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method f() → void
diff --git a/pkg/front_end/testcases/inference/this_reference.dart.strong.expect b/pkg/front_end/testcases/inference/this_reference.dart.strong.expect
index 2c721a1..d2a5bd6 100644
--- a/pkg/front_end/testcases/inference/this_reference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/this_reference.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/this_reference.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/this_reference.dart.strong.transformed.expect
index 2c721a1..d2a5bd6 100644
--- a/pkg/front_end/testcases/inference/this_reference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/this_reference.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/type_cast.dart.direct.expect b/pkg/front_end/testcases/inference/type_cast.dart.direct.expect
index 92d88c6..a69bbca 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/type_cast.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends self::A<self::B::T> {
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
   synthetic constructor •() → void
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/inference/type_cast.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/type_cast.dart.direct.transformed.expect
index 92d88c6..a69bbca 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_cast.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends self::A<self::B::T> {
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
   synthetic constructor •() → void
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/inference/type_cast.dart.outline.expect b/pkg/front_end/testcases/inference/type_cast.dart.outline.expect
index 8491585..626f607 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/type_cast.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class B<T extends core::Object> extends self::A<self::B::T> {
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
   synthetic constructor •() → void
     ;
   method foo() → dynamic
diff --git a/pkg/front_end/testcases/inference/type_cast.dart.strong.expect b/pkg/front_end/testcases/inference/type_cast.dart.strong.expect
index 2418fa8..cd505b4 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/type_cast.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends self::A<self::B::T> {
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
   synthetic constructor •() → void
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/inference/type_cast.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/type_cast.dart.strong.transformed.expect
index 2418fa8..cd505b4 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_cast.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends self::A<self::B::T> {
+class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
   synthetic constructor •() → void
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.direct.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.direct.expect
index 42d105e..7b6dfaa 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.direct.expect
@@ -14,6 +14,6 @@
     dynamic v5 = let final dynamic #t1 = 0 in let final dynamic #t2 = self::f<dynamic>() in let final dynamic #t3 = super.[]=(#t1, #t2) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.direct.transformed.expect
index 42d105e..7b6dfaa 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.direct.transformed.expect
@@ -14,6 +14,6 @@
     dynamic v5 = let final dynamic #t1 = 0 in let final dynamic #t2 = self::f<dynamic>() in let final dynamic #t3 = super.[]=(#t1, #t2) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.outline.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.outline.expect
index ac4a642..5b2f1ca 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.outline.expect
@@ -8,7 +8,7 @@
   method test() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
index f3c83b5..7406276 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
@@ -25,6 +25,6 @@
                                      ^^^", "pkg/front_end/testcases/inference/unresolved_super.dart:16:37: Error: Superclass has no method named '[]='.
     var /*@type=dynamic*/ v5 = super[0] = /*@typeArgs=dynamic*/ f();
                                     ^"]/* from null */;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.expect
index ea9c98e..75af777 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(() → self::C::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.transformed.expect
index ea9c98e..75af777 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(() → self::C::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.expect
index e19dd93..89810b9 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(() → self::C::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.transformed.expect
index e19dd93..89810b9 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(() → self::C::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.expect
index 2f5725e..7627c24 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(() → self::C::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.transformed.expect
index 2f5725e..7627c24 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(() → self::C::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.expect
index cdef38d..bbd32a9 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(() → self::C::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.transformed.expect
index cdef38d..bbd32a9 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(() → self::C::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.expect
index ab67a68..33065a8 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(() → self::C::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.transformed.expect
index ab67a68..33065a8 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(() → self::C::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.strong.expect
index 9377cb7..93ad8f7 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(() → self::C::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.strong.transformed.expect
index 9377cb7..93ad8f7 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   constructor •(() → self::C::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.direct.expect
index 987511d..8fe3a76 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.direct.expect
@@ -5,7 +5,7 @@
 static field dynamic v = self::f<dynamic>(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.direct.transformed.expect
index 987511d..8fe3a76 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 static field dynamic v = self::f<dynamic>(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.strong.expect
index 757a833..ef5e6ca 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.strong.expect
@@ -5,7 +5,7 @@
 static field core::List<dynamic> v = self::f<dynamic>(() → core::int {
   return 1;
 });
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.strong.transformed.expect
index 757a833..ef5e6ca 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.strong.transformed.expect
@@ -5,7 +5,7 @@
 static field core::List<dynamic> v = self::f<dynamic>(() → core::int {
   return 1;
 });
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.direct.expect
index 4965d22..2e73b66 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.direct.expect
@@ -5,7 +5,7 @@
 static field dynamic v = self::f<core::int>(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.direct.transformed.expect
index 4965d22..2e73b66 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 static field dynamic v = self::f<core::int>(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.strong.expect
index 4242dc9..16be853 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.strong.expect
@@ -5,7 +5,7 @@
 static field core::List<core::int> v = self::f<core::int>(() → core::int {
   return 1;
 });
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.strong.transformed.expect
index 4242dc9..16be853 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.strong.transformed.expect
@@ -5,7 +5,7 @@
 static field core::List<core::int> v = self::f<core::int>(() → core::int {
   return 1;
 });
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.direct.expect
index 89fc3e2..e222b86 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.direct.expect
@@ -7,5 +7,5 @@
     return 1;
   });
 }
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.direct.transformed.expect
index 89fc3e2..e222b86 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.direct.transformed.expect
@@ -7,5 +7,5 @@
     return 1;
   });
 }
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.strong.expect
index 27f92d8..6e09452 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.strong.expect
@@ -7,5 +7,5 @@
     return 1;
   });
 }
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.strong.transformed.expect
index 27f92d8..6e09452 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.strong.transformed.expect
@@ -7,5 +7,5 @@
     return 1;
   });
 }
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.direct.expect
index 5d7db44..614a9eb 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.direct.expect
@@ -7,5 +7,5 @@
     return 1;
   });
 }
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.direct.transformed.expect
index 5d7db44..614a9eb 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.direct.transformed.expect
@@ -7,5 +7,5 @@
     return 1;
   });
 }
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.strong.expect
index d78578d..f1a71c2 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.strong.expect
@@ -7,5 +7,5 @@
     return 1;
   });
 }
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.strong.transformed.expect
index d78578d..f1a71c2 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.strong.transformed.expect
@@ -7,5 +7,5 @@
     return 1;
   });
 }
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.expect
index 94926cb..acfcd08 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(() → self::C::f::T g) → core::List<self::C::f::T>
+  method f<T extends core::Object = dynamic>(() → self::C::f::T g) → core::List<self::C::f::T>
     return <self::C::f::T>[g.call()];
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.transformed.expect
index 94926cb..acfcd08 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(() → self::C::f::T g) → core::List<self::C::f::T>
+  method f<T extends core::Object = dynamic>(() → self::C::f::T g) → core::List<self::C::f::T>
     return <self::C::f::T>[g.call()];
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.strong.expect
index 453c72f..1541ba0 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.strong.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(() → self::C::f::T g) → core::List<self::C::f::T>
+  method f<T extends core::Object = dynamic>(() → self::C::f::T g) → core::List<self::C::f::T>
     return <self::C::f::T>[g.call()];
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.strong.transformed.expect
index 453c72f..1541ba0 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(() → self::C::f::T g) → core::List<self::C::f::T>
+  method f<T extends core::Object = dynamic>(() → self::C::f::T g) → core::List<self::C::f::T>
     return <self::C::f::T>[g.call()];
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.direct.expect
index 601a1ea..6d4f94d 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.direct.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(() → self::C::f::T g) → core::List<self::C::f::T>
+  method f<T extends core::Object = dynamic>(() → self::C::f::T g) → core::List<self::C::f::T>
     return <self::C::f::T>[g.call()];
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.direct.transformed.expect
index 601a1ea..6d4f94d 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(() → self::C::f::T g) → core::List<self::C::f::T>
+  method f<T extends core::Object = dynamic>(() → self::C::f::T g) → core::List<self::C::f::T>
     return <self::C::f::T>[g.call()];
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.strong.expect
index 2cb1a2a..cb76f4d 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.strong.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(() → self::C::f::T g) → core::List<self::C::f::T>
+  method f<T extends core::Object = dynamic>(() → self::C::f::T g) → core::List<self::C::f::T>
     return <self::C::f::T>[g.call()];
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.strong.transformed.expect
index 2cb1a2a..cb76f4d 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(() → self::C::f::T g) → core::List<self::C::f::T>
+  method f<T extends core::Object = dynamic>(() → self::C::f::T g) → core::List<self::C::f::T>
     return <self::C::f::T>[g.call()];
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.expect
index 46c4204..e8f01e3 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(() → self::C::f::T g) → core::List<self::C::f::T>
+  method f<T extends core::Object = dynamic>(() → self::C::f::T g) → core::List<self::C::f::T>
     return <self::C::f::T>[g.call()];
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.transformed.expect
index 46c4204..e8f01e3 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(() → self::C::f::T g) → core::List<self::C::f::T>
+  method f<T extends core::Object = dynamic>(() → self::C::f::T g) → core::List<self::C::f::T>
     return <self::C::f::T>[g.call()];
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.strong.expect
index 2cb1a2a..cb76f4d 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.strong.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(() → self::C::f::T g) → core::List<self::C::f::T>
+  method f<T extends core::Object = dynamic>(() → self::C::f::T g) → core::List<self::C::f::T>
     return <self::C::f::T>[g.call()];
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.strong.transformed.expect
index 2cb1a2a..cb76f4d 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(() → self::C::f::T g) → core::List<self::C::f::T>
+  method f<T extends core::Object = dynamic>(() → self::C::f::T g) → core::List<self::C::f::T>
     return <self::C::f::T>[g.call()];
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.direct.expect b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.direct.expect
index 7aabcb2..e9f8f19 100644
--- a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic x = self::run<dynamic>(self::printRunning);
-static method run<T extends core::Object>(() → self::run::T f) → self::run::T {
+static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T {
   core::print("running");
   dynamic t = f.call();
   core::print("done running");
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.direct.transformed.expect
index 7aabcb2..e9f8f19 100644
--- a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic x = self::run<dynamic>(self::printRunning);
-static method run<T extends core::Object>(() → self::run::T f) → self::run::T {
+static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T {
   core::print("running");
   dynamic t = f.call();
   core::print("done running");
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.strong.expect b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.strong.expect
index 0fdc0e3..0d3fd7d 100644
--- a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic x = self::run<dynamic>(self::printRunning);
-static method run<T extends core::Object>(() → self::run::T f) → self::run::T {
+static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T {
   core::print("running");
   self::run::T t = f.call();
   core::print("done running");
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.strong.transformed.expect
index 0fdc0e3..0d3fd7d 100644
--- a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic x = self::run<dynamic>(self::printRunning);
-static method run<T extends core::Object>(() → self::run::T f) → self::run::T {
+static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T {
   core::print("running");
   self::run::T t = f.call();
   core::print("done running");
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.expect
index 16e4209..94629b4 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<U extends core::Object, V extends core::Object> = (U) → V;
-class Foo<T extends core::Object> extends core::Object {
+typedef F<U extends core::Object = dynamic, V extends core::Object = dynamic> = (U) → V;
+class Foo<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -26,7 +26,7 @@
   get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
     return const <dynamic, dynamic>{};
 }
-class Bar<T extends core::Object> extends core::Object {
+class Bar<T extends core::Object = dynamic> extends core::Object {
   const constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.transformed.expect
index 16e4209..94629b4 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<U extends core::Object, V extends core::Object> = (U) → V;
-class Foo<T extends core::Object> extends core::Object {
+typedef F<U extends core::Object = dynamic, V extends core::Object = dynamic> = (U) → V;
+class Foo<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -26,7 +26,7 @@
   get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
     return const <dynamic, dynamic>{};
 }
-class Bar<T extends core::Object> extends core::Object {
+class Bar<T extends core::Object = dynamic> extends core::Object {
   const constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.outline.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.outline.expect
index 393359f..96fab41 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<U extends core::Object, V extends core::Object> = (U) → V;
-class Foo<T extends core::Object> extends core::Object {
+typedef F<U extends core::Object = dynamic, V extends core::Object = dynamic> = (U) → V;
+class Foo<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   get v1() → self::Bar<self::Foo::T>
@@ -25,7 +25,7 @@
   get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
     ;
 }
-class Bar<T extends core::Object> extends core::Object {
+class Bar<T extends core::Object = dynamic> extends core::Object {
   const constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect
index 6926e12..29c327c 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<U extends core::Object, V extends core::Object> = (U) → V;
-class Foo<T extends core::Object> extends core::Object {
+typedef F<U extends core::Object = dynamic, V extends core::Object = dynamic> = (U) → V;
+class Foo<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -26,7 +26,7 @@
   get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
     return const <core::Null, (core::Object) → core::Null>{};
 }
-class Bar<T extends core::Object> extends core::Object {
+class Bar<T extends core::Object = dynamic> extends core::Object {
   const constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect
index 6926e12..29c327c 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<U extends core::Object, V extends core::Object> = (U) → V;
-class Foo<T extends core::Object> extends core::Object {
+typedef F<U extends core::Object = dynamic, V extends core::Object = dynamic> = (U) → V;
+class Foo<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -26,7 +26,7 @@
   get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
     return const <core::Null, (core::Object) → core::Null>{};
 }
-class Bar<T extends core::Object> extends core::Object {
+class Bar<T extends core::Object = dynamic> extends core::Object {
   const constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.expect
index 2e54afa..8488c70 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(self::A::f::T t) → self::A::f::T
+  method f<T extends core::Object = dynamic>(self::A::f::T t) → self::A::f::T
     return t;
   method g(dynamic i) → core::int
     return 0;
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.transformed.expect
index 2e54afa..8488c70 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(self::A::f::T t) → self::A::f::T
+  method f<T extends core::Object = dynamic>(self::A::f::T t) → self::A::f::T
     return t;
   method g(dynamic i) → core::int
     return 0;
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.outline.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.outline.expect
index ad47727..072ea33 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.outline.expect
@@ -5,7 +5,7 @@
 class A extends core::Object {
   synthetic constructor •() → void
     ;
-  method f<T extends core::Object>(self::A::f::T t) → self::A::f::T
+  method f<T extends core::Object = dynamic>(self::A::f::T t) → self::A::f::T
     ;
   method g(dynamic i) → core::int
     ;
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect
index b23bd77..59ee258 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(self::A::f::T t) → self::A::f::T
+  method f<T extends core::Object = dynamic>(self::A::f::T t) → self::A::f::T
     return t;
   method g(dynamic i) → core::int
     return 0;
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect
index b23bd77..59ee258 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<T extends core::Object>(self::A::f::T t) → self::A::f::T
+  method f<T extends core::Object = dynamic>(self::A::f::T t) → self::A::f::T
     return t;
   method g(dynamic i) → core::int
     return 0;
diff --git a/pkg/front_end/testcases/inference_new/do_loop.dart.direct.expect b/pkg/front_end/testcases/inference_new/do_loop.dart.direct.expect
index 8d9986c..edd314e 100644
--- a/pkg/front_end/testcases/inference_new/do_loop.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/do_loop.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   do {
diff --git a/pkg/front_end/testcases/inference_new/do_loop.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/do_loop.dart.direct.transformed.expect
index 8d9986c..edd314e 100644
--- a/pkg/front_end/testcases/inference_new/do_loop.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/do_loop.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   do {
diff --git a/pkg/front_end/testcases/inference_new/do_loop.dart.outline.expect b/pkg/front_end/testcases/inference_new/do_loop.dart.outline.expect
index ac49c9e..e8c03c5 100644
--- a/pkg/front_end/testcases/inference_new/do_loop.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/do_loop.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/do_loop.dart.strong.expect b/pkg/front_end/testcases/inference_new/do_loop.dart.strong.expect
index 9262769..5e323f3 100644
--- a/pkg/front_end/testcases/inference_new/do_loop.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/do_loop.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   do {
diff --git a/pkg/front_end/testcases/inference_new/do_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/do_loop.dart.strong.transformed.expect
index 9262769..5e323f3 100644
--- a/pkg/front_end/testcases/inference_new/do_loop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/do_loop.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   do {
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.expect
index e86775a..06b6924 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.transformed.expect
index e86775a..06b6924 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.transformed.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.outline.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.outline.expect
index d0b810a..5f8f019 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.outline.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → void
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B::T x) → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.strong.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.strong.expect
index 019ae1b..c3f1d56 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.strong.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.strong.transformed.expect
index 019ae1b..c3f1d56 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::B::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.expect
index ca47657..de7183e 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::A::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.transformed.expect
index ca47657..de7183e 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::A::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.outline.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.outline.expect
index 3497efa..2a7abc7 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::A::T x) → void
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.strong.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.strong.expect
index 115862f..5f2c35d 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::A::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.strong.transformed.expect
index 115862f..5f2c35d 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   constructor •(self::A::T x) → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.expect
index e612ea3..7b9d366 100644
--- a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.expect
@@ -33,7 +33,7 @@
   }
 }
 static field self::A aTopLevel;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static set aTopLevelSetter(self::A value) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.transformed.expect
index e612ea3..7b9d366 100644
--- a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.transformed.expect
@@ -33,7 +33,7 @@
   }
 }
 static field self::A aTopLevel;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static set aTopLevelSetter(self::A value) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.outline.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.outline.expect
index 6bd42ce..19aaf1e 100644
--- a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.outline.expect
@@ -16,7 +16,7 @@
     ;
 }
 static field self::A aTopLevel;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static set aTopLevelSetter(self::A value) → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.expect
index c5b3997..89f7813 100644
--- a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.expect
@@ -33,7 +33,7 @@
   }
 }
 static field self::A aTopLevel;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static set aTopLevelSetter(self::A value) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.transformed.expect
index c5b3997..89f7813 100644
--- a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.transformed.expect
@@ -33,7 +33,7 @@
   }
 }
 static field self::A aTopLevel;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static set aTopLevelSetter(self::A value) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.expect
index f8bb637..8f2e22d 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.expect
@@ -13,7 +13,7 @@
     : super self::A::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → dynamic async {
   core::Iterable<self::A> iterable;
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
index df5d861..c6044b0 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
@@ -13,7 +13,7 @@
     : super self::A::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → dynamic /* originally async */ {
   final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.outline.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.outline.expect
index 006a0f5..acae199 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.outline.expect
@@ -10,7 +10,7 @@
   synthetic constructor •() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method test() → dynamic
   ;
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 60f704bb..5800a96 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
@@ -13,7 +13,7 @@
     : super self::A::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → dynamic async {
   core::Iterable<self::A> iterable;
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
index cd0a0a7..e8c97af 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
@@ -13,7 +13,7 @@
     : super self::A::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → dynamic /* originally async */ {
   final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.expect
index 53d59d1..6748909 100644
--- a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.expect
@@ -48,7 +48,7 @@
     return null;
   operator []=(core::int i, self::B value) → void {}
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test1(self::G g) → void {
   let final dynamic #t1 = g in let final dynamic #t2 = 0 in #t1.[]=(#t2, #t1.[](#t2).*(self::f<dynamic>()));
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.transformed.expect
index 53d59d1..6748909 100644
--- a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.transformed.expect
@@ -48,7 +48,7 @@
     return null;
   operator []=(core::int i, self::B value) → void {}
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test1(self::G g) → void {
   let final dynamic #t1 = g in let final dynamic #t2 = 0 in #t1.[]=(#t2, #t1.[](#t2).*(self::f<dynamic>()));
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.outline.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.outline.expect
index 1116704..f45b9cb 100644
--- a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.outline.expect
@@ -42,7 +42,7 @@
   operator []=(core::int i, self::B value) → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method test1(self::G g) → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.expect
index 9a5b546..93d3e6a 100644
--- a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.expect
@@ -48,7 +48,7 @@
     return null;
   operator []=(core::int i, self::B value) → void {}
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test1(self::G g) → void {
   let final self::G #t1 = g in let final core::int #t2 = 0 in #t1.{self::G::[]=}(#t2, #t1.{self::G::[]}(#t2).{self::A::*}(self::f<dynamic>() as{TypeError} self::D));
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.transformed.expect
index 9a5b546..93d3e6a 100644
--- a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.transformed.expect
@@ -48,7 +48,7 @@
     return null;
   operator []=(core::int i, self::B value) → void {}
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test1(self::G g) → void {
   let final self::G #t1 = g in let final core::int #t2 = 0 in #t1.{self::G::[]=}(#t2, #t1.{self::G::[]}(#t2).{self::A::*}(self::f<dynamic>() as{TypeError} self::D));
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.expect
index 233af9d..a47f9b9 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.expect
@@ -47,6 +47,6 @@
     dynamic v7 = let final dynamic #t2 = this.{self::Test::member} in let final dynamic #t3 = this.{self::Test::member} = #t2.-(1) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.transformed.expect
index 233af9d..a47f9b9 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.transformed.expect
@@ -47,6 +47,6 @@
     dynamic v7 = let final dynamic #t2 = this.{self::Test::member} in let final dynamic #t3 = this.{self::Test::member} = #t2.-(1) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.outline.expect
index 031084f..ca2db03 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.outline.expect
@@ -29,7 +29,7 @@
   method test() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.strong.expect
index 128a53e..8338d42 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.strong.expect
@@ -47,6 +47,6 @@
     self::B v7 = let final self::B #t2 = this.{self::Test::member} in let final self::B #t3 = this.{self::Test::member} = #t2.{self::B::-}(1) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.strong.transformed.expect
index 128a53e..8338d42 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.strong.transformed.expect
@@ -47,6 +47,6 @@
     self::B v7 = let final self::B #t2 = this.{self::Test::member} in let final self::B #t3 = this.{self::Test::member} = #t2.{self::B::-}(1) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.expect
index c460798..6fd428b 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.expect
@@ -55,6 +55,6 @@
     dynamic v7 = let final dynamic #t42 = t in let final dynamic #t43 = self::f<dynamic>() in let final dynamic #t44 = #t42.[](#t43) in let final dynamic #t45 = #t42.[]=(#t43, #t44.-(1)) in #t44;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.transformed.expect
index c460798..6fd428b 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.transformed.expect
@@ -55,6 +55,6 @@
     dynamic v7 = let final dynamic #t42 = t in let final dynamic #t43 = self::f<dynamic>() in let final dynamic #t44 = #t42.[](#t43) in let final dynamic #t45 = #t42.[]=(#t43, #t44.-(1)) in #t44;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.outline.expect
index ff1db0b..8286554 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.outline.expect
@@ -36,7 +36,7 @@
   method test() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.strong.expect
index 211cbb9..1bc265f 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.strong.expect
@@ -55,6 +55,6 @@
     self::B v7 = let final self::Test #t42 = t in let final dynamic #t43 = self::f<dynamic>() in let final self::B #t44 = #t42.{self::Test::[]}(#t43 as{TypeError} self::Index) in let final void #t45 = #t42.{self::Test::[]=}(#t43 as{TypeError} self::Index, #t44.{self::B::-}(1)) in #t44;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.strong.transformed.expect
index 211cbb9..1bc265f 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.strong.transformed.expect
@@ -55,6 +55,6 @@
     self::B v7 = let final self::Test #t42 = t in let final dynamic #t43 = self::f<dynamic>() in let final self::B #t44 = #t42.{self::Test::[]}(#t43 as{TypeError} self::Index) in let final void #t45 = #t42.{self::Test::[]=}(#t43 as{TypeError} self::Index, #t44.{self::B::-}(1)) in #t44;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.expect
index 515c5dd..5b671bb 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.expect
@@ -66,6 +66,6 @@
     dynamic v5 = let final dynamic #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final dynamic #t32 = #t30.[](#t31) in let final dynamic #t33 = #t30.[]=(#t31, #t32.-(1)) in #t32;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.transformed.expect
index 515c5dd..5b671bb 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.transformed.expect
@@ -66,6 +66,6 @@
     dynamic v5 = let final dynamic #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final dynamic #t32 = #t30.[](#t31) in let final dynamic #t33 = #t30.[]=(#t31, #t32.-(1)) in #t32;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.outline.expect
index 0b77cdc..0a5efaa 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.outline.expect
@@ -48,7 +48,7 @@
   method test() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.strong.expect
index 8c2dd0c..874ad18 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.strong.expect
@@ -66,6 +66,6 @@
     self::B v5 = let final self::Test #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final self::B #t32 = #t30.{self::Test::[]}(#t31 as{TypeError} self::Index) in let final void #t33 = #t30.{self::Test::[]=}(#t31 as{TypeError} self::Index, #t32.{self::B::-}(1)) in #t32;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.strong.transformed.expect
index 8c2dd0c..874ad18 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.strong.transformed.expect
@@ -66,6 +66,6 @@
     self::B v5 = let final self::Test #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final self::B #t32 = #t30.{self::Test::[]}(#t31 as{TypeError} self::Index) in let final void #t33 = #t30.{self::Test::[]=}(#t31 as{TypeError} self::Index, #t32.{self::B::-}(1)) in #t32;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.expect
index 02ff3dc..d613228 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.expect
@@ -59,6 +59,6 @@
     dynamic v7 = let final dynamic #t30 = self::f<dynamic>() in let final dynamic #t31 = super.{self::Base::[]}(#t30) in let final dynamic #t32 = super.{self::Base::[]=}(#t30, #t31.-(1)) in #t31;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.transformed.expect
index 02ff3dc..d613228 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.transformed.expect
@@ -59,6 +59,6 @@
     dynamic v7 = let final dynamic #t30 = self::f<dynamic>() in let final dynamic #t31 = super.{self::Base::[]}(#t30) in let final dynamic #t32 = super.{self::Base::[]=}(#t30, #t31.-(1)) in #t31;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.outline.expect
index 421df3f..1d2a695 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.outline.expect
@@ -40,7 +40,7 @@
   method test() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.strong.expect
index ac4968c..d77ddb9 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.strong.expect
@@ -59,6 +59,6 @@
     self::B v7 = let final dynamic #t30 = self::f<dynamic>() in let final self::B #t31 = super.{self::Base::[]}(#t30 as{TypeError} self::Index) in let final void #t32 = super.{self::Base::[]=}(#t30 as{TypeError} self::Index, #t31.{self::B::-}(1)) in #t31;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.strong.transformed.expect
index ac4968c..d77ddb9 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.strong.transformed.expect
@@ -59,6 +59,6 @@
     self::B v7 = let final dynamic #t30 = self::f<dynamic>() in let final self::B #t31 = super.{self::Base::[]}(#t30 as{TypeError} self::Index) in let final void #t32 = super.{self::Base::[]=}(#t30 as{TypeError} self::Index, #t31.{self::B::-}(1)) in #t31;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.expect
index 7ad93e72..1610dd9 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class Base<T extends core::Object, U extends core::Object> extends core::Object {
+abstract class Base<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.transformed.expect
index 7ad93e72..1610dd9 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class Base<T extends core::Object, U extends core::Object> extends core::Object {
+abstract class Base<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.outline.expect
index e678ac3..24d45db 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class Base<T extends core::Object, U extends core::Object> extends core::Object {
+abstract class Base<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   operator [](core::String s) → self::Base::T
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 7d69433..a9953b5 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
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class Base<T extends core::Object, U extends core::Object> extends core::Object {
+abstract class Base<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.expect
index 2c0f5d8..f031580 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.expect
@@ -54,6 +54,6 @@
     dynamic v7 = let final dynamic #t30 = self::f<dynamic>() in let final dynamic #t31 = this.[](#t30) in let final dynamic #t32 = this.[]=(#t30, #t31.-(1)) in #t31;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.transformed.expect
index 2c0f5d8..f031580 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.transformed.expect
@@ -54,6 +54,6 @@
     dynamic v7 = let final dynamic #t30 = self::f<dynamic>() in let final dynamic #t31 = this.[](#t30) in let final dynamic #t32 = this.[]=(#t30, #t31.-(1)) in #t31;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.outline.expect
index ff1db0b..8286554 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.outline.expect
@@ -36,7 +36,7 @@
   method test() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.expect
index 754dfc6..494fe12 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.expect
@@ -54,6 +54,6 @@
     self::B v7 = let final dynamic #t30 = self::f<dynamic>() in let final self::B #t31 = this.{self::Test::[]}(#t30 as{TypeError} self::Index) in let final void #t32 = this.{self::Test::[]=}(#t30 as{TypeError} self::Index, #t31.{self::B::-}(1)) in #t31;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.transformed.expect
index 754dfc6..494fe12 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.transformed.expect
@@ -54,6 +54,6 @@
     self::B v7 = let final dynamic #t30 = self::f<dynamic>() in let final self::B #t31 = this.{self::Test::[]}(#t30 as{TypeError} self::Index) in let final void #t32 = this.{self::Test::[]=}(#t30 as{TypeError} self::Index, #t31.{self::B::-}(1)) in #t31;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.expect
index 7455ebf..552f176 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class Test<T extends core::Object, U extends core::Object> extends core::Object {
+abstract class Test<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.transformed.expect
index 7455ebf..552f176 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class Test<T extends core::Object, U extends core::Object> extends core::Object {
+abstract class Test<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.outline.expect
index 68b8c6d..49a438a 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class Test<T extends core::Object, U extends core::Object> extends core::Object {
+abstract class Test<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract operator [](core::String s) → self::Test::T;
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 8a8c568..6b1a389 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
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class Test<T extends core::Object, U extends core::Object> extends core::Object {
+abstract class Test<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.expect
index eec4890..c564570 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.expect
@@ -25,7 +25,7 @@
     : super self::B::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   self::B local;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.transformed.expect
index eec4890..c564570 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.transformed.expect
@@ -25,7 +25,7 @@
     : super self::B::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   self::B local;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.outline.expect
index e4b381c..7db001d 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.outline.expect
@@ -22,7 +22,7 @@
   synthetic constructor •() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.strong.expect
index 1758b80..a6a2ebc 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.strong.expect
@@ -25,7 +25,7 @@
     : super self::B::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   self::B local;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.strong.transformed.expect
index 1758b80..a6a2ebc 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.strong.transformed.expect
@@ -25,7 +25,7 @@
     : super self::B::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   self::B local;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.expect
index cf78a86..a15f403 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.expect
@@ -47,6 +47,6 @@
     dynamic v7 = let final dynamic #t13 = t in let final dynamic #t14 = #t13.member in let final dynamic #t15 = #t13.member = #t14.-(1) in #t14;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.transformed.expect
index cf78a86..a15f403 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.transformed.expect
@@ -47,6 +47,6 @@
     dynamic v7 = let final dynamic #t13 = t in let final dynamic #t14 = #t13.member in let final dynamic #t15 = #t13.member = #t14.-(1) in #t14;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.outline.expect
index de60c09..c483408 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.outline.expect
@@ -29,7 +29,7 @@
   static method test(self::Test t) → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.strong.expect
index 0009111..a310675 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.strong.expect
@@ -47,6 +47,6 @@
     self::B v7 = let final self::Test #t13 = t in let final self::B #t14 = #t13.{self::Test::member} in let final self::B #t15 = #t13.{self::Test::member} = #t14.{self::B::-}(1) in #t14;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.strong.transformed.expect
index 0009111..a310675 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.strong.transformed.expect
@@ -47,6 +47,6 @@
     self::B v7 = let final self::Test #t13 = t in let final self::B #t14 = #t13.{self::Test::member} in let final self::B #t15 = #t13.{self::Test::member} = #t14.{self::B::-}(1) in #t14;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.expect
index 9e6a640..d006bf2 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.expect
@@ -47,6 +47,6 @@
     dynamic v7 = let final dynamic #t15 = t in #t15.==(null) ? null : let final dynamic #t16 = #t15.member in let final dynamic #t17 = #t15.member = #t16.-(1) in #t16;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.transformed.expect
index 9e6a640..d006bf2 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.transformed.expect
@@ -47,6 +47,6 @@
     dynamic v7 = let final dynamic #t15 = t in #t15.==(null) ? null : let final dynamic #t16 = #t15.member in let final dynamic #t17 = #t15.member = #t16.-(1) in #t16;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.outline.expect
index de60c09..c483408 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.outline.expect
@@ -29,7 +29,7 @@
   static method test(self::Test t) → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.strong.expect
index d13eac7..1fb2336 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.strong.expect
@@ -47,6 +47,6 @@
     self::B v7 = let final self::Test #t15 = t in #t15.==(null) ?{self::B} null : let final self::B #t16 = #t15.{self::Test::member} in let final self::B #t17 = #t15.{self::Test::member} = #t16.{self::B::-}(1) in #t16;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.strong.transformed.expect
index d13eac7..1fb2336 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.strong.transformed.expect
@@ -47,6 +47,6 @@
     self::B v7 = let final self::Test #t15 = t in #t15.==(null) ?{self::B} null : let final self::B #t16 = #t15.{self::Test::member} in let final self::B #t17 = #t15.{self::Test::member} = #t16.{self::B::-}(1) in #t16;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.expect
index ccc4134..ee3089f 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.expect
@@ -52,6 +52,6 @@
     dynamic v7 = let final dynamic #t2 = super.{self::Base::member} in let final dynamic #t3 = super.{self::Base::member} = #t2.-(1) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.transformed.expect
index ccc4134..ee3089f 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.transformed.expect
@@ -52,6 +52,6 @@
     dynamic v7 = let final dynamic #t2 = super.{self::Base::member} in let final dynamic #t3 = super.{self::Base::member} = #t2.-(1) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.outline.expect
index 077e4d6..8aa62bc 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.outline.expect
@@ -33,7 +33,7 @@
   method test() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.strong.expect
index 5963336..bb277ea 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.strong.expect
@@ -52,6 +52,6 @@
     self::B v7 = let final self::B #t2 = super.{self::Base::member} in let final self::B #t3 = super.{self::Base::member} = #t2.{self::B::-}(1) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.strong.transformed.expect
index 5963336..bb277ea 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.strong.transformed.expect
@@ -52,6 +52,6 @@
     self::B v7 = let final self::B #t2 = super.{self::Base::member} in let final self::B #t3 = super.{self::Base::member} = #t2.{self::B::-}(1) in #t2;
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.expect
index fa2ea61..7aa35c1 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.expect
@@ -27,7 +27,7 @@
     ;
 }
 static field self::B topLevelVariable;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test_topLevelVariable() → void {
   self::topLevelVariable = self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.transformed.expect
index fa2ea61..7aa35c1 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.transformed.expect
@@ -27,7 +27,7 @@
     ;
 }
 static field self::B topLevelVariable;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test_topLevelVariable() → void {
   self::topLevelVariable = self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.outline.expect
index e348b03..dca7f38 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.outline.expect
@@ -24,7 +24,7 @@
     ;
 }
 static field self::B topLevelVariable;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method test_topLevelVariable() → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.strong.expect
index 84c4d62..153a008 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.strong.expect
@@ -27,7 +27,7 @@
     ;
 }
 static field self::B topLevelVariable;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test_topLevelVariable() → void {
   self::topLevelVariable = self::f<self::B>();
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.strong.transformed.expect
index 84c4d62..153a008 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.strong.transformed.expect
@@ -27,7 +27,7 @@
     ;
 }
 static field self::B topLevelVariable;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test_topLevelVariable() → void {
   self::topLevelVariable = self::f<self::B>();
diff --git a/pkg/front_end/testcases/inference_new/infer_logical.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_logical.dart.direct.expect
index 02c47e9..4656afd 100644
--- a/pkg/front_end/testcases/inference_new/infer_logical.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_logical.dart.direct.expect
@@ -4,7 +4,7 @@
 
 static field dynamic x = self::f<dynamic>() || self::f<dynamic>();
 static field dynamic y = self::f<dynamic>() && self::f<dynamic>();
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   dynamic x = self::f<dynamic>() || self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference_new/infer_logical.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_logical.dart.direct.transformed.expect
index 02c47e9..4656afd 100644
--- a/pkg/front_end/testcases/inference_new/infer_logical.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_logical.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 static field dynamic x = self::f<dynamic>() || self::f<dynamic>();
 static field dynamic y = self::f<dynamic>() && self::f<dynamic>();
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   dynamic x = self::f<dynamic>() || self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference_new/infer_logical.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_logical.dart.outline.expect
index b13c369..a718af3 100644
--- a/pkg/front_end/testcases/inference_new/infer_logical.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_logical.dart.outline.expect
@@ -4,7 +4,7 @@
 
 static field dynamic x;
 static field dynamic y;
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_logical.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_logical.dart.strong.expect
index b5ead6e..1791f79 100644
--- a/pkg/front_end/testcases/inference_new/infer_logical.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_logical.dart.strong.expect
@@ -4,7 +4,7 @@
 
 static field core::bool x = self::f<core::bool>() || self::f<core::bool>();
 static field core::bool y = self::f<core::bool>() && self::f<core::bool>();
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   core::bool x = self::f<core::bool>() || self::f<core::bool>();
diff --git a/pkg/front_end/testcases/inference_new/infer_logical.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_logical.dart.strong.transformed.expect
index b5ead6e..1791f79 100644
--- a/pkg/front_end/testcases/inference_new/infer_logical.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_logical.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 static field core::bool x = self::f<core::bool>() || self::f<core::bool>();
 static field core::bool y = self::f<core::bool>() && self::f<core::bool>();
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   core::bool x = self::f<core::bool>() || self::f<core::bool>();
diff --git a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.expect b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.expect
index 1bb7b06..2599105 100644
--- a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.expect
@@ -48,7 +48,7 @@
     return null;
   set target(self::B value) → void {}
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test1(self::G g) → void {
   let final dynamic #t1 = g in #t1.target = #t1.target.*(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.transformed.expect
index 1bb7b06..2599105 100644
--- a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.transformed.expect
@@ -48,7 +48,7 @@
     return null;
   set target(self::B value) → void {}
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test1(self::G g) → void {
   let final dynamic #t1 = g in #t1.target = #t1.target.*(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.outline.expect b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.outline.expect
index b4b96d8..33e3444 100644
--- a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.outline.expect
@@ -42,7 +42,7 @@
   set target(self::B value) → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method test1(self::G g) → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.strong.expect b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.strong.expect
index 1bb49c8..c050b0a 100644
--- a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.strong.expect
@@ -48,7 +48,7 @@
     return null;
   set target(self::B value) → void {}
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test1(self::G g) → void {
   let final self::G #t1 = g in #t1.{self::G::target} = #t1.{self::G::target}.{self::A::*}(self::f<dynamic>() as{TypeError} self::D);
diff --git a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.strong.transformed.expect
index 1bb49c8..c050b0a 100644
--- a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.strong.transformed.expect
@@ -48,7 +48,7 @@
     return null;
   set target(self::B value) → void {}
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test1(self::G g) → void {
   let final self::G #t1 = g in #t1.{self::G::target} = #t1.{self::G::target}.{self::A::*}(self::f<dynamic>() as{TypeError} self::D);
diff --git a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.expect b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.expect
index 3b7b792..6513a99 100644
--- a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.expect
@@ -40,7 +40,7 @@
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static get target() → self::A
   return null;
diff --git a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.transformed.expect
index 3b7b792..6513a99 100644
--- a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.transformed.expect
@@ -40,7 +40,7 @@
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static get target() → self::A
   return null;
diff --git a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.outline.expect b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.outline.expect
index 1e63c29..2642de0 100644
--- a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.outline.expect
@@ -34,7 +34,7 @@
   synthetic constructor •() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static get target() → self::A
   ;
diff --git a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.strong.expect b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.strong.expect
index e2277e6..77baa37 100644
--- a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.strong.expect
@@ -40,7 +40,7 @@
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static get target() → self::A
   return null;
diff --git a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.strong.transformed.expect
index e2277e6..77baa37 100644
--- a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.strong.transformed.expect
@@ -40,7 +40,7 @@
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static get target() → self::A
   return null;
diff --git a/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.expect b/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.expect
index d30ced1..65b823a 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.expect
@@ -19,6 +19,6 @@
     dynamic x = super.{self::B::[]}(self::f<dynamic>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.transformed.expect
index d30ced1..65b823a 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.transformed.expect
@@ -19,6 +19,6 @@
     dynamic x = super.{self::B::[]}(self::f<dynamic>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/super_index_get.dart.outline.expect b/pkg/front_end/testcases/inference_new/super_index_get.dart.outline.expect
index 662ebfe..ee2a715 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get.dart.outline.expect
@@ -16,7 +16,7 @@
   method h() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/super_index_get.dart.strong.expect b/pkg/front_end/testcases/inference_new/super_index_get.dart.strong.expect
index 78e7bfb..4f219d0 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get.dart.strong.expect
@@ -19,6 +19,6 @@
     core::num x = super.{self::B::[]}(self::f<core::int>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/super_index_get.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/super_index_get.dart.strong.transformed.expect
index 78e7bfb..4f219d0 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get.dart.strong.transformed.expect
@@ -19,6 +19,6 @@
     core::num x = super.{self::B::[]}(self::f<core::int>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.expect b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.expect
index ee237ad..dd25816 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   operator [](self::E<self::B::T> x) → self::D<self::B::T>
     return null;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
@@ -30,6 +30,6 @@
     dynamic x = super.{self::B::[]}(self::f<dynamic>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.transformed.expect
index ee237ad..dd25816 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.transformed.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   operator [](self::E<self::B::T> x) → self::D<self::B::T>
     return null;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
@@ -30,6 +30,6 @@
     dynamic x = super.{self::B::[]}(self::f<dynamic>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.outline.expect b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.outline.expect
index 469ee7f..89cded9 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.outline.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   operator [](self::E<self::B::T> x) → self::D<self::B::T>
     ;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     ;
   operator [](core::Object x) → self::E<asy::Future<self::C::U>>
@@ -25,7 +25,7 @@
   method h() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.strong.expect b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.strong.expect
index b061ba0..b94dffa 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.strong.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   operator [](generic-covariant-impl generic-covariant-interface self::E<self::B::T> x) → self::D<self::B::T>
     return null;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
@@ -30,6 +30,6 @@
     self::D<asy::Future<self::C::U>> x = super.{self::B::[]}(self::f<self::E<asy::Future<self::C::U>>>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.strong.transformed.expect
index b061ba0..b94dffa 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.strong.transformed.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 import "dart:async" as asy;
 
-class D<T extends core::Object> extends core::Object {
+class D<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object> extends self::D<self::E::T> {
+class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
   synthetic constructor •() → void
     : super self::D::•()
     ;
 }
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   operator [](generic-covariant-impl generic-covariant-interface self::E<self::B::T> x) → self::D<self::B::T>
     return null;
 }
-class C<U extends core::Object> extends self::B<asy::Future<self::C::U>> {
+class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
@@ -30,6 +30,6 @@
     self::D<asy::Future<self::C::U>> x = super.{self::B::[]}(self::f<self::E<asy::Future<self::C::U>>>());
   }
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/switch.dart.direct.expect b/pkg/front_end/testcases/inference_new/switch.dart.direct.expect
index 2cafaef..e90c140 100644
--- a/pkg/front_end/testcases/inference_new/switch.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/switch.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   const constructor •() → void
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test(self::C<core::int> x) → void {
   #L1:
diff --git a/pkg/front_end/testcases/inference_new/switch.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/switch.dart.direct.transformed.expect
index 2cafaef..e90c140 100644
--- a/pkg/front_end/testcases/inference_new/switch.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/switch.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   const constructor •() → void
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test(self::C<core::int> x) → void {
   #L1:
diff --git a/pkg/front_end/testcases/inference_new/switch.dart.outline.expect b/pkg/front_end/testcases/inference_new/switch.dart.outline.expect
index 052db93..9cbe2f4 100644
--- a/pkg/front_end/testcases/inference_new/switch.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/switch.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   const constructor •() → void
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method test(self::C<core::int> x) → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/switch.dart.strong.expect b/pkg/front_end/testcases/inference_new/switch.dart.strong.expect
index 1c6f5e5..5bb4779 100644
--- a/pkg/front_end/testcases/inference_new/switch.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/switch.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   const constructor •() → void
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test(self::C<core::int> x) → void {
   #L1:
diff --git a/pkg/front_end/testcases/inference_new/switch.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/switch.dart.strong.transformed.expect
index 1c6f5e5..5bb4779 100644
--- a/pkg/front_end/testcases/inference_new/switch.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/switch.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   const constructor •() → void
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test(self::C<core::int> x) → void {
   #L1:
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.expect
index db7a7bd..9c67644 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.expect
@@ -5,7 +5,7 @@
 static field dynamic v = self::f.call(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.transformed.expect
index db7a7bd..9c67644 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 static field dynamic v = self::f.call(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect
index 6b93fcc..49b1ecf 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic v;
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.expect
index 5c16415..cd480b4 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.expect
@@ -5,7 +5,7 @@
 static field core::List<core::int> v = self::f.call<core::int>(() → core::int {
   return 1;
 });
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.transformed.expect
index 5c16415..cd480b4 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.transformed.expect
@@ -5,7 +5,7 @@
 static field core::List<core::int> v = self::f.call<core::int>(() → core::int {
   return 1;
 });
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.expect
index db7a7bd..9c67644 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.expect
@@ -5,7 +5,7 @@
 static field dynamic v = self::f.call(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.transformed.expect
index db7a7bd..9c67644 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 static field dynamic v = self::f.call(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect
index 6b93fcc..49b1ecf 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic v;
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.expect
index 5c16415..cd480b4 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.expect
@@ -5,7 +5,7 @@
 static field core::List<core::int> v = self::f.call<core::int>(() → core::int {
   return 1;
 });
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.transformed.expect
index 5c16415..cd480b4 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.transformed.expect
@@ -5,7 +5,7 @@
 static field core::List<core::int> v = self::f.call<core::int>(() → core::int {
   return 1;
 });
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.direct.expect b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.direct.expect
index 9a95c8a..f799565 100644
--- a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic y = self::run<dynamic>(self::printRunning);
-static method run<T extends core::Object>(() → self::run::T f) → self::run::T {
+static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T {
   core::print("running");
   dynamic t = f.call();
   core::print("done running");
diff --git a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.direct.transformed.expect
index 9a95c8a..f799565 100644
--- a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic y = self::run<dynamic>(self::printRunning);
-static method run<T extends core::Object>(() → self::run::T f) → self::run::T {
+static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T {
   core::print("running");
   dynamic t = f.call();
   core::print("done running");
diff --git a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.outline.expect b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.outline.expect
index c3364c8..4834b17 100644
--- a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic y;
-static method run<T extends core::Object>(() → self::run::T f) → self::run::T
+static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T
   ;
 static method printRunning() → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.strong.expect b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.strong.expect
index fc015dc..5417786 100644
--- a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field void y = self::run<void>(self::printRunning);
-static method run<T extends core::Object>(() → self::run::T f) → self::run::T {
+static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T {
   core::print("running");
   self::run::T t = f.call();
   core::print("done running");
diff --git a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.strong.transformed.expect
index fc015dc..5417786 100644
--- a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field void y = self::run<void>(self::printRunning);
-static method run<T extends core::Object>(() → self::run::T f) → self::run::T {
+static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T {
   core::print("running");
   self::run::T t = f.call();
   core::print("done running");
diff --git a/pkg/front_end/testcases/inference_new/while_loop.dart.direct.expect b/pkg/front_end/testcases/inference_new/while_loop.dart.direct.expect
index 93db6ac0..5f1da21 100644
--- a/pkg/front_end/testcases/inference_new/while_loop.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/while_loop.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   while (self::f<dynamic>()) {
diff --git a/pkg/front_end/testcases/inference_new/while_loop.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/while_loop.dart.direct.transformed.expect
index 93db6ac0..5f1da21 100644
--- a/pkg/front_end/testcases/inference_new/while_loop.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/while_loop.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   while (self::f<dynamic>()) {
diff --git a/pkg/front_end/testcases/inference_new/while_loop.dart.outline.expect b/pkg/front_end/testcases/inference_new/while_loop.dart.outline.expect
index ac49c9e..e8c03c5 100644
--- a/pkg/front_end/testcases/inference_new/while_loop.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/while_loop.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/while_loop.dart.strong.expect b/pkg/front_end/testcases/inference_new/while_loop.dart.strong.expect
index 411b444..a2d0208 100644
--- a/pkg/front_end/testcases/inference_new/while_loop.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/while_loop.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   while (self::f<core::bool>()) {
diff --git a/pkg/front_end/testcases/inference_new/while_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/while_loop.dart.strong.transformed.expect
index 411b444..a2d0208 100644
--- a/pkg/front_end/testcases/inference_new/while_loop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/while_loop.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object>() → self::f::T
+static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → void {
   while (self::f<core::bool>()) {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.expect
index 90d33dd..f767cb7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>, Y extends self::C<self::D::X, self::D::Y>, Z extends (self::D::Y) → self::D::X, W extends core::num> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic, Z extends (self::D::Y) → self::D::X = dynamic, W extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.transformed.expect
index 90d33dd..f767cb7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>, Y extends self::C<self::D::X, self::D::Y>, Z extends (self::D::Y) → self::D::X, W extends core::num> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic, Z extends (self::D::Y) → self::D::X = dynamic, W extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
index 8f375f5..57cce0b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>, Y extends self::C<self::D::X, self::D::Y>, Z extends (self::D::Y) → self::D::X, W extends core::num> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic, Z extends (self::D::Y) → self::D::X = dynamic, W extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect
index e209715..0d386e5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>, Y extends self::C<self::D::X, self::D::Y>, Z extends (self::D::Y) → self::D::X, W extends core::num> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y> = self::B<dynamic, dynamic>, Y extends self::C<self::D::X, self::D::Y> = self::C<dynamic, dynamic>, Z extends (self::D::Y) → self::D::X = (core::Null) → self::B<dynamic, dynamic>, W extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect
index e209715..0d386e5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>, Y extends self::C<self::D::X, self::D::Y>, Z extends (self::D::Y) → self::D::X, W extends core::num> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y> = self::B<dynamic, dynamic>, Y extends self::C<self::D::X, self::D::Y> = self::C<dynamic, dynamic>, Z extends (self::D::Y) → self::D::X = (core::Null) → self::B<dynamic, dynamic>, W extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.expect
index 473030f..39c01de 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.transformed.expect
index 473030f..39c01de 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.outline.expect
index e894545..265f85f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.expect
index 7f1bc8a..0d74fd8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.transformed.expect
index 7f1bc8a..0d74fd8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.expect
index b96b592..ee479f2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<U extends core::Object> extends core::Object {
+class B<U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.transformed.expect
index b96b592..ee479f2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<U extends core::Object> extends core::Object {
+class B<U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.outline.expect
index 73d2f33..4de7478 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class B<U extends core::Object> extends core::Object {
+class B<U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method fun() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.expect
index b96b592..ee479f2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<U extends core::Object> extends core::Object {
+class B<U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.transformed.expect
index b96b592..ee479f2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<U extends core::Object> extends core::Object {
+class B<U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.expect
index 571bb1b..fa8a1cd 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.transformed.expect
index 571bb1b..fa8a1cd 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.outline.expect
index e894545..265f85f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.expect
index 7a9a472..9da4319 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.transformed.expect
index 7a9a472..9da4319 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.expect
index b7936f1..d8c6ef0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.transformed.expect
index b7936f1..d8c6ef0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.outline.expect
index 09674b8..5eaaf89 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.expect
index b7936f1..d8c6ef0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.transformed.expect
index b7936f1..d8c6ef0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.expect
index 174756c..45a4ce3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T>> extends core::Object {
+class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.transformed.expect
index 174756c..45a4ce3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T>> extends core::Object {
+class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.outline.expect
index 4d3d1cf..4c18033 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T>> extends core::Object {
+class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.expect
index 3657fb3..dca475f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T>> extends core::Object {
+class A<T extends self::A<self::A::T> = self::A<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.transformed.expect
index 3657fb3..dca475f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T>> extends core::Object {
+class A<T extends self::A<self::A::T> = self::A<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.expect
index 7d3b891..a1a10da 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.transformed.expect
index 7d3b891..a1a10da 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.outline.expect
index 145b481..ad8fcd8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.expect
index 00162ec..a2b129b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = core::num> = (T) → dynamic;
 class B extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.transformed.expect
index 00162ec..a2b129b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = core::num> = (T) → dynamic;
 class B extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.expect
index 52cb506..02da85f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
-class B<U extends core::Object> extends core::Object {
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+class B<U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.transformed.expect
index 52cb506..02da85f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
-class B<U extends core::Object> extends core::Object {
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+class B<U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.outline.expect
index 540d4a9..73418c3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
-class B<U extends core::Object> extends core::Object {
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+class B<U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method fun() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.expect
index 52cb506..02da85f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
-class B<U extends core::Object> extends core::Object {
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+class B<U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.transformed.expect
index 52cb506..02da85f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
-class B<U extends core::Object> extends core::Object {
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+class B<U extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.expect
index fd38c09..939111c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.transformed.expect
index fd38c09..939111c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.outline.expect
index 145b481..ad8fcd8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.expect
index f63ba9a..d8117ee 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = core::num> = (T) → dynamic;
 class B extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.transformed.expect
index f63ba9a..d8117ee 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = core::num> = (T) → dynamic;
 class B extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.expect
index ff7a612..e707e98 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.transformed.expect
index ff7a612..e707e98 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.outline.expect
index 3c49af3..1796d4d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.expect
index ff7a612..e707e98 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.transformed.expect
index ff7a612..e707e98 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.expect
index 1712b9b..9471d94 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
-typedef B<U extends (U) → dynamic> = (U) → dynamic;
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef B<U extends (U) → dynamic = dynamic> = (U) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.transformed.expect
index 1712b9b..9471d94 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
-typedef B<U extends (U) → dynamic> = (U) → dynamic;
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef B<U extends (U) → dynamic = dynamic> = (U) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.outline.expect
index 78f47f1..f49fc49 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
-typedef B<U extends (U) → dynamic> = (U) → dynamic;
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef B<U extends (U) → dynamic = dynamic> = (U) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.expect
index b2e548c..64da62b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num, Y extends (self::C::X) → void> extends core::Object {
+class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.transformed.expect
index b2e548c..64da62b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num, Y extends (self::C::X) → void> extends core::Object {
+class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
index 79ffb56..3eb7ec4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num, Y extends (self::C::X) → void> extends core::Object {
+class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.expect
index 7752f4e..db904c5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num, Y extends (self::C::X) → void> extends core::Object {
+class C<X extends core::num = core::num, Y extends (self::C::X) → void = (core::Null) → void> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.transformed.expect
index 7752f4e..db904c5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num, Y extends (self::C::X) → void> extends core::Object {
+class C<X extends core::num = core::num, Y extends (self::C::X) → void = (core::Null) → void> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.expect
index 88dc108..769b44d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num, Y extends (self::C::X) → void> extends core::Object {
+class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.transformed.expect
index 88dc108..769b44d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num, Y extends (self::C::X) → void> extends core::Object {
+class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
index 4c67675..17ae19a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num, Y extends (self::C::X) → void> extends core::Object {
+class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.expect
index a18fd3d..df12d4d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num, Y extends (self::C::X) → void> extends core::Object {
+class C<X extends core::num = core::num, Y extends (self::C::X) → void = (core::Null) → void> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.transformed.expect
index a18fd3d..df12d4d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num, Y extends (self::C::X) → void> extends core::Object {
+class C<X extends core::num = core::num, Y extends (self::C::X) → void = (core::Null) → void> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.expect
index 17cca3b..3f02fe8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void, Y extends (self::D::X, self::D::Y) → void> extends core::Object {
+class D<X extends (self::D::X, self::D::Y) → void = dynamic, Y extends (self::D::X, self::D::Y) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → void> extends core::Object {
+class E<X extends (self::E::X) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.transformed.expect
index 17cca3b..3f02fe8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void, Y extends (self::D::X, self::D::Y) → void> extends core::Object {
+class D<X extends (self::D::X, self::D::Y) → void = dynamic, Y extends (self::D::X, self::D::Y) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → void> extends core::Object {
+class E<X extends (self::E::X) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
index fe0a77b..d10f5b4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void, Y extends (self::D::X, self::D::Y) → void> extends core::Object {
+class D<X extends (self::D::X, self::D::Y) → void = dynamic, Y extends (self::D::X, self::D::Y) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class E<X extends (self::E::X) → void> extends core::Object {
+class E<X extends (self::E::X) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.expect
index b3fcc39..484914d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void, Y extends (self::D::X, self::D::Y) → void> extends core::Object {
+class D<X extends (self::D::X, self::D::Y) → void = (core::Null, core::Null) → void, Y extends (self::D::X, self::D::Y) → void = (core::Null, core::Null) → void> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → void> extends core::Object {
+class E<X extends (self::E::X) → void = (core::Null) → void> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.transformed.expect
index b3fcc39..484914d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void, Y extends (self::D::X, self::D::Y) → void> extends core::Object {
+class D<X extends (self::D::X, self::D::Y) → void = (core::Null, core::Null) → void, Y extends (self::D::X, self::D::Y) → void = (core::Null, core::Null) → void> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → void> extends core::Object {
+class E<X extends (self::E::X) → void = (core::Null) → void> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.expect
index 803b7ee..d1dd2cb 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void, Y extends (self::D::X, self::D::Y) → void> extends core::Object {
+class D<X extends (self::D::X, self::D::Y) → void = dynamic, Y extends (self::D::X, self::D::Y) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → void> extends core::Object {
+class E<X extends (self::E::X) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.transformed.expect
index 803b7ee..d1dd2cb 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void, Y extends (self::D::X, self::D::Y) → void> extends core::Object {
+class D<X extends (self::D::X, self::D::Y) → void = dynamic, Y extends (self::D::X, self::D::Y) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → void> extends core::Object {
+class E<X extends (self::E::X) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
index 4006f50..638b8fc 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void, Y extends (self::D::X, self::D::Y) → void> extends core::Object {
+class D<X extends (self::D::X, self::D::Y) → void = dynamic, Y extends (self::D::X, self::D::Y) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class E<X extends (self::E::X) → void> extends core::Object {
+class E<X extends (self::E::X) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.expect
index 1797ecd..4a12d44 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void, Y extends (self::D::X, self::D::Y) → void> extends core::Object {
+class D<X extends (self::D::X, self::D::Y) → void = (core::Null, core::Null) → void, Y extends (self::D::X, self::D::Y) → void = (core::Null, core::Null) → void> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → void> extends core::Object {
+class E<X extends (self::E::X) → void = (core::Null) → void> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.transformed.expect
index 1797ecd..4a12d44 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void, Y extends (self::D::X, self::D::Y) → void> extends core::Object {
+class D<X extends (self::D::X, self::D::Y) → void = (core::Null, core::Null) → void, Y extends (self::D::X, self::D::Y) → void = (core::Null, core::Null) → void> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → void> extends core::Object {
+class E<X extends (self::E::X) → void = (core::Null) → void> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.expect
index 2d50f0b..6c05a05 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends self::A<self::C::X>> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends self::A<self::C::X> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends core::num, Y extends self::A<self::D::X>> extends core::Object {
+class D<X extends core::num = dynamic, Y extends self::A<self::D::X> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends core::Object, Y extends () → self::E::X> extends core::Object {
+class E<X extends core::Object = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<X extends core::num, Y extends () → self::F::X> extends core::Object {
+class F<X extends core::num = dynamic, Y extends () → self::F::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.transformed.expect
index 2d50f0b..6c05a05 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends self::A<self::C::X>> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends self::A<self::C::X> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends core::num, Y extends self::A<self::D::X>> extends core::Object {
+class D<X extends core::num = dynamic, Y extends self::A<self::D::X> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends core::Object, Y extends () → self::E::X> extends core::Object {
+class E<X extends core::Object = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<X extends core::num, Y extends () → self::F::X> extends core::Object {
+class F<X extends core::num = dynamic, Y extends () → self::F::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.outline.expect
index cca8bfd..5056d3f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.outline.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class C<X extends core::Object, Y extends self::A<self::C::X>> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends self::A<self::C::X> = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class D<X extends core::num, Y extends self::A<self::D::X>> extends core::Object {
+class D<X extends core::num = dynamic, Y extends self::A<self::D::X> = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class E<X extends core::Object, Y extends () → self::E::X> extends core::Object {
+class E<X extends core::Object = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class F<X extends core::num, Y extends () → self::F::X> extends core::Object {
+class F<X extends core::num = dynamic, Y extends () → self::F::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.strong.expect
index dfad499..9f14994 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.strong.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends self::A<self::C::X>> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends self::A<self::C::X> = self::A<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends core::num, Y extends self::A<self::D::X>> extends core::Object {
+class D<X extends core::num = core::num, Y extends self::A<self::D::X> = self::A<core::num>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends core::Object, Y extends () → self::E::X> extends core::Object {
+class E<X extends core::Object = dynamic, Y extends () → self::E::X = () → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<X extends core::num, Y extends () → self::F::X> extends core::Object {
+class F<X extends core::num = core::num, Y extends () → self::F::X = () → core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.strong.transformed.expect
index dfad499..9f14994 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.strong.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends self::A<self::C::X>> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends self::A<self::C::X> = self::A<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends core::num, Y extends self::A<self::D::X>> extends core::Object {
+class D<X extends core::num = core::num, Y extends self::A<self::D::X> = self::A<core::num>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends core::Object, Y extends () → self::E::X> extends core::Object {
+class E<X extends core::Object = dynamic, Y extends () → self::E::X = () → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<X extends core::num, Y extends () → self::F::X> extends core::Object {
+class F<X extends core::num = core::num, Y extends () → self::F::X = () → core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.expect
index f3f4e88..f3ff161 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends self::A<self::C::X>> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends self::A<self::C::X> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends core::num, Y extends self::A<self::D::X>> extends core::Object {
+class D<X extends core::num = dynamic, Y extends self::A<self::D::X> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends core::Object, Y extends () → self::E::X> extends core::Object {
+class E<X extends core::Object = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<X extends core::num, Y extends () → self::F::X> extends core::Object {
+class F<X extends core::num = dynamic, Y extends () → self::F::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.transformed.expect
index f3f4e88..f3ff161 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends self::A<self::C::X>> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends self::A<self::C::X> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends core::num, Y extends self::A<self::D::X>> extends core::Object {
+class D<X extends core::num = dynamic, Y extends self::A<self::D::X> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends core::Object, Y extends () → self::E::X> extends core::Object {
+class E<X extends core::Object = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<X extends core::num, Y extends () → self::F::X> extends core::Object {
+class F<X extends core::num = dynamic, Y extends () → self::F::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.outline.expect
index 004ef30..59670f0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.outline.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class C<X extends core::Object, Y extends self::A<self::C::X>> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends self::A<self::C::X> = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class D<X extends core::num, Y extends self::A<self::D::X>> extends core::Object {
+class D<X extends core::num = dynamic, Y extends self::A<self::D::X> = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class E<X extends core::Object, Y extends () → self::E::X> extends core::Object {
+class E<X extends core::Object = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class F<X extends core::num, Y extends () → self::F::X> extends core::Object {
+class F<X extends core::num = dynamic, Y extends () → self::F::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.strong.expect
index e2ae82b..c158c43 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.strong.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends self::A<self::C::X>> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends self::A<self::C::X> = self::A<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends core::num, Y extends self::A<self::D::X>> extends core::Object {
+class D<X extends core::num = core::num, Y extends self::A<self::D::X> = self::A<core::num>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends core::Object, Y extends () → self::E::X> extends core::Object {
+class E<X extends core::Object = dynamic, Y extends () → self::E::X = () → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<X extends core::num, Y extends () → self::F::X> extends core::Object {
+class F<X extends core::num = core::num, Y extends () → self::F::X = () → core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.strong.transformed.expect
index e2ae82b..c158c43 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.strong.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends self::A<self::C::X>> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends self::A<self::C::X> = self::A<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends core::num, Y extends self::A<self::D::X>> extends core::Object {
+class D<X extends core::num = core::num, Y extends self::A<self::D::X> = self::A<core::num>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends core::Object, Y extends () → self::E::X> extends core::Object {
+class E<X extends core::Object = dynamic, Y extends () → self::E::X = () → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<X extends core::num, Y extends () → self::F::X> extends core::Object {
+class F<X extends core::num = core::num, Y extends () → self::F::X = () → core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.expect
index d6cc852..b4a02a0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>, Y extends self::C<self::D::X, self::D::Y>> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y>, Y extends () → self::E::X> extends core::Object {
+class E<X extends self::B<self::E::X, self::E::Y> = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<X extends () → self::F::X> extends core::Object {
+class F<X extends () → self::F::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.transformed.expect
index d6cc852..b4a02a0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>, Y extends self::C<self::D::X, self::D::Y>> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y>, Y extends () → self::E::X> extends core::Object {
+class E<X extends self::B<self::E::X, self::E::Y> = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<X extends () → self::F::X> extends core::Object {
+class F<X extends () → self::F::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.outline.expect
index cd39a20..11e2058 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.outline.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>, Y extends self::C<self::D::X, self::D::Y>> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y>, Y extends () → self::E::X> extends core::Object {
+class E<X extends self::B<self::E::X, self::E::Y> = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class F<X extends () → self::F::X> extends core::Object {
+class F<X extends () → self::F::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.strong.expect
index 1ebe886..ef9bb81 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.strong.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>, Y extends self::C<self::D::X, self::D::Y>> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y> = self::B<dynamic, dynamic>, Y extends self::C<self::D::X, self::D::Y> = self::C<dynamic, dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y>, Y extends () → self::E::X> extends core::Object {
+class E<X extends self::B<self::E::X, self::E::Y> = self::B<dynamic, dynamic>, Y extends () → self::E::X = () → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<X extends () → self::F::X> extends core::Object {
+class F<X extends () → self::F::X = () → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.strong.transformed.expect
index 1ebe886..ef9bb81 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.strong.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>, Y extends self::C<self::D::X, self::D::Y>> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y> = self::B<dynamic, dynamic>, Y extends self::C<self::D::X, self::D::Y> = self::C<dynamic, dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y>, Y extends () → self::E::X> extends core::Object {
+class E<X extends self::B<self::E::X, self::E::Y> = self::B<dynamic, dynamic>, Y extends () → self::E::X = () → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<X extends () → self::F::X> extends core::Object {
+class F<X extends () → self::F::X = () → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.expect
index bc1bfe2..30cbae9 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>, Y extends self::C<self::D::X, self::D::Y>> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y>, Y extends () → self::E::X> extends core::Object {
+class E<X extends self::B<self::E::X, self::E::Y> = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<X extends () → self::F::X> extends core::Object {
+class F<X extends () → self::F::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.transformed.expect
index bc1bfe2..30cbae9 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>, Y extends self::C<self::D::X, self::D::Y>> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y>, Y extends () → self::E::X> extends core::Object {
+class E<X extends self::B<self::E::X, self::E::Y> = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<X extends () → self::F::X> extends core::Object {
+class F<X extends () → self::F::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.outline.expect
index fb41cb5..9cd5b0b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.outline.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>, Y extends self::C<self::D::X, self::D::Y>> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y>, Y extends () → self::E::X> extends core::Object {
+class E<X extends self::B<self::E::X, self::E::Y> = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class F<X extends () → self::F::X> extends core::Object {
+class F<X extends () → self::F::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.strong.expect
index 5dd347a..9579477 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.strong.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>, Y extends self::C<self::D::X, self::D::Y>> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y> = self::B<dynamic, dynamic>, Y extends self::C<self::D::X, self::D::Y> = self::C<dynamic, dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y>, Y extends () → self::E::X> extends core::Object {
+class E<X extends self::B<self::E::X, self::E::Y> = self::B<dynamic, dynamic>, Y extends () → self::E::X = () → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<X extends () → self::F::X> extends core::Object {
+class F<X extends () → self::F::X = () → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.strong.transformed.expect
index 5dd347a..9579477 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.strong.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>, Y extends self::C<self::D::X, self::D::Y>> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y> = self::B<dynamic, dynamic>, Y extends self::C<self::D::X, self::D::Y> = self::C<dynamic, dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y>, Y extends () → self::E::X> extends core::Object {
+class E<X extends self::B<self::E::X, self::E::Y> = self::B<dynamic, dynamic>, Y extends () → self::E::X = () → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<X extends () → self::F::X> extends core::Object {
+class F<X extends () → self::F::X = () → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.expect
index 50c5cd5..8a75651 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends (self::C::X) → self::C::X> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends core::num, Y extends (self::D::X) → self::D::X> extends core::Object {
+class D<X extends core::num = dynamic, Y extends (self::D::X) → self::D::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.transformed.expect
index 50c5cd5..8a75651 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends (self::C::X) → self::C::X> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends core::num, Y extends (self::D::X) → self::D::X> extends core::Object {
+class D<X extends core::num = dynamic, Y extends (self::D::X) → self::D::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
index 3bfdc8a..830d760 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class C<X extends core::Object, Y extends (self::C::X) → self::C::X> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class D<X extends core::num, Y extends (self::D::X) → self::D::X> extends core::Object {
+class D<X extends core::num = dynamic, Y extends (self::D::X) → self::D::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.expect
index 5e74c50..b12947d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends (self::C::X) → self::C::X> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends core::num, Y extends (self::D::X) → self::D::X> extends core::Object {
+class D<X extends core::num = core::num, Y extends (self::D::X) → self::D::X = (core::Null) → core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.transformed.expect
index 5e74c50..b12947d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends (self::C::X) → self::C::X> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends core::num, Y extends (self::D::X) → self::D::X> extends core::Object {
+class D<X extends core::num = core::num, Y extends (self::D::X) → self::D::X = (core::Null) → core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.expect
index 3d63194..a5b5d59 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends (self::C::X) → self::C::X> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends core::num, Y extends (self::D::X) → self::D::X> extends core::Object {
+class D<X extends core::num = dynamic, Y extends (self::D::X) → self::D::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.transformed.expect
index 3d63194..a5b5d59 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends (self::C::X) → self::C::X> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends core::num, Y extends (self::D::X) → self::D::X> extends core::Object {
+class D<X extends core::num = dynamic, Y extends (self::D::X) → self::D::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
index 20f0f48..dbc3047 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class C<X extends core::Object, Y extends (self::C::X) → self::C::X> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class D<X extends core::num, Y extends (self::D::X) → self::D::X> extends core::Object {
+class D<X extends core::num = dynamic, Y extends (self::D::X) → self::D::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.expect
index 454cf25..2e7c48b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends (self::C::X) → self::C::X> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends core::num, Y extends (self::D::X) → self::D::X> extends core::Object {
+class D<X extends core::num = core::num, Y extends (self::D::X) → self::D::X = (core::Null) → core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.transformed.expect
index 454cf25..2e7c48b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends (self::C::X) → self::C::X> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends core::num, Y extends (self::D::X) → self::D::X> extends core::Object {
+class D<X extends core::num = core::num, Y extends (self::D::X) → self::D::X = (core::Null) → core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.direct.expect
index 2a54655..a3c9999 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.direct.expect
@@ -2,5 +2,5 @@
 import self as self;
 import "dart:collection" as col;
 
-static field col::LinkedListEntry<col::LinkedListEntry<dynamic>> y;
+static field col::LinkedListEntry<dynamic> y;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.direct.transformed.expect
index 2a54655..a3c9999 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.direct.transformed.expect
@@ -2,5 +2,5 @@
 import self as self;
 import "dart:collection" as col;
 
-static field col::LinkedListEntry<col::LinkedListEntry<dynamic>> y;
+static field col::LinkedListEntry<dynamic> y;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.outline.expect
index e9f3933..de12238 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.outline.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:collection" as col;
 
-static field col::LinkedListEntry<col::LinkedListEntry<dynamic>> y;
+static field col::LinkedListEntry<dynamic> y;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.expect
index a268770..8ab5904 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.transformed.expect
index a268770..8ab5904 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.outline.expect
index 4bea4fc..1cc5b2f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.strong.expect
index b63980f..73b735f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.strong.transformed.expect
index b63980f..73b735f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.expect
index 7d9fe60..27905d6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.transformed.expect
index 7d9fe60..27905d6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.outline.expect
index 4bea4fc..1cc5b2f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.expect
index bf8ac07..122f608 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.transformed.expect
index bf8ac07..122f608 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.expect
index 964c2f9..5072d9a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends core::num, S extends core::List<self::B::T>> extends self::A<self::B::T> {
+class B<T extends core::num = dynamic, S extends core::List<self::B::T> = dynamic> extends self::A<self::B::T> {
   constructor •([self::B::T x = null]) → void
     : super self::A::•() {}
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.transformed.expect
index 964c2f9..5072d9a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends core::num, S extends core::List<self::B::T>> extends self::A<self::B::T> {
+class B<T extends core::num = dynamic, S extends core::List<self::B::T> = dynamic> extends self::A<self::B::T> {
   constructor •([self::B::T x = null]) → void
     : super self::A::•() {}
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.outline.expect
index feaa0f3..25e2d3a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class B<T extends core::num, S extends core::List<self::B::T>> extends self::A<self::B::T> {
+class B<T extends core::num = dynamic, S extends core::List<self::B::T> = dynamic> extends self::A<self::B::T> {
   constructor •([self::B::T x]) → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.strong.expect
index cf6dc06..2851c1c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends core::num, S extends core::List<self::B::T>> extends self::A<self::B::T> {
+class B<T extends core::num = core::num, S extends core::List<self::B::T> = core::List<core::num>> extends self::A<self::B::T> {
   constructor •([self::B::T x = null]) → void
     : super self::A::•() {}
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.strong.transformed.expect
index cf6dc06..2851c1c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends core::num, S extends core::List<self::B::T>> extends self::A<self::B::T> {
+class B<T extends core::num = core::num, S extends core::List<self::B::T> = core::List<core::num>> extends self::A<self::B::T> {
   constructor •([self::B::T x = null]) → void
     : super self::A::•() {}
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.expect
index b7dd39e..7c07c34 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Comparable<self::B::T>> extends core::Object {
+class B<T extends core::Comparable<self::B::T> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.transformed.expect
index b7dd39e..7c07c34 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Comparable<self::B::T>> extends core::Object {
+class B<T extends core::Comparable<self::B::T> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.outline.expect
index 50dad2d..99fed4d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Comparable<self::B::T>> extends core::Object {
+class B<T extends core::Comparable<self::B::T> = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.expect
index c3b6891..893b908 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Comparable<self::B::T>> extends core::Object {
+class B<T extends core::Comparable<self::B::T> = core::Comparable<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect
index c3b6891..893b908 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Comparable<self::B::T>> extends core::Object {
+class B<T extends core::Comparable<self::B::T> = core::Comparable<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.expect
index f455106..7e7802f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.transformed.expect
index f455106..7e7802f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.outline.expect
index 792d380..8d47cf3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.expect
index 8b8b879..2dbd3fa 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.transformed.expect
index 8b8b879..2dbd3fa 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.expect
index 4d4eb3a..752d9aa 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.transformed.expect
index 4d4eb3a..752d9aa 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.outline.expect
index 303959e..b6268f4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.expect
index e031824..bae54a3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.transformed.expect
index e031824..bae54a3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.expect
index 7c0008d..513f483 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<S extends core::Object> extends core::Object {
+class B<S extends core::Object = dynamic> extends core::Object {
   final field core::List<self::A<self::B::S>> foo = <self::A<self::B::S>>[];
   final field core::List<self::A<core::num>> bar = <self::A<core::num>>[];
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.transformed.expect
index 7c0008d..513f483 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<S extends core::Object> extends core::Object {
+class B<S extends core::Object = dynamic> extends core::Object {
   final field core::List<self::A<self::B::S>> foo = <self::A<self::B::S>>[];
   final field core::List<self::A<core::num>> bar = <self::A<core::num>>[];
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.outline.expect
index 30f1130..c839345 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class B<S extends core::Object> extends core::Object {
+class B<S extends core::Object = dynamic> extends core::Object {
   final field core::List<self::A<self::B::S>> foo;
   final field core::List<self::A<core::num>> bar;
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.expect
index 7c0008d..513f483 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<S extends core::Object> extends core::Object {
+class B<S extends core::Object = dynamic> extends core::Object {
   final field core::List<self::A<self::B::S>> foo = <self::A<self::B::S>>[];
   final field core::List<self::A<core::num>> bar = <self::A<core::num>>[];
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.transformed.expect
index 7c0008d..513f483 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<S extends core::Object> extends core::Object {
+class B<S extends core::Object = dynamic> extends core::Object {
   final field core::List<self::A<self::B::S>> foo = <self::A<self::B::S>>[];
   final field core::List<self::A<core::num>> bar = <self::A<core::num>>[];
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.expect
index cde27c3..936727b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.transformed.expect
index cde27c3..936727b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.outline.expect
index 303959e..b6268f4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.expect
index 945d678..2a9e814 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.transformed.expect
index 945d678..2a9e814 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.expect
index 9ecef65..e8031c5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.expect
@@ -2,52 +2,52 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends self::A<self::D::X>, Y extends self::A<self::D::Y>> extends core::Object {
+class D<X extends self::A<self::D::X> = dynamic, Y extends self::A<self::D::Y> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<W extends self::B<self::E::W, self::E::X>, X extends self::C<self::E::W, self::E::X>, Y extends self::B<self::E::Y, self::E::Z>, Z extends self::C<self::E::Y, self::E::Z>> extends core::Object {
+class E<W extends self::B<self::E::W, self::E::X> = dynamic, X extends self::C<self::E::W, self::E::X> = dynamic, Y extends self::B<self::E::Y, self::E::Z> = dynamic, Z extends self::C<self::E::Y, self::E::Z> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<V extends core::num, W extends self::B<self::F::W, self::F::X>, X extends self::C<self::F::W, self::F::X>, Y extends self::B<self::F::W, self::F::X>, Z extends self::C<self::F::Y, self::F::Z>> extends core::Object {
+class F<V extends core::num = dynamic, W extends self::B<self::F::W, self::F::X> = dynamic, X extends self::C<self::F::W, self::F::X> = dynamic, Y extends self::B<self::F::W, self::F::X> = dynamic, Z extends self::C<self::F::Y, self::F::Z> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class G<V extends core::num, W extends self::B<self::G::V, self::G::X>, X extends self::C<self::G::W, self::G::V>, Y extends self::B<self::G::W, self::G::X>, Z extends self::C<self::G::Y, self::G::Z>> extends core::Object {
+class G<V extends core::num = dynamic, W extends self::B<self::G::V, self::G::X> = dynamic, X extends self::C<self::G::W, self::G::V> = dynamic, Y extends self::B<self::G::W, self::G::X> = dynamic, Z extends self::C<self::G::Y, self::G::Z> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class H<S extends self::A<self::H::S>, T extends self::B<self::H::T, self::H::U>, U extends self::C<self::H::T, self::H::U>, V extends self::A<self::H::V>, W extends self::H::S, X extends self::H::T, Y extends self::H::U, Z extends self::H::V> extends core::Object {
+class H<S extends self::A<self::H::S> = dynamic, T extends self::B<self::H::T, self::H::U> = dynamic, U extends self::C<self::H::T, self::H::U> = dynamic, V extends self::A<self::H::V> = dynamic, W extends self::H::S = dynamic, X extends self::H::T = dynamic, Y extends self::H::U = dynamic, Z extends self::H::V = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class I<T extends self::I::U, U extends self::I::Y, V extends (self::I::W) → dynamic, W extends (self::I::X) → dynamic, X extends (self::I::V) → dynamic, Y extends self::I::Z, Z extends self::I::T> extends core::Object {
+class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) → dynamic = dynamic, W extends (self::I::X) → dynamic = dynamic, X extends (self::I::V) → dynamic = dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class J<S extends (self::J::U) → self::J::T, T extends (self::J::S) → self::J::U, U extends (self::J::T) → self::J::S, V extends self::J::W, W extends self::J::X, X extends (self::J::V) → self::J::Y, Y extends self::J::Z, Z extends self::J::X> extends core::Object {
+class J<S extends (self::J::U) → self::J::T = dynamic, T extends (self::J::S) → self::J::U = dynamic, U extends (self::J::T) → self::J::S = dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) → self::J::Y = dynamic, Y extends self::J::Z = dynamic, Z extends self::J::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.transformed.expect
index 9ecef65..e8031c5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.transformed.expect
@@ -2,52 +2,52 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends self::A<self::D::X>, Y extends self::A<self::D::Y>> extends core::Object {
+class D<X extends self::A<self::D::X> = dynamic, Y extends self::A<self::D::Y> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<W extends self::B<self::E::W, self::E::X>, X extends self::C<self::E::W, self::E::X>, Y extends self::B<self::E::Y, self::E::Z>, Z extends self::C<self::E::Y, self::E::Z>> extends core::Object {
+class E<W extends self::B<self::E::W, self::E::X> = dynamic, X extends self::C<self::E::W, self::E::X> = dynamic, Y extends self::B<self::E::Y, self::E::Z> = dynamic, Z extends self::C<self::E::Y, self::E::Z> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<V extends core::num, W extends self::B<self::F::W, self::F::X>, X extends self::C<self::F::W, self::F::X>, Y extends self::B<self::F::W, self::F::X>, Z extends self::C<self::F::Y, self::F::Z>> extends core::Object {
+class F<V extends core::num = dynamic, W extends self::B<self::F::W, self::F::X> = dynamic, X extends self::C<self::F::W, self::F::X> = dynamic, Y extends self::B<self::F::W, self::F::X> = dynamic, Z extends self::C<self::F::Y, self::F::Z> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class G<V extends core::num, W extends self::B<self::G::V, self::G::X>, X extends self::C<self::G::W, self::G::V>, Y extends self::B<self::G::W, self::G::X>, Z extends self::C<self::G::Y, self::G::Z>> extends core::Object {
+class G<V extends core::num = dynamic, W extends self::B<self::G::V, self::G::X> = dynamic, X extends self::C<self::G::W, self::G::V> = dynamic, Y extends self::B<self::G::W, self::G::X> = dynamic, Z extends self::C<self::G::Y, self::G::Z> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class H<S extends self::A<self::H::S>, T extends self::B<self::H::T, self::H::U>, U extends self::C<self::H::T, self::H::U>, V extends self::A<self::H::V>, W extends self::H::S, X extends self::H::T, Y extends self::H::U, Z extends self::H::V> extends core::Object {
+class H<S extends self::A<self::H::S> = dynamic, T extends self::B<self::H::T, self::H::U> = dynamic, U extends self::C<self::H::T, self::H::U> = dynamic, V extends self::A<self::H::V> = dynamic, W extends self::H::S = dynamic, X extends self::H::T = dynamic, Y extends self::H::U = dynamic, Z extends self::H::V = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class I<T extends self::I::U, U extends self::I::Y, V extends (self::I::W) → dynamic, W extends (self::I::X) → dynamic, X extends (self::I::V) → dynamic, Y extends self::I::Z, Z extends self::I::T> extends core::Object {
+class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) → dynamic = dynamic, W extends (self::I::X) → dynamic = dynamic, X extends (self::I::V) → dynamic = dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class J<S extends (self::J::U) → self::J::T, T extends (self::J::S) → self::J::U, U extends (self::J::T) → self::J::S, V extends self::J::W, W extends self::J::X, X extends (self::J::V) → self::J::Y, Y extends self::J::Z, Z extends self::J::X> extends core::Object {
+class J<S extends (self::J::U) → self::J::T = dynamic, T extends (self::J::S) → self::J::U = dynamic, U extends (self::J::T) → self::J::S = dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) → self::J::Y = dynamic, Y extends self::J::Z = dynamic, Z extends self::J::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
index 64dbcc8..c917def 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
@@ -2,43 +2,43 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class D<X extends self::A<self::D::X>, Y extends self::A<self::D::Y>> extends core::Object {
+class D<X extends self::A<self::D::X> = dynamic, Y extends self::A<self::D::Y> = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class E<W extends self::B<self::E::W, self::E::X>, X extends self::C<self::E::W, self::E::X>, Y extends self::B<self::E::Y, self::E::Z>, Z extends self::C<self::E::Y, self::E::Z>> extends core::Object {
+class E<W extends self::B<self::E::W, self::E::X> = dynamic, X extends self::C<self::E::W, self::E::X> = dynamic, Y extends self::B<self::E::Y, self::E::Z> = dynamic, Z extends self::C<self::E::Y, self::E::Z> = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class F<V extends core::num, W extends self::B<self::F::W, self::F::X>, X extends self::C<self::F::W, self::F::X>, Y extends self::B<self::F::W, self::F::X>, Z extends self::C<self::F::Y, self::F::Z>> extends core::Object {
+class F<V extends core::num = dynamic, W extends self::B<self::F::W, self::F::X> = dynamic, X extends self::C<self::F::W, self::F::X> = dynamic, Y extends self::B<self::F::W, self::F::X> = dynamic, Z extends self::C<self::F::Y, self::F::Z> = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class G<V extends core::num, W extends self::B<self::G::V, self::G::X>, X extends self::C<self::G::W, self::G::V>, Y extends self::B<self::G::W, self::G::X>, Z extends self::C<self::G::Y, self::G::Z>> extends core::Object {
+class G<V extends core::num = dynamic, W extends self::B<self::G::V, self::G::X> = dynamic, X extends self::C<self::G::W, self::G::V> = dynamic, Y extends self::B<self::G::W, self::G::X> = dynamic, Z extends self::C<self::G::Y, self::G::Z> = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class H<S extends self::A<self::H::S>, T extends self::B<self::H::T, self::H::U>, U extends self::C<self::H::T, self::H::U>, V extends self::A<self::H::V>, W extends self::H::S, X extends self::H::T, Y extends self::H::U, Z extends self::H::V> extends core::Object {
+class H<S extends self::A<self::H::S> = dynamic, T extends self::B<self::H::T, self::H::U> = dynamic, U extends self::C<self::H::T, self::H::U> = dynamic, V extends self::A<self::H::V> = dynamic, W extends self::H::S = dynamic, X extends self::H::T = dynamic, Y extends self::H::U = dynamic, Z extends self::H::V = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class I<T extends self::I::U, U extends self::I::Y, V extends (self::I::W) → dynamic, W extends (self::I::X) → dynamic, X extends (self::I::V) → dynamic, Y extends self::I::Z, Z extends self::I::T> extends core::Object {
+class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) → dynamic = dynamic, W extends (self::I::X) → dynamic = dynamic, X extends (self::I::V) → dynamic = dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class J<S extends (self::J::U) → self::J::T, T extends (self::J::S) → self::J::U, U extends (self::J::T) → self::J::S, V extends self::J::W, W extends self::J::X, X extends (self::J::V) → self::J::Y, Y extends self::J::Z, Z extends self::J::X> extends core::Object {
+class J<S extends (self::J::U) → self::J::T = dynamic, T extends (self::J::S) → self::J::U = dynamic, U extends (self::J::T) → self::J::S = dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) → self::J::Y = dynamic, Y extends self::J::Z = dynamic, Z extends self::J::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect
index b890460..7b2576f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect
@@ -2,52 +2,52 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends self::A<self::D::X>, Y extends self::A<self::D::Y>> extends core::Object {
+class D<X extends self::A<self::D::X> = self::A<dynamic>, Y extends self::A<self::D::Y> = self::A<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<W extends self::B<self::E::W, self::E::X>, X extends self::C<self::E::W, self::E::X>, Y extends self::B<self::E::Y, self::E::Z>, Z extends self::C<self::E::Y, self::E::Z>> extends core::Object {
+class E<W extends self::B<self::E::W, self::E::X> = self::B<dynamic, dynamic>, X extends self::C<self::E::W, self::E::X> = self::C<dynamic, dynamic>, Y extends self::B<self::E::Y, self::E::Z> = self::B<dynamic, dynamic>, Z extends self::C<self::E::Y, self::E::Z> = self::C<dynamic, dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<V extends core::num, W extends self::B<self::F::W, self::F::X>, X extends self::C<self::F::W, self::F::X>, Y extends self::B<self::F::W, self::F::X>, Z extends self::C<self::F::Y, self::F::Z>> extends core::Object {
+class F<V extends core::num = core::num, W extends self::B<self::F::W, self::F::X> = self::B<dynamic, dynamic>, X extends self::C<self::F::W, self::F::X> = self::C<dynamic, dynamic>, Y extends self::B<self::F::W, self::F::X> = self::B<self::B<dynamic, dynamic>, self::C<dynamic, dynamic>>, Z extends self::C<self::F::Y, self::F::Z> = self::C<self::B<self::B<dynamic, dynamic>, self::C<dynamic, dynamic>>, dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class G<V extends core::num, W extends self::B<self::G::V, self::G::X>, X extends self::C<self::G::W, self::G::V>, Y extends self::B<self::G::W, self::G::X>, Z extends self::C<self::G::Y, self::G::Z>> extends core::Object {
+class G<V extends core::num = core::num, W extends self::B<self::G::V, self::G::X> = self::B<core::num, dynamic>, X extends self::C<self::G::W, self::G::V> = self::C<dynamic, core::num>, Y extends self::B<self::G::W, self::G::X> = self::B<self::B<core::num, dynamic>, self::C<dynamic, core::num>>, Z extends self::C<self::G::Y, self::G::Z> = self::C<self::B<self::B<core::num, dynamic>, self::C<dynamic, core::num>>, dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class H<S extends self::A<self::H::S>, T extends self::B<self::H::T, self::H::U>, U extends self::C<self::H::T, self::H::U>, V extends self::A<self::H::V>, W extends self::H::S, X extends self::H::T, Y extends self::H::U, Z extends self::H::V> extends core::Object {
+class H<S extends self::A<self::H::S> = self::A<dynamic>, T extends self::B<self::H::T, self::H::U> = self::B<dynamic, dynamic>, U extends self::C<self::H::T, self::H::U> = self::C<dynamic, dynamic>, V extends self::A<self::H::V> = self::A<dynamic>, W extends self::H::S = self::A<dynamic>, X extends self::H::T = self::B<dynamic, dynamic>, Y extends self::H::U = self::C<dynamic, dynamic>, Z extends self::H::V = self::A<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class I<T extends self::I::U, U extends self::I::Y, V extends (self::I::W) → dynamic, W extends (self::I::X) → dynamic, X extends (self::I::V) → dynamic, Y extends self::I::Z, Z extends self::I::T> extends core::Object {
+class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) → dynamic = (core::Null) → dynamic, W extends (self::I::X) → dynamic = (core::Null) → dynamic, X extends (self::I::V) → dynamic = (core::Null) → dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class J<S extends (self::J::U) → self::J::T, T extends (self::J::S) → self::J::U, U extends (self::J::T) → self::J::S, V extends self::J::W, W extends self::J::X, X extends (self::J::V) → self::J::Y, Y extends self::J::Z, Z extends self::J::X> extends core::Object {
+class J<S extends (self::J::U) → self::J::T = (core::Null) → dynamic, T extends (self::J::S) → self::J::U = (core::Null) → dynamic, U extends (self::J::T) → self::J::S = (core::Null) → dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) → self::J::Y = (core::Null) → dynamic, Y extends self::J::Z = dynamic, Z extends self::J::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect
index b890460..7b2576f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect
@@ -2,52 +2,52 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object> extends core::Object {
+class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object, Y extends core::Object> extends core::Object {
+class C<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D<X extends self::A<self::D::X>, Y extends self::A<self::D::Y>> extends core::Object {
+class D<X extends self::A<self::D::X> = self::A<dynamic>, Y extends self::A<self::D::Y> = self::A<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<W extends self::B<self::E::W, self::E::X>, X extends self::C<self::E::W, self::E::X>, Y extends self::B<self::E::Y, self::E::Z>, Z extends self::C<self::E::Y, self::E::Z>> extends core::Object {
+class E<W extends self::B<self::E::W, self::E::X> = self::B<dynamic, dynamic>, X extends self::C<self::E::W, self::E::X> = self::C<dynamic, dynamic>, Y extends self::B<self::E::Y, self::E::Z> = self::B<dynamic, dynamic>, Z extends self::C<self::E::Y, self::E::Z> = self::C<dynamic, dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class F<V extends core::num, W extends self::B<self::F::W, self::F::X>, X extends self::C<self::F::W, self::F::X>, Y extends self::B<self::F::W, self::F::X>, Z extends self::C<self::F::Y, self::F::Z>> extends core::Object {
+class F<V extends core::num = core::num, W extends self::B<self::F::W, self::F::X> = self::B<dynamic, dynamic>, X extends self::C<self::F::W, self::F::X> = self::C<dynamic, dynamic>, Y extends self::B<self::F::W, self::F::X> = self::B<self::B<dynamic, dynamic>, self::C<dynamic, dynamic>>, Z extends self::C<self::F::Y, self::F::Z> = self::C<self::B<self::B<dynamic, dynamic>, self::C<dynamic, dynamic>>, dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class G<V extends core::num, W extends self::B<self::G::V, self::G::X>, X extends self::C<self::G::W, self::G::V>, Y extends self::B<self::G::W, self::G::X>, Z extends self::C<self::G::Y, self::G::Z>> extends core::Object {
+class G<V extends core::num = core::num, W extends self::B<self::G::V, self::G::X> = self::B<core::num, dynamic>, X extends self::C<self::G::W, self::G::V> = self::C<dynamic, core::num>, Y extends self::B<self::G::W, self::G::X> = self::B<self::B<core::num, dynamic>, self::C<dynamic, core::num>>, Z extends self::C<self::G::Y, self::G::Z> = self::C<self::B<self::B<core::num, dynamic>, self::C<dynamic, core::num>>, dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class H<S extends self::A<self::H::S>, T extends self::B<self::H::T, self::H::U>, U extends self::C<self::H::T, self::H::U>, V extends self::A<self::H::V>, W extends self::H::S, X extends self::H::T, Y extends self::H::U, Z extends self::H::V> extends core::Object {
+class H<S extends self::A<self::H::S> = self::A<dynamic>, T extends self::B<self::H::T, self::H::U> = self::B<dynamic, dynamic>, U extends self::C<self::H::T, self::H::U> = self::C<dynamic, dynamic>, V extends self::A<self::H::V> = self::A<dynamic>, W extends self::H::S = self::A<dynamic>, X extends self::H::T = self::B<dynamic, dynamic>, Y extends self::H::U = self::C<dynamic, dynamic>, Z extends self::H::V = self::A<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class I<T extends self::I::U, U extends self::I::Y, V extends (self::I::W) → dynamic, W extends (self::I::X) → dynamic, X extends (self::I::V) → dynamic, Y extends self::I::Z, Z extends self::I::T> extends core::Object {
+class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) → dynamic = (core::Null) → dynamic, W extends (self::I::X) → dynamic = (core::Null) → dynamic, X extends (self::I::V) → dynamic = (core::Null) → dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class J<S extends (self::J::U) → self::J::T, T extends (self::J::S) → self::J::U, U extends (self::J::T) → self::J::S, V extends self::J::W, W extends self::J::X, X extends (self::J::V) → self::J::Y, Y extends self::J::Z, Z extends self::J::X> extends core::Object {
+class J<S extends (self::J::U) → self::J::T = (core::Null) → dynamic, T extends (self::J::S) → self::J::U = (core::Null) → dynamic, U extends (self::J::T) → self::J::S = (core::Null) → dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) → self::J::Y = (core::Null) → dynamic, Y extends self::J::Z = dynamic, Z extends self::J::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.expect
index 74147c8..c0cb9b8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.expect
@@ -2,52 +2,52 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X, Y extends (self::C1::Y) → self::C1::X> extends core::Object {
+class C1<X extends (self::C1::Y) → self::C1::X = dynamic, Y extends (self::C1::Y) → self::C1::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X, Y extends (self::C2::X) → self::C2::Y> extends core::Object {
+class C2<X extends (self::C2::Y) → self::C2::X = dynamic, Y extends (self::C2::X) → self::C2::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X, Y extends (self::C3::X, self::C3::Y) → self::C3::X> extends core::Object {
+class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X, Y extends (self::C4::X, self::C4::Y) → self::C4::Y> extends core::Object {
+class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y>, Y extends (self::D1::Y) → self::D1::X> extends core::Object {
+class D1<X extends self::B<self::D1::X, self::D1::Y> = dynamic, Y extends (self::D1::Y) → self::D1::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y>, Y extends (self::D2::X) → self::D2::Y> extends core::Object {
+class D2<X extends self::B<self::D2::X, self::D2::Y> = dynamic, Y extends (self::D2::X) → self::D2::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y>, Y extends (self::D3::X, self::D3::Y) → self::D3::X> extends core::Object {
+class D3<X extends self::B<self::D3::X, self::D3::Y> = dynamic, Y extends (self::D3::X, self::D3::Y) → self::D3::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y>, Y extends (self::D4::X, self::D4::Y) → self::D4::Y> extends core::Object {
+class D4<X extends self::B<self::D4::X, self::D4::Y> = dynamic, Y extends (self::D4::X, self::D4::Y) → self::D4::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → self::E::X> extends core::Object {
+class E<X extends (self::E::X) → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.transformed.expect
index 74147c8..c0cb9b8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.transformed.expect
@@ -2,52 +2,52 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X, Y extends (self::C1::Y) → self::C1::X> extends core::Object {
+class C1<X extends (self::C1::Y) → self::C1::X = dynamic, Y extends (self::C1::Y) → self::C1::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X, Y extends (self::C2::X) → self::C2::Y> extends core::Object {
+class C2<X extends (self::C2::Y) → self::C2::X = dynamic, Y extends (self::C2::X) → self::C2::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X, Y extends (self::C3::X, self::C3::Y) → self::C3::X> extends core::Object {
+class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X, Y extends (self::C4::X, self::C4::Y) → self::C4::Y> extends core::Object {
+class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y>, Y extends (self::D1::Y) → self::D1::X> extends core::Object {
+class D1<X extends self::B<self::D1::X, self::D1::Y> = dynamic, Y extends (self::D1::Y) → self::D1::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y>, Y extends (self::D2::X) → self::D2::Y> extends core::Object {
+class D2<X extends self::B<self::D2::X, self::D2::Y> = dynamic, Y extends (self::D2::X) → self::D2::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y>, Y extends (self::D3::X, self::D3::Y) → self::D3::X> extends core::Object {
+class D3<X extends self::B<self::D3::X, self::D3::Y> = dynamic, Y extends (self::D3::X, self::D3::Y) → self::D3::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y>, Y extends (self::D4::X, self::D4::Y) → self::D4::Y> extends core::Object {
+class D4<X extends self::B<self::D4::X, self::D4::Y> = dynamic, Y extends (self::D4::X, self::D4::Y) → self::D4::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → self::E::X> extends core::Object {
+class E<X extends (self::E::X) → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
index 9ba0b7d..3b6681f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
@@ -2,43 +2,43 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X, Y extends (self::C1::Y) → self::C1::X> extends core::Object {
+class C1<X extends (self::C1::Y) → self::C1::X = dynamic, Y extends (self::C1::Y) → self::C1::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X, Y extends (self::C2::X) → self::C2::Y> extends core::Object {
+class C2<X extends (self::C2::Y) → self::C2::X = dynamic, Y extends (self::C2::X) → self::C2::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X, Y extends (self::C3::X, self::C3::Y) → self::C3::X> extends core::Object {
+class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X, Y extends (self::C4::X, self::C4::Y) → self::C4::Y> extends core::Object {
+class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y>, Y extends (self::D1::Y) → self::D1::X> extends core::Object {
+class D1<X extends self::B<self::D1::X, self::D1::Y> = dynamic, Y extends (self::D1::Y) → self::D1::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y>, Y extends (self::D2::X) → self::D2::Y> extends core::Object {
+class D2<X extends self::B<self::D2::X, self::D2::Y> = dynamic, Y extends (self::D2::X) → self::D2::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y>, Y extends (self::D3::X, self::D3::Y) → self::D3::X> extends core::Object {
+class D3<X extends self::B<self::D3::X, self::D3::Y> = dynamic, Y extends (self::D3::X, self::D3::Y) → self::D3::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y>, Y extends (self::D4::X, self::D4::Y) → self::D4::Y> extends core::Object {
+class D4<X extends self::B<self::D4::X, self::D4::Y> = dynamic, Y extends (self::D4::X, self::D4::Y) → self::D4::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class E<X extends (self::E::X) → self::E::X> extends core::Object {
+class E<X extends (self::E::X) → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.expect
index 77802e7..3621db7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.expect
@@ -2,52 +2,52 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X, Y extends (self::C1::Y) → self::C1::X> extends core::Object {
+class C1<X extends (self::C1::Y) → self::C1::X = (core::Null) → dynamic, Y extends (self::C1::Y) → self::C1::X = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X, Y extends (self::C2::X) → self::C2::Y> extends core::Object {
+class C2<X extends (self::C2::Y) → self::C2::X = (core::Null) → dynamic, Y extends (self::C2::X) → self::C2::Y = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X, Y extends (self::C3::X, self::C3::Y) → self::C3::X> extends core::Object {
+class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = (core::Null, core::Null) → dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = (core::Null, core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X, Y extends (self::C4::X, self::C4::Y) → self::C4::Y> extends core::Object {
+class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = (core::Null, core::Null) → dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = (core::Null, core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y>, Y extends (self::D1::Y) → self::D1::X> extends core::Object {
+class D1<X extends self::B<self::D1::X, self::D1::Y> = self::B<dynamic, dynamic>, Y extends (self::D1::Y) → self::D1::X = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y>, Y extends (self::D2::X) → self::D2::Y> extends core::Object {
+class D2<X extends self::B<self::D2::X, self::D2::Y> = self::B<dynamic, dynamic>, Y extends (self::D2::X) → self::D2::Y = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y>, Y extends (self::D3::X, self::D3::Y) → self::D3::X> extends core::Object {
+class D3<X extends self::B<self::D3::X, self::D3::Y> = self::B<dynamic, dynamic>, Y extends (self::D3::X, self::D3::Y) → self::D3::X = (core::Null, core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y>, Y extends (self::D4::X, self::D4::Y) → self::D4::Y> extends core::Object {
+class D4<X extends self::B<self::D4::X, self::D4::Y> = self::B<dynamic, dynamic>, Y extends (self::D4::X, self::D4::Y) → self::D4::Y = (core::Null, core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → self::E::X> extends core::Object {
+class E<X extends (self::E::X) → self::E::X = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.transformed.expect
index 77802e7..3621db7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.transformed.expect
@@ -2,52 +2,52 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X, Y extends (self::C1::Y) → self::C1::X> extends core::Object {
+class C1<X extends (self::C1::Y) → self::C1::X = (core::Null) → dynamic, Y extends (self::C1::Y) → self::C1::X = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X, Y extends (self::C2::X) → self::C2::Y> extends core::Object {
+class C2<X extends (self::C2::Y) → self::C2::X = (core::Null) → dynamic, Y extends (self::C2::X) → self::C2::Y = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X, Y extends (self::C3::X, self::C3::Y) → self::C3::X> extends core::Object {
+class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = (core::Null, core::Null) → dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = (core::Null, core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X, Y extends (self::C4::X, self::C4::Y) → self::C4::Y> extends core::Object {
+class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = (core::Null, core::Null) → dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = (core::Null, core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y>, Y extends (self::D1::Y) → self::D1::X> extends core::Object {
+class D1<X extends self::B<self::D1::X, self::D1::Y> = self::B<dynamic, dynamic>, Y extends (self::D1::Y) → self::D1::X = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y>, Y extends (self::D2::X) → self::D2::Y> extends core::Object {
+class D2<X extends self::B<self::D2::X, self::D2::Y> = self::B<dynamic, dynamic>, Y extends (self::D2::X) → self::D2::Y = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y>, Y extends (self::D3::X, self::D3::Y) → self::D3::X> extends core::Object {
+class D3<X extends self::B<self::D3::X, self::D3::Y> = self::B<dynamic, dynamic>, Y extends (self::D3::X, self::D3::Y) → self::D3::X = (core::Null, core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y>, Y extends (self::D4::X, self::D4::Y) → self::D4::Y> extends core::Object {
+class D4<X extends self::B<self::D4::X, self::D4::Y> = self::B<dynamic, dynamic>, Y extends (self::D4::X, self::D4::Y) → self::D4::Y = (core::Null, core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → self::E::X> extends core::Object {
+class E<X extends (self::E::X) → self::E::X = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.expect
index ec1fdc4..e323b52 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.expect
@@ -2,52 +2,52 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X, Y extends (self::C1::Y) → self::C1::X> extends core::Object {
+class C1<X extends (self::C1::Y) → self::C1::X = dynamic, Y extends (self::C1::Y) → self::C1::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X, Y extends (self::C2::X) → self::C2::Y> extends core::Object {
+class C2<X extends (self::C2::Y) → self::C2::X = dynamic, Y extends (self::C2::X) → self::C2::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X, Y extends (self::C3::X, self::C3::Y) → self::C3::X> extends core::Object {
+class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X, Y extends (self::C4::X, self::C4::Y) → self::C4::Y> extends core::Object {
+class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y>, Y extends (self::D1::Y) → self::D1::X> extends core::Object {
+class D1<X extends self::B<self::D1::X, self::D1::Y> = dynamic, Y extends (self::D1::Y) → self::D1::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y>, Y extends (self::D2::X) → self::D2::Y> extends core::Object {
+class D2<X extends self::B<self::D2::X, self::D2::Y> = dynamic, Y extends (self::D2::X) → self::D2::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y>, Y extends (self::D3::X, self::D3::Y) → self::D3::X> extends core::Object {
+class D3<X extends self::B<self::D3::X, self::D3::Y> = dynamic, Y extends (self::D3::X, self::D3::Y) → self::D3::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y>, Y extends (self::D4::X, self::D4::Y) → self::D4::Y> extends core::Object {
+class D4<X extends self::B<self::D4::X, self::D4::Y> = dynamic, Y extends (self::D4::X, self::D4::Y) → self::D4::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → self::E::X> extends core::Object {
+class E<X extends (self::E::X) → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.transformed.expect
index ec1fdc4..e323b52 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.transformed.expect
@@ -2,52 +2,52 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X, Y extends (self::C1::Y) → self::C1::X> extends core::Object {
+class C1<X extends (self::C1::Y) → self::C1::X = dynamic, Y extends (self::C1::Y) → self::C1::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X, Y extends (self::C2::X) → self::C2::Y> extends core::Object {
+class C2<X extends (self::C2::Y) → self::C2::X = dynamic, Y extends (self::C2::X) → self::C2::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X, Y extends (self::C3::X, self::C3::Y) → self::C3::X> extends core::Object {
+class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X, Y extends (self::C4::X, self::C4::Y) → self::C4::Y> extends core::Object {
+class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y>, Y extends (self::D1::Y) → self::D1::X> extends core::Object {
+class D1<X extends self::B<self::D1::X, self::D1::Y> = dynamic, Y extends (self::D1::Y) → self::D1::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y>, Y extends (self::D2::X) → self::D2::Y> extends core::Object {
+class D2<X extends self::B<self::D2::X, self::D2::Y> = dynamic, Y extends (self::D2::X) → self::D2::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y>, Y extends (self::D3::X, self::D3::Y) → self::D3::X> extends core::Object {
+class D3<X extends self::B<self::D3::X, self::D3::Y> = dynamic, Y extends (self::D3::X, self::D3::Y) → self::D3::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y>, Y extends (self::D4::X, self::D4::Y) → self::D4::Y> extends core::Object {
+class D4<X extends self::B<self::D4::X, self::D4::Y> = dynamic, Y extends (self::D4::X, self::D4::Y) → self::D4::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → self::E::X> extends core::Object {
+class E<X extends (self::E::X) → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
index c1a07b1..862f29e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
@@ -2,43 +2,43 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X, Y extends (self::C1::Y) → self::C1::X> extends core::Object {
+class C1<X extends (self::C1::Y) → self::C1::X = dynamic, Y extends (self::C1::Y) → self::C1::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X, Y extends (self::C2::X) → self::C2::Y> extends core::Object {
+class C2<X extends (self::C2::Y) → self::C2::X = dynamic, Y extends (self::C2::X) → self::C2::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X, Y extends (self::C3::X, self::C3::Y) → self::C3::X> extends core::Object {
+class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X, Y extends (self::C4::X, self::C4::Y) → self::C4::Y> extends core::Object {
+class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y>, Y extends (self::D1::Y) → self::D1::X> extends core::Object {
+class D1<X extends self::B<self::D1::X, self::D1::Y> = dynamic, Y extends (self::D1::Y) → self::D1::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y>, Y extends (self::D2::X) → self::D2::Y> extends core::Object {
+class D2<X extends self::B<self::D2::X, self::D2::Y> = dynamic, Y extends (self::D2::X) → self::D2::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y>, Y extends (self::D3::X, self::D3::Y) → self::D3::X> extends core::Object {
+class D3<X extends self::B<self::D3::X, self::D3::Y> = dynamic, Y extends (self::D3::X, self::D3::Y) → self::D3::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y>, Y extends (self::D4::X, self::D4::Y) → self::D4::Y> extends core::Object {
+class D4<X extends self::B<self::D4::X, self::D4::Y> = dynamic, Y extends (self::D4::X, self::D4::Y) → self::D4::Y = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class E<X extends (self::E::X) → self::E::X> extends core::Object {
+class E<X extends (self::E::X) → self::E::X = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.expect
index 8a37dd2..d8c6cc7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.expect
@@ -2,52 +2,52 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X, Y extends (self::C1::Y) → self::C1::X> extends core::Object {
+class C1<X extends (self::C1::Y) → self::C1::X = (core::Null) → dynamic, Y extends (self::C1::Y) → self::C1::X = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X, Y extends (self::C2::X) → self::C2::Y> extends core::Object {
+class C2<X extends (self::C2::Y) → self::C2::X = (core::Null) → dynamic, Y extends (self::C2::X) → self::C2::Y = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X, Y extends (self::C3::X, self::C3::Y) → self::C3::X> extends core::Object {
+class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = (core::Null, core::Null) → dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = (core::Null, core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X, Y extends (self::C4::X, self::C4::Y) → self::C4::Y> extends core::Object {
+class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = (core::Null, core::Null) → dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = (core::Null, core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y>, Y extends (self::D1::Y) → self::D1::X> extends core::Object {
+class D1<X extends self::B<self::D1::X, self::D1::Y> = self::B<dynamic, dynamic>, Y extends (self::D1::Y) → self::D1::X = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y>, Y extends (self::D2::X) → self::D2::Y> extends core::Object {
+class D2<X extends self::B<self::D2::X, self::D2::Y> = self::B<dynamic, dynamic>, Y extends (self::D2::X) → self::D2::Y = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y>, Y extends (self::D3::X, self::D3::Y) → self::D3::X> extends core::Object {
+class D3<X extends self::B<self::D3::X, self::D3::Y> = self::B<dynamic, dynamic>, Y extends (self::D3::X, self::D3::Y) → self::D3::X = (core::Null, core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y>, Y extends (self::D4::X, self::D4::Y) → self::D4::Y> extends core::Object {
+class D4<X extends self::B<self::D4::X, self::D4::Y> = self::B<dynamic, dynamic>, Y extends (self::D4::X, self::D4::Y) → self::D4::Y = (core::Null, core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → self::E::X> extends core::Object {
+class E<X extends (self::E::X) → self::E::X = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.transformed.expect
index 8a37dd2..d8c6cc7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.transformed.expect
@@ -2,52 +2,52 @@
 import self as self;
 import "dart:core" as core;
 
-class B<X extends core::Object, Y extends core::Object> extends core::Object {
+class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X, Y extends (self::C1::Y) → self::C1::X> extends core::Object {
+class C1<X extends (self::C1::Y) → self::C1::X = (core::Null) → dynamic, Y extends (self::C1::Y) → self::C1::X = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X, Y extends (self::C2::X) → self::C2::Y> extends core::Object {
+class C2<X extends (self::C2::Y) → self::C2::X = (core::Null) → dynamic, Y extends (self::C2::X) → self::C2::Y = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X, Y extends (self::C3::X, self::C3::Y) → self::C3::X> extends core::Object {
+class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = (core::Null, core::Null) → dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = (core::Null, core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X, Y extends (self::C4::X, self::C4::Y) → self::C4::Y> extends core::Object {
+class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = (core::Null, core::Null) → dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = (core::Null, core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y>, Y extends (self::D1::Y) → self::D1::X> extends core::Object {
+class D1<X extends self::B<self::D1::X, self::D1::Y> = self::B<dynamic, dynamic>, Y extends (self::D1::Y) → self::D1::X = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y>, Y extends (self::D2::X) → self::D2::Y> extends core::Object {
+class D2<X extends self::B<self::D2::X, self::D2::Y> = self::B<dynamic, dynamic>, Y extends (self::D2::X) → self::D2::Y = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y>, Y extends (self::D3::X, self::D3::Y) → self::D3::X> extends core::Object {
+class D3<X extends self::B<self::D3::X, self::D3::Y> = self::B<dynamic, dynamic>, Y extends (self::D3::X, self::D3::Y) → self::D3::X = (core::Null, core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y>, Y extends (self::D4::X, self::D4::Y) → self::D4::Y> extends core::Object {
+class D4<X extends self::B<self::D4::X, self::D4::Y> = self::B<dynamic, dynamic>, Y extends (self::D4::X, self::D4::Y) → self::D4::Y = (core::Null, core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → self::E::X> extends core::Object {
+class E<X extends (self::E::X) → self::E::X = (core::Null) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.expect
index bd60470..b7dfd8e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.transformed.expect
index bd60470..b7dfd8e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.outline.expect
index b822c38..debf17c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.expect
index bd60470..b7dfd8e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.transformed.expect
index bd60470..b7dfd8e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.expect
index bb24dfc..995aaf1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic>> extends core::Object {
+class B<T extends self::A<dynamic> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.transformed.expect
index bb24dfc..995aaf1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic>> extends core::Object {
+class B<T extends self::A<dynamic> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.outline.expect
index 1cbb0e9..a958ced 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class B<T extends self::A<dynamic>> extends core::Object {
+class B<T extends self::A<dynamic> = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.expect
index 99ef415..465a807 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<core::num>> extends core::Object {
+class B<T extends self::A<core::num> = self::A<core::num>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.transformed.expect
index 99ef415..465a807 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num> extends core::Object {
+class A<T extends core::num = core::num> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<core::num>> extends core::Object {
+class B<T extends self::A<core::num> = self::A<core::num>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.expect
index 2f1df6b..b0c2284 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T>> extends core::Object {
+class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.transformed.expect
index 2f1df6b..b0c2284 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T>> extends core::Object {
+class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.outline.expect
index e3addef..80aba07 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T>> extends core::Object {
+class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.expect
index 08af2f5..a9c0166 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T>> extends core::Object {
+class A<T extends self::A<self::A::T> = self::A<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.transformed.expect
index 08af2f5..a9c0166 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T>> extends core::Object {
+class A<T extends self::A<self::A::T> = self::A<dynamic>> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.expect
index 159c3d8..b090467 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class X<T extends self::B> extends core::Object {
+class X<T extends self::B = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.transformed.expect
index 159c3d8..b090467 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.transformed.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class X<T extends self::B> extends core::Object {
+class X<T extends self::B = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.outline.expect
index a9960ece..95892c3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     ;
 }
-class X<T extends self::B> extends core::Object {
+class X<T extends self::B = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.strong.expect
index c261752..170e64b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.strong.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class X<T extends self::B> extends core::Object {
+class X<T extends self::B = self::B> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.strong.transformed.expect
index c261752..170e64b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class X<T extends self::B> extends core::Object {
+class X<T extends self::B = self::B> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.expect
index 2e8df2e..82574be 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.transformed.expect
index 2e8df2e..82574be 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.outline.expect
index bf24d2c..1b7b1df 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.expect
index 52fa1cf..6c19133 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = core::num> = (T) → dynamic;
 class B extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.transformed.expect
index 52fa1cf..6c19133 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = core::num> = (T) → dynamic;
 class B extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.direct.expect
index 3e9d62e..a682c5a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.direct.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
 static field dynamic a = <(dynamic) → dynamic>[];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.direct.transformed.expect
index 3e9d62e..a682c5a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.direct.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
 static field dynamic a = <(dynamic) → dynamic>[];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.outline.expect
index 9545c7a..4b19220 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
 static field dynamic a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.expect
index 6194fc1..f3acf59 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = core::num> = (T) → dynamic;
 static field core::List<(core::num) → dynamic> a = <(core::num) → dynamic>[];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.transformed.expect
index 6194fc1..f3acf59 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = core::num> = (T) → dynamic;
 static field core::List<(core::num) → dynamic> a = <(core::num) → dynamic>[];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.expect
index b156915..c2775ea 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
-class B<S extends core::Object> extends core::Object {
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+class B<S extends core::Object = dynamic> extends core::Object {
   final field core::List<(self::B::S) → dynamic> foo = <(self::B::S) → dynamic>[];
   final field core::List<(core::num) → dynamic> bar = <(core::num) → dynamic>[];
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.transformed.expect
index b156915..c2775ea 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
-class B<S extends core::Object> extends core::Object {
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+class B<S extends core::Object = dynamic> extends core::Object {
   final field core::List<(self::B::S) → dynamic> foo = <(self::B::S) → dynamic>[];
   final field core::List<(core::num) → dynamic> bar = <(core::num) → dynamic>[];
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.outline.expect
index fb0ee2e..de720ff 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
-class B<S extends core::Object> extends core::Object {
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+class B<S extends core::Object = dynamic> extends core::Object {
   final field core::List<(self::B::S) → dynamic> foo;
   final field core::List<(core::num) → dynamic> bar;
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.expect
index b156915..c2775ea 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
-class B<S extends core::Object> extends core::Object {
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+class B<S extends core::Object = dynamic> extends core::Object {
   final field core::List<(self::B::S) → dynamic> foo = <(self::B::S) → dynamic>[];
   final field core::List<(core::num) → dynamic> bar = <(core::num) → dynamic>[];
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.transformed.expect
index b156915..c2775ea 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
-class B<S extends core::Object> extends core::Object {
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+class B<S extends core::Object = dynamic> extends core::Object {
   final field core::List<(self::B::S) → dynamic> foo = <(self::B::S) → dynamic>[];
   final field core::List<(core::num) → dynamic> bar = <(core::num) → dynamic>[];
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.direct.expect
index 5258ebf..cb487a9 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.direct.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
 static field dynamic a = <(dynamic) → dynamic, (dynamic) → dynamic>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.direct.transformed.expect
index 5258ebf..cb487a9 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.direct.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
 static field dynamic a = <(dynamic) → dynamic, (dynamic) → dynamic>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.outline.expect
index 9545c7a..4b19220 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
 static field dynamic a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.expect
index c2e8007..fe31568 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = core::num> = (T) → dynamic;
 static field core::Map<(core::num) → dynamic, (core::num) → dynamic> a = <(core::num) → dynamic, (core::num) → dynamic>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.transformed.expect
index c2e8007..fe31568 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
+typedef A<T extends core::num = core::num> = (T) → dynamic;
 static field core::Map<(core::num) → dynamic, (core::num) → dynamic> a = <(core::num) → dynamic, (core::num) → dynamic>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.expect
index f3c3c27..b7cb482 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.transformed.expect
index f3c3c27..b7cb482 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.outline.expect
index 6a2e4db..a88799c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.expect
index f3c3c27..b7cb482 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.transformed.expect
index f3c3c27..b7cb482 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.expect
index ddb4888..7df4a93 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
-class B<T extends (dynamic) → dynamic> extends core::Object {
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
+class B<T extends (dynamic) → dynamic = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.transformed.expect
index ddb4888..7df4a93 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
-class B<T extends (dynamic) → dynamic> extends core::Object {
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
+class B<T extends (dynamic) → dynamic = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.outline.expect
index 8e00857..f7220cb 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
-class B<T extends (dynamic) → dynamic> extends core::Object {
+typedef A<T extends core::num = dynamic> = (T) → dynamic;
+class B<T extends (dynamic) → dynamic = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.expect
index 03b6e9c..97ca06a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
-class B<T extends (core::num) → dynamic> extends core::Object {
+typedef A<T extends core::num = core::num> = (T) → dynamic;
+class B<T extends (core::num) → dynamic = (core::num) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.transformed.expect
index 03b6e9c..97ca06a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num> = (T) → dynamic;
-class B<T extends (core::num) → dynamic> extends core::Object {
+typedef A<T extends core::num = core::num> = (T) → dynamic;
+class B<T extends (core::num) → dynamic = (core::num) → dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.expect
index 819253e..caa1662 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
-typedef B<S extends (S) → dynamic> = (S) → dynamic;
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef B<S extends (S) → dynamic = dynamic> = (S) → dynamic;
 static field (dynamic) → dynamic b;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.transformed.expect
index 819253e..caa1662 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
-typedef B<S extends (S) → dynamic> = (S) → dynamic;
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef B<S extends (S) → dynamic = dynamic> = (S) → dynamic;
 static field (dynamic) → dynamic b;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.outline.expect
index 61fcce0..68eb853 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object> = (T) → dynamic;
-typedef B<S extends (S) → dynamic> = (S) → dynamic;
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef B<S extends (S) → dynamic = dynamic> = (S) → dynamic;
 static field (dynamic) → dynamic b;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/local_generic_function.dart.direct.expect b/pkg/front_end/testcases/local_generic_function.dart.direct.expect
index 204a1a3..26709f0 100644
--- a/pkg/front_end/testcases/local_generic_function.dart.direct.expect
+++ b/pkg/front_end/testcases/local_generic_function.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  function f<T extends core::Object>(core::List<T> l) → T
+  function f<T extends core::Object = dynamic>(core::List<T> l) → T
     return l.[](0);
   dynamic x = f.call(<dynamic>[0]);
 }
diff --git a/pkg/front_end/testcases/local_generic_function.dart.direct.transformed.expect b/pkg/front_end/testcases/local_generic_function.dart.direct.transformed.expect
index 204a1a3..26709f0 100644
--- a/pkg/front_end/testcases/local_generic_function.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/local_generic_function.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  function f<T extends core::Object>(core::List<T> l) → T
+  function f<T extends core::Object = dynamic>(core::List<T> l) → T
     return l.[](0);
   dynamic x = f.call(<dynamic>[0]);
 }
diff --git a/pkg/front_end/testcases/local_generic_function.dart.strong.expect b/pkg/front_end/testcases/local_generic_function.dart.strong.expect
index 8f00c9d..f3d3e87 100644
--- a/pkg/front_end/testcases/local_generic_function.dart.strong.expect
+++ b/pkg/front_end/testcases/local_generic_function.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  function f<T extends core::Object>(core::List<T> l) → T
+  function f<T extends core::Object = dynamic>(core::List<T> l) → T
     return l.{core::List::[]}(0);
   core::int x = f.call<core::int>(<core::int>[0]);
 }
diff --git a/pkg/front_end/testcases/local_generic_function.dart.strong.transformed.expect b/pkg/front_end/testcases/local_generic_function.dart.strong.transformed.expect
index 8f00c9d..f3d3e87 100644
--- a/pkg/front_end/testcases/local_generic_function.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/local_generic_function.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  function f<T extends core::Object>(core::List<T> l) → T
+  function f<T extends core::Object = dynamic>(core::List<T> l) → T
     return l.{core::List::[]}(0);
   core::int x = f.call<core::int>(<core::int>[0]);
 }
diff --git a/pkg/front_end/testcases/mixin.dart.direct.expect b/pkg/front_end/testcases/mixin.dart.direct.expect
index 7ebdddc..249e126 100644
--- a/pkg/front_end/testcases/mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/mixin.dart.direct.expect
@@ -34,16 +34,16 @@
     : super core::Object::•()
     ;
 }
-abstract class G1<T extends core::Object> extends core::Object {
+abstract class G1<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method m() → dynamic
     return core::print(self::G1::T);
 }
-abstract class _D&Object&G1<S extends core::Object> = core::Object with self::G1<self::_D&Object&G1::S> {
+abstract class _D&Object&G1<S extends core::Object = dynamic> = core::Object with self::G1<self::_D&Object&G1::S> {
 }
-class D<S extends core::Object> extends self::_D&Object&G1<self::D::S> {
+class D<S extends core::Object = dynamic> extends self::_D&Object&G1<self::D::S> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/mixin.dart.direct.transformed.expect
index 572573a..c3b7891 100644
--- a/pkg/front_end/testcases/mixin.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/mixin.dart.direct.transformed.expect
@@ -54,21 +54,21 @@
     : super core::Object::•()
     ;
 }
-abstract class G1<T extends core::Object> extends core::Object {
+abstract class G1<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method m() → dynamic
     return core::print(self::G1::T);
 }
-abstract class _D&Object&G1<S extends core::Object> extends core::Object implements self::G1<self::_D&Object&G1::S> {
+abstract class _D&Object&G1<S extends core::Object = dynamic> extends core::Object implements self::G1<self::_D&Object&G1::S> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method m() → dynamic
     return core::print(self::_D&Object&G1::S);
 }
-class D<S extends core::Object> extends self::_D&Object&G1<self::D::S> {
+class D<S extends core::Object = dynamic> extends self::_D&Object&G1<self::D::S> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/mixin.dart.outline.expect b/pkg/front_end/testcases/mixin.dart.outline.expect
index ec5b2f3..35f0145 100644
--- a/pkg/front_end/testcases/mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/mixin.dart.outline.expect
@@ -30,15 +30,15 @@
   constructor •(dynamic value) → void
     ;
 }
-abstract class G1<T extends core::Object> extends core::Object {
+abstract class G1<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method m() → dynamic
     ;
 }
-abstract class _D&Object&G1<S extends core::Object> = core::Object with self::G1<self::_D&Object&G1::S> {
+abstract class _D&Object&G1<S extends core::Object = dynamic> = core::Object with self::G1<self::_D&Object&G1::S> {
 }
-class D<S extends core::Object> extends self::_D&Object&G1<self::D::S> {
+class D<S extends core::Object = dynamic> extends self::_D&Object&G1<self::D::S> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/mixin.dart.strong.expect b/pkg/front_end/testcases/mixin.dart.strong.expect
index b60be6e..675b2e9 100644
--- a/pkg/front_end/testcases/mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/mixin.dart.strong.expect
@@ -34,16 +34,16 @@
     : super core::Object::•()
     ;
 }
-abstract class G1<T extends core::Object> extends core::Object {
+abstract class G1<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method m() → dynamic
     return core::print(self::G1::T);
 }
-abstract class _D&Object&G1<S extends core::Object> = core::Object with self::G1<self::_D&Object&G1::S> {
+abstract class _D&Object&G1<S extends core::Object = dynamic> = core::Object with self::G1<self::_D&Object&G1::S> {
 }
-class D<S extends core::Object> extends self::_D&Object&G1<self::D::S> {
+class D<S extends core::Object = dynamic> extends self::_D&Object&G1<self::D::S> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/mixin.dart.strong.transformed.expect
index e84c17f..12ddf25 100644
--- a/pkg/front_end/testcases/mixin.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/mixin.dart.strong.transformed.expect
@@ -54,21 +54,21 @@
     : super core::Object::•()
     ;
 }
-abstract class G1<T extends core::Object> extends core::Object {
+abstract class G1<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method m() → dynamic
     return core::print(self::G1::T);
 }
-abstract class _D&Object&G1<S extends core::Object> extends core::Object implements self::G1<self::_D&Object&G1::S> {
+abstract class _D&Object&G1<S extends core::Object = dynamic> extends core::Object implements self::G1<self::_D&Object&G1::S> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method m() → dynamic
     return core::print(self::_D&Object&G1::S);
 }
-class D<S extends core::Object> extends self::_D&Object&G1<self::D::S> {
+class D<S extends core::Object = dynamic> extends self::_D&Object&G1<self::D::S> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.expect
index 4affa80..9d1770e 100644
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.expect
+++ b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class C<T extends self::A> extends core::Object {
+class C<T extends self::A = dynamic> extends core::Object {
   field self::C::T _field = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.transformed.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.transformed.expect
index 6424b60..0e95fd1 100644
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class C<T extends self::A> extends core::Object {
+class C<T extends self::A = dynamic> extends core::Object {
   field self::C::T _field = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect
index dbe9a87..9409948 100644
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect
+++ b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     ;
 }
-class C<T extends self::A> extends core::Object {
+class C<T extends self::A = dynamic> extends core::Object {
   field self::C::T _field;
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.expect
index 453c4fe..3600b5a 100644
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.expect
+++ b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class C<T extends self::A> extends core::Object {
+class C<T extends self::A = self::A> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T _field = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.transformed.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.transformed.expect
index 79519a1..94cb3e5 100644
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class C<T extends self::A> extends core::Object {
+class C<T extends self::A = self::A> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T _field = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/named_function_scope.dart.direct.expect b/pkg/front_end/testcases/named_function_scope.dart.direct.expect
index a6a572a..637e4c1 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.direct.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.direct.expect
@@ -59,7 +59,7 @@
   {
     dynamic x = let final dynamic #t4 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:63:9: Error: 'T' is already declared in this scope.
         T< /*@context=DuplicatedNameCause*/ T>() {};
-        ^" in let final <T extends core::Object>() → dynamic T = <T extends core::Object>() → dynamic {} in T;
+        ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
   }
   {
     self::T t;
diff --git a/pkg/front_end/testcases/named_function_scope.dart.direct.transformed.expect b/pkg/front_end/testcases/named_function_scope.dart.direct.transformed.expect
index a6a572a..637e4c1 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.direct.transformed.expect
@@ -59,7 +59,7 @@
   {
     dynamic x = let final dynamic #t4 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:63:9: Error: 'T' is already declared in this scope.
         T< /*@context=DuplicatedNameCause*/ T>() {};
-        ^" in let final <T extends core::Object>() → dynamic T = <T extends core::Object>() → dynamic {} in T;
+        ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
   }
   {
     self::T t;
diff --git a/pkg/front_end/testcases/named_function_scope.dart.strong.expect b/pkg/front_end/testcases/named_function_scope.dart.strong.expect
index c207784..3c4db65 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.strong.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.strong.expect
@@ -61,7 +61,7 @@
   {
     dynamic x = let final dynamic #t4 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:63:9: Error: 'T' is already declared in this scope.
         T< /*@context=DuplicatedNameCause*/ T>() {};
-        ^" in let final <T extends core::Object>() → dynamic T = <T extends core::Object>() → dynamic {} in T;
+        ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
   }
   {
     self::T t;
diff --git a/pkg/front_end/testcases/named_function_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/named_function_scope.dart.strong.transformed.expect
index 4fcb933..155e18a 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.strong.transformed.expect
@@ -61,7 +61,7 @@
   {
     dynamic x = let final dynamic #t4 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:63:9: Error: 'T' is already declared in this scope.
         T< /*@context=DuplicatedNameCause*/ T>() {};
-        ^" in let final <T extends core::Object>() → dynamic T = <T extends core::Object>() → dynamic {} in T;
+        ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
   }
   {
     self::T t;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.expect
index bf9c46c..4ff7688 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.transformed.expect
index 32ef81f..01d96cb 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
index 969a34b..7e40698 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract method foo() → self::I::T;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
index bf9c46c..4ff7688 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
index 32ef81f..01d96cb 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
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
index 0273119..edbd26a 100644
--- a/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.expect
+++ b/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends core::Object>(core::Map<self::A::T, self::A::f::U> m) → void {}
+  method f<U extends core::Object = dynamic>(core::Map<self::A::T, self::A::f::U> m) → void {}
 }
 class B extends self::A<core::String> {
   synthetic constructor •() → void
     : super self::A::•()
     ;
-  method f<V extends core::Object>(core::Map<core::String, self::B::f::V> m) → void {}
+  method f<V extends core::Object = dynamic>(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.direct.transformed.expect b/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.transformed.expect
index 0273119..edbd26a 100644
--- a/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.transformed.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends core::Object>(core::Map<self::A::T, self::A::f::U> m) → void {}
+  method f<U extends core::Object = dynamic>(core::Map<self::A::T, self::A::f::U> m) → void {}
 }
 class B extends self::A<core::String> {
   synthetic constructor •() → void
     : super self::A::•()
     ;
-  method f<V extends core::Object>(core::Map<core::String, self::B::f::V> m) → void {}
+  method f<V extends core::Object = dynamic>(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
index 5c2a82a..b2cfae4 100644
--- a/pkg/front_end/testcases/override_check_two_substitutions.dart.outline.expect
+++ b/pkg/front_end/testcases/override_check_two_substitutions.dart.outline.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
-  method f<U extends core::Object>(core::Map<self::A::T, self::A::f::U> m) → void
+  method f<U extends core::Object = dynamic>(core::Map<self::A::T, self::A::f::U> m) → void
     ;
 }
 class B extends self::A<core::String> {
   synthetic constructor •() → void
     ;
-  method f<V extends core::Object>(core::Map<core::String, self::B::f::V> m) → void
+  method f<V extends core::Object = dynamic>(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
index 5871307..3d2edc0 100644
--- a/pkg/front_end/testcases/override_check_two_substitutions.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_two_substitutions.dart.strong.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic 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 {}
+  method f<U extends core::Object = dynamic>(generic-covariant-impl generic-covariant-interface core::Map<self::A::T, self::A::f::U> m) → void {}
 }
 class B extends self::A<core::String> {
   synthetic constructor •() → void
     : super self::A::•()
     ;
-  method f<V extends core::Object>(generic-covariant-impl core::Map<core::String, self::B::f::V> m) → void {}
+  method f<V extends core::Object = dynamic>(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_two_substitutions.dart.strong.transformed.expect b/pkg/front_end/testcases/override_check_two_substitutions.dart.strong.transformed.expect
index 5871307..3d2edc0 100644
--- a/pkg/front_end/testcases/override_check_two_substitutions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/override_check_two_substitutions.dart.strong.transformed.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic 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 {}
+  method f<U extends core::Object = dynamic>(generic-covariant-impl generic-covariant-interface core::Map<self::A::T, self::A::f::U> m) → void {}
 }
 class B extends self::A<core::String> {
   synthetic constructor •() → void
     : super self::A::•()
     ;
-  method f<V extends core::Object>(generic-covariant-impl core::Map<core::String, self::B::f::V> m) → void {}
+  method f<V extends core::Object = dynamic>(generic-covariant-impl core::Map<core::String, self::B::f::V> m) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/qualified.dart.direct.expect b/pkg/front_end/testcases/qualified.dart.direct.expect
index 9a7583a..545aedf 100644
--- a/pkg/front_end/testcases/qualified.dart.direct.expect
+++ b/pkg/front_end/testcases/qualified.dart.direct.expect
@@ -14,7 +14,7 @@
     : super lib::Supertype::•()
     ;
 }
-class C<T extends core::Object> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
+class C<T extends core::Object = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
   static field dynamic _redirecting# = <dynamic>[self::C::b];
   constructor •() → void
     : super core::Object::•()
@@ -22,7 +22,7 @@
   constructor a() → void
     : super core::Object::•()
     ;
-  static factory b<T extends core::Object>() → self::C<self::C::b::T>
+  static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
     let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
 }
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
diff --git a/pkg/front_end/testcases/qualified.dart.direct.transformed.expect b/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
index a428888..de3c17e 100644
--- a/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
@@ -20,7 +20,7 @@
     : super lib::Supertype::•()
     ;
 }
-class C<T extends core::Object> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
+class C<T extends core::Object = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
   static field dynamic _redirecting# = <dynamic>[self::C::b];
   constructor •() → void
     : super core::Object::•()
@@ -28,7 +28,7 @@
   constructor a() → void
     : super core::Object::•()
     ;
-  static factory b<T extends core::Object>() → self::C<self::C::b::T>
+  static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
     let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
 }
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
diff --git a/pkg/front_end/testcases/qualified.dart.outline.expect b/pkg/front_end/testcases/qualified.dart.outline.expect
index 1214470..b04c33a 100644
--- a/pkg/front_end/testcases/qualified.dart.outline.expect
+++ b/pkg/front_end/testcases/qualified.dart.outline.expect
@@ -15,13 +15,13 @@
   synthetic constructor •() → void
     ;
 }
-class C<T extends core::Object> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
+class C<T extends core::Object = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
   static field dynamic _redirecting# = <dynamic>[self::C::b];
   constructor •() → void
     ;
   constructor a() → void
     ;
-  static factory b<T extends core::Object>() → self::C<self::C::b::T>
+  static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
     let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/qualified.dart.strong.expect b/pkg/front_end/testcases/qualified.dart.strong.expect
index 7136bf5..ead5697 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.expect
@@ -14,7 +14,7 @@
     : super lib::Supertype::•()
     ;
 }
-class C<T extends core::Object> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
+class C<T extends core::Object = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
   static field dynamic _redirecting# = <dynamic>[self::C::b];
   constructor •() → void
     : super core::Object::•()
@@ -22,7 +22,7 @@
   constructor a() → void
     : super core::Object::•()
     ;
-  static factory b<T extends core::Object>() → self::C<self::C::b::T>
+  static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
     let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
 }
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:12:3: Error: Type 'lib.Missing' not found.
diff --git a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
index b90128a..54bc304 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
@@ -20,7 +20,7 @@
     : super lib::Supertype::•()
     ;
 }
-class C<T extends core::Object> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
+class C<T extends core::Object = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
   static field dynamic _redirecting# = <dynamic>[self::C::b];
   constructor •() → void
     : super core::Object::•()
@@ -28,8 +28,8 @@
   constructor a() → void
     : super core::Object::•()
     ;
-  static factory b<T extends core::Object>() → self::C<self::C::b::T>
-    let <T extends core::Object>() → lib::C<lib::C::b::T> #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
+  static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
+    let <T extends core::Object = dynamic>() → lib::C<lib::C::b::T> #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
 }
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:12:3: Error: Type 'lib.Missing' not found.
   lib.Missing method() {}
diff --git a/pkg/front_end/testcases/rasta/generic_factory.dart.outline.expect b/pkg/front_end/testcases/rasta/generic_factory.dart.outline.expect
index b03c5e3..1033641 100644
--- a/pkg/front_end/testcases/rasta/generic_factory.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/generic_factory.dart.outline.expect
@@ -14,27 +14,27 @@
   synthetic constructor •() → void
     ;
 }
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::a, self::A::b, self::A::c];
   constructor internal() → void
     ;
-  static factory a<T extends core::Object>() → self::A<self::A::a::T>
+  static factory a<T extends core::Object = dynamic>() → self::A<self::A::a::T>
     let dynamic #redirecting_factory = self::B::a in let self::A::a::T #typeArg0 = null in invalid-expression;
-  static factory b<T extends core::Object>() → self::A<self::A::b::T>
+  static factory b<T extends core::Object = dynamic>() → self::A<self::A::b::T>
     let dynamic #redirecting_factory = self::B::a in let self::C1 #typeArg0 = null in invalid-expression;
-  static factory c<T extends core::Object>() → self::A<self::A::c::T>
+  static factory c<T extends core::Object = dynamic>() → self::A<self::A::c::T>
     let dynamic #redirecting_factory = "Missing" in invalid-expression;
 }
-class B<S extends core::Object> extends self::A<self::B::S> {
+class B<S extends core::Object = dynamic> extends self::A<self::B::S> {
   static field dynamic _redirecting# = <dynamic>[self::B::a, self::B::b];
   constructor internal() → void
     ;
-  static factory a<S extends core::Object>() → self::B<self::B::a::S>
+  static factory a<S extends core::Object = dynamic>() → self::B<self::B::a::S>
     let dynamic #redirecting_factory = self::C::• in let self::B::a::S #typeArg0 = null in invalid-expression;
-  static factory b<S extends core::Object>() → self::B<self::B::b::S>
+  static factory b<S extends core::Object = dynamic>() → self::B<self::B::b::S>
     let dynamic #redirecting_factory = self::C::• in let self::C2 #typeArg0 = null in invalid-expression;
 }
-class C<U extends core::Object> extends self::B<self::C::U> {
+class C<U extends core::Object = dynamic> extends self::B<self::C::U> {
   constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000068.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.direct.expect
index d2e5607..3432824 100644
--- a/pkg/front_end/testcases/rasta/issue_000068.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000068.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "package:expect/expect.dart" as exp;
 
-class G<T extends core::Object> extends core::Object {
+class G<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/rasta/issue_000068.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.direct.transformed.expect
index d2e5607..3432824 100644
--- a/pkg/front_end/testcases/rasta/issue_000068.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000068.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "package:expect/expect.dart" as exp;
 
-class G<T extends core::Object> extends core::Object {
+class G<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/rasta/issue_000068.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.outline.expect
index e1d7f2e..9c46dd8 100644
--- a/pkg/front_end/testcases/rasta/issue_000068.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000068.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class G<T extends core::Object> extends core::Object {
+class G<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.direct.expect
index a80d4c3..3ea2923b 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "package:expect/expect.dart" as exp;
 
-class A<N extends core::Object, S extends core::Object, U extends core::Object> extends core::Object {
+class A<N extends core::Object = dynamic, S extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   final field core::List<self::A::U> field;
   constructor •(self::A::N n, self::A::S s) → void
     : self::A::field = core::List::•<self::A::U>(), super core::Object::•() {
@@ -15,7 +15,7 @@
   const constructor c(self::A::U u, self::A::S s) → void
     : self::A::field = const <dynamic>[null], super core::Object::•()
     ;
-  static factory f<N extends core::Object, S extends core::Object, U extends core::Object>(self::A::f::S s) → self::A<self::A::f::N, self::A::f::S, self::A::f::U> {
+  static factory f<N extends core::Object = dynamic, S extends core::Object = dynamic, U extends core::Object = dynamic>(self::A::f::S s) → self::A<self::A::f::N, self::A::f::S, self::A::f::U> {
     exp::Expect::isTrue(s is self::A::f::S);
     return new self::A::empty<dynamic, dynamic, dynamic>();
   }
@@ -24,12 +24,12 @@
   }
   set setter(self::A::S s) → void {}
 }
-abstract class J<Aa extends core::Object, B extends core::Object> extends core::Object {
+abstract class J<Aa extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-abstract class I<H extends core::Object, C extends core::Object, K extends core::Object> extends self::J<self::I::C, self::I::K> {
+abstract class I<H extends core::Object = dynamic, C extends core::Object = dynamic, K extends core::Object = dynamic> extends self::J<self::I::C, self::I::K> {
   synthetic constructor •() → void
     : super self::J::•()
     ;
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.direct.transformed.expect
index a80d4c3..3ea2923b 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "package:expect/expect.dart" as exp;
 
-class A<N extends core::Object, S extends core::Object, U extends core::Object> extends core::Object {
+class A<N extends core::Object = dynamic, S extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   final field core::List<self::A::U> field;
   constructor •(self::A::N n, self::A::S s) → void
     : self::A::field = core::List::•<self::A::U>(), super core::Object::•() {
@@ -15,7 +15,7 @@
   const constructor c(self::A::U u, self::A::S s) → void
     : self::A::field = const <dynamic>[null], super core::Object::•()
     ;
-  static factory f<N extends core::Object, S extends core::Object, U extends core::Object>(self::A::f::S s) → self::A<self::A::f::N, self::A::f::S, self::A::f::U> {
+  static factory f<N extends core::Object = dynamic, S extends core::Object = dynamic, U extends core::Object = dynamic>(self::A::f::S s) → self::A<self::A::f::N, self::A::f::S, self::A::f::U> {
     exp::Expect::isTrue(s is self::A::f::S);
     return new self::A::empty<dynamic, dynamic, dynamic>();
   }
@@ -24,12 +24,12 @@
   }
   set setter(self::A::S s) → void {}
 }
-abstract class J<Aa extends core::Object, B extends core::Object> extends core::Object {
+abstract class J<Aa extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-abstract class I<H extends core::Object, C extends core::Object, K extends core::Object> extends self::J<self::I::C, self::I::K> {
+abstract class I<H extends core::Object = dynamic, C extends core::Object = dynamic, K extends core::Object = dynamic> extends self::J<self::I::C, self::I::K> {
   synthetic constructor •() → void
     : super self::J::•()
     ;
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
index c0e3673..00c0cb3 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<N extends core::Object, S extends core::Object, U extends core::Object> extends core::Object {
+class A<N extends core::Object = dynamic, S extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   final field core::List<self::A::U> field;
   constructor •(self::A::N n, self::A::S s) → void
     ;
@@ -10,18 +10,18 @@
     ;
   const constructor c(self::A::U u, self::A::S s) → void
     ;
-  static factory f<N extends core::Object, S extends core::Object, U extends core::Object>(self::A::f::S s) → self::A<self::A::f::N, self::A::f::S, self::A::f::U>
+  static factory f<N extends core::Object = dynamic, S extends core::Object = dynamic, U extends core::Object = dynamic>(self::A::f::S s) → self::A<self::A::f::N, self::A::f::S, self::A::f::U>
     ;
   get getter() → core::List<self::A::U>
     ;
   set setter(self::A::S s) → void
     ;
 }
-abstract class J<Aa extends core::Object, B extends core::Object> extends core::Object {
+abstract class J<Aa extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-abstract class I<H extends core::Object, C extends core::Object, K extends core::Object> extends self::J<self::I::C, self::I::K> {
+abstract class I<H extends core::Object = dynamic, C extends core::Object = dynamic, K extends core::Object = dynamic> extends self::J<self::I::C, self::I::K> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/mixin_library.dart.outline.expect b/pkg/front_end/testcases/rasta/mixin_library.dart.outline.expect
index fdda949..27d7daf 100644
--- a/pkg/front_end/testcases/rasta/mixin_library.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/mixin_library.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Mixin<T extends core::Object> extends core::Object {
+class Mixin<T extends core::Object = dynamic> extends core::Object {
   field dynamic x;
   field dynamic y;
   field dynamic z;
diff --git a/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect b/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect
index 58551e4..06badae 100644
--- a/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Mixin<T extends core::Object> extends core::Object {
+class Mixin<T extends core::Object = dynamic> extends core::Object {
   field dynamic x = self::f();
   field dynamic y = null;
   field dynamic z = null;
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.direct.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.direct.expect
index 25388a4..f43c8b5 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "./mixin_library.dart" as mix;
 
-class Super<S extends core::Object> extends core::Object {
+class Super<S extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -12,9 +12,9 @@
   method f() → dynamic
     return 3;
 }
-abstract class _C&Super&Mixin<V extends core::Object> = self::Super<self::_C&Super&Mixin::V> with mix::Mixin<self::_C&Super&Mixin::V> {
+abstract class _C&Super&Mixin<V extends core::Object = dynamic> = self::Super<self::_C&Super&Mixin::V> with mix::Mixin<self::_C&Super&Mixin::V> {
 }
-class C<V extends core::Object> extends self::_C&Super&Mixin<self::C::V> {
+class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
   synthetic constructor •() → void
     : super self::Super::•()
     ;
@@ -26,7 +26,7 @@
     : super self::Super::•()
     ;
 }
-class C2<V extends core::Object> = self::Super<self::C2::V> with mix::Mixin<self::C2::V> {
+class C2<V extends core::Object = dynamic> = self::Super<self::C2::V> with mix::Mixin<self::C2::V> {
   synthetic constructor •() → void
     : super self::Super::•()
     ;
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.direct.transformed.expect
index 8540267..49f815b 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "./mixin_library.dart" as mix;
 
-class Super<S extends core::Object> extends core::Object {
+class Super<S extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -12,7 +12,7 @@
   method f() → dynamic
     return 3;
 }
-abstract class _C&Super&Mixin<V extends core::Object> extends self::Super<self::_C&Super&Mixin::V> implements mix::Mixin<self::_C&Super&Mixin::V> {
+abstract class _C&Super&Mixin<V extends core::Object = dynamic> extends self::Super<self::_C&Super&Mixin::V> implements mix::Mixin<self::_C&Super&Mixin::V> {
   field dynamic x = mix::f()/* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
@@ -33,7 +33,7 @@
   method /* from org-dartlang-testcase:///mixin_library.dart */ publicMethod() → dynamic
     return this.{mix::Mixin::_privateMethod}();
 }
-class C<V extends core::Object> extends self::_C&Super&Mixin<self::C::V> {
+class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
   synthetic constructor •() → void
     : super self::Super::•()
     ;
@@ -64,7 +64,7 @@
     : super self::Super::•()
     ;
 }
-class C2<V extends core::Object> extends self::Super<self::C2::V> implements mix::Mixin<self::C2::V> {
+class C2<V extends core::Object = dynamic> extends self::Super<self::C2::V> implements mix::Mixin<self::C2::V> {
   field dynamic x = mix::f()/* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.outline.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.outline.expect
index e1bc111..226be4d 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "./mixin_library.dart" as mix;
 
-class Super<S extends core::Object> extends core::Object {
+class Super<S extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method foo() → dynamic
@@ -11,9 +11,9 @@
   method f() → dynamic
     ;
 }
-abstract class _C&Super&Mixin<V extends core::Object> = self::Super<self::_C&Super&Mixin::V> with mix::Mixin<self::_C&Super&Mixin::V> {
+abstract class _C&Super&Mixin<V extends core::Object = dynamic> = self::Super<self::_C&Super&Mixin::V> with mix::Mixin<self::_C&Super&Mixin::V> {
 }
-class C<V extends core::Object> extends self::_C&Super&Mixin<self::C::V> {
+class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
   synthetic constructor •() → void
     ;
 }
@@ -23,7 +23,7 @@
   synthetic constructor •() → void
     ;
 }
-class C2<V extends core::Object> = self::Super<self::C2::V> with mix::Mixin<self::C2::V> {
+class C2<V extends core::Object = dynamic> = self::Super<self::C2::V> with mix::Mixin<self::C2::V> {
   synthetic constructor •() → void
     : super self::Super::•()
     ;
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
index 6a403fb..abb198d 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "./mixin_library.dart" as mix;
 
-class Super<S extends core::Object> extends core::Object {
+class Super<S extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -12,9 +12,9 @@
   method f() → dynamic
     return 3;
 }
-abstract class _C&Super&Mixin<V extends core::Object> = self::Super<self::_C&Super&Mixin::V> with mix::Mixin<self::_C&Super&Mixin::V> {
+abstract class _C&Super&Mixin<V extends core::Object = dynamic> = self::Super<self::_C&Super&Mixin::V> with mix::Mixin<self::_C&Super&Mixin::V> {
 }
-class C<V extends core::Object> extends self::_C&Super&Mixin<self::C::V> {
+class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
   synthetic constructor •() → void
     : super self::Super::•()
     ;
@@ -29,7 +29,7 @@
     ;
   abstract forwarding-stub set t(generic-covariant-impl dynamic _) → void;
 }
-class C2<V extends core::Object> = self::Super<self::C2::V> with mix::Mixin<self::C2::V> {
+class C2<V extends core::Object = dynamic> = self::Super<self::C2::V> with mix::Mixin<self::C2::V> {
   synthetic constructor •() → void
     : super self::Super::•()
     ;
diff --git a/pkg/front_end/testcases/rasta/type_literals.dart.outline.expect b/pkg/front_end/testcases/rasta/type_literals.dart.outline.expect
index 4f17669..48fb196 100644
--- a/pkg/front_end/testcases/rasta/type_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/type_literals.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 typedef Func = () → void;
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method test() → dynamic
diff --git a/pkg/front_end/testcases/redirecting_factory.dart.outline.expect b/pkg/front_end/testcases/redirecting_factory.dart.outline.expect
index 4a460e9..0e9db8ea 100644
--- a/pkg/front_end/testcases/redirecting_factory.dart.outline.expect
+++ b/pkg/front_end/testcases/redirecting_factory.dart.outline.expect
@@ -2,51 +2,51 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class FooBase<Tf extends core::Object> extends core::Object {
+abstract class FooBase<Tf extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::FooBase::•];
   abstract get x() → core::int;
-  static factory •<Tf extends core::Object>(core::int x) → self::FooBase<self::FooBase::•::Tf>
+  static factory •<Tf extends core::Object = dynamic>(core::int x) → self::FooBase<self::FooBase::•::Tf>
     let dynamic #redirecting_factory = self::Foo::• in let self::FooBase::•::Tf #typeArg0 = null in invalid-expression;
 }
-abstract class Foo<T extends core::Object> extends core::Object implements self::FooBase<dynamic> {
+abstract class Foo<T extends core::Object = dynamic> extends core::Object implements self::FooBase<dynamic> {
   static field dynamic _redirecting# = <dynamic>[self::Foo::•];
-  static factory •<T extends core::Object>(core::int x) → self::Foo<self::Foo::•::T>
+  static factory •<T extends core::Object = dynamic>(core::int x) → self::Foo<self::Foo::•::T>
     let dynamic #redirecting_factory = self::Bar::• in let core::String #typeArg0 = null in let self::Foo::•::T #typeArg1 = null in invalid-expression;
 }
-class Bar<Sb extends core::Object, Tb extends core::Object> extends core::Object implements self::Foo<self::Bar::Tb> {
+class Bar<Sb extends core::Object = dynamic, Tb extends core::Object = dynamic> extends core::Object implements self::Foo<self::Bar::Tb> {
   field core::int x;
   constructor •(core::int x) → void
     ;
 }
-class Builder<X extends core::Object> extends core::Object {
+class Builder<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method method() → dynamic
     ;
 }
-class SimpleCase<A extends core::Object, B extends core::Object> extends core::Object {
+class SimpleCase<A extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::SimpleCase::•];
-  static factory •<A extends core::Object, B extends core::Object>() → self::SimpleCase<self::SimpleCase::•::A, self::SimpleCase::•::B>
+  static factory •<A extends core::Object = dynamic, B extends core::Object = dynamic>() → self::SimpleCase<self::SimpleCase::•::A, self::SimpleCase::•::B>
     let dynamic #redirecting_factory = self::SimpleCaseImpl::• in let self::SimpleCase::•::A #typeArg0 = null in let self::SimpleCase::•::B #typeArg1 = null in invalid-expression;
 }
-class SimpleCaseImpl<Ai extends core::Object, Bi extends core::Object> extends core::Object implements self::SimpleCase<self::SimpleCaseImpl::Ai, self::SimpleCaseImpl::Bi> {
+class SimpleCaseImpl<Ai extends core::Object = dynamic, Bi extends core::Object = dynamic> extends core::Object implements self::SimpleCase<self::SimpleCaseImpl::Ai, self::SimpleCaseImpl::Bi> {
   static field dynamic _redirecting# = <dynamic>[self::SimpleCaseImpl::•];
-  static factory •<Ai extends core::Object, Bi extends core::Object>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai, self::SimpleCaseImpl::•::Bi>
+  static factory •<Ai extends core::Object = dynamic, Bi extends core::Object = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai, self::SimpleCaseImpl::•::Bi>
     let dynamic #redirecting_factory = self::SimpleCaseImpl2::• in let self::SimpleCaseImpl::•::Ai #typeArg0 = null in let self::SimpleCaseImpl::•::Bi #typeArg1 = null in invalid-expression;
 }
-class SimpleCaseImpl2<Ai2 extends core::Object, Bi2 extends core::Object> extends core::Object implements self::SimpleCaseImpl<self::SimpleCaseImpl2::Ai2, self::SimpleCaseImpl2::Bi2> {
+class SimpleCaseImpl2<Ai2 extends core::Object = dynamic, Bi2 extends core::Object = dynamic> extends core::Object implements self::SimpleCaseImpl<self::SimpleCaseImpl2::Ai2, self::SimpleCaseImpl2::Bi2> {
   synthetic constructor •() → void
     ;
 }
-class Base<M extends core::Object> extends core::Object {
+class Base<M extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class Mixin<M extends core::Object> extends core::Object {
+class Mixin<M extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-class Mix<M extends core::Object> = self::Base<self::Mix::M> with self::Mixin<self::Mix::M> {
+class Mix<M extends core::Object = dynamic> = self::Base<self::Mix::M> with self::Mixin<self::Mix::M> {
   synthetic constructor •() → void
     : super self::Base::•()
     ;
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.expect
index ff74d26..b456e45 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class Foo<T extends self::X> extends core::Object {
+class Foo<T extends self::X = dynamic> extends core::Object {
   field self::Foo::T x;
   constructor fromX(self::X _init) → void
     : this self::Foo::_internal(x: _init)
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.transformed.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.transformed.expect
index ff74d26..b456e45 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class Foo<T extends self::X> extends core::Object {
+class Foo<T extends self::X = dynamic> extends core::Object {
   field self::Foo::T x;
   constructor fromX(self::X _init) → void
     : this self::Foo::_internal(x: _init)
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.outline.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.outline.expect
index 5cbe7eb..9a93e35 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.outline.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     ;
 }
-class Foo<T extends self::X> extends core::Object {
+class Foo<T extends self::X = dynamic> extends core::Object {
   field self::Foo::T x;
   constructor fromX(self::X _init) → void
     ;
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.strong.expect
index 81b63fc..ad19bc0 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.strong.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.strong.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class Foo<T extends self::X> extends core::Object {
+class Foo<T extends self::X = self::X> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::Foo::T x;
   constructor fromX(self::X _init) → void
     : this self::Foo::_internal(x: _init as{TypeError} self::Foo::T)
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.strong.transformed.expect
index 81b63fc..ad19bc0 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class Foo<T extends self::X> extends core::Object {
+class Foo<T extends self::X = self::X> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::Foo::T x;
   constructor fromX(self::X _init) → void
     : this self::Foo::_internal(x: _init as{TypeError} self::Foo::T)
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.expect
index d42aaa0..4a3a9d5 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<T extends core::Object> extends core::Object {
+class Foo<T extends core::Object = dynamic> extends core::Object {
   field self::Foo::T x;
   constructor from(core::String _init) → void
     : this self::Foo::_internal(x: _init)
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.transformed.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.transformed.expect
index d42aaa0..4a3a9d5 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<T extends core::Object> extends core::Object {
+class Foo<T extends core::Object = dynamic> extends core::Object {
   field self::Foo::T x;
   constructor from(core::String _init) → void
     : this self::Foo::_internal(x: _init)
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.outline.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.outline.expect
index 10bf447..467c389 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.outline.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<T extends core::Object> extends core::Object {
+class Foo<T extends core::Object = dynamic> extends core::Object {
   field self::Foo::T x;
   constructor from(core::String _init) → void
     ;
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect
index db3b854..b07315d 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<T extends core::Object> extends core::Object {
+class Foo<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::Foo::T x;
   constructor from(core::String _init) → void
     : this self::Foo::_internal(x: let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::Foo::T'.
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.transformed.expect
index db3b854..b07315d 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<T extends core::Object> extends core::Object {
+class Foo<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::Foo::T x;
   constructor from(core::String _init) → void
     : this self::Foo::_internal(x: let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::Foo::T'.
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.outline.expect b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.outline.expect
index 1b274eb..038ab97 100644
--- a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.outline.expect
+++ b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.outline.expect
@@ -2,21 +2,21 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
   constructor empty() → void
     ;
-  static factory •<T extends core::Object>() → self::A<self::A::•::T>
+  static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
     let dynamic #redirecting_factory = self::B::• in let self::A::•::T #typeArg0 = null in let core::num #typeArg1 = null in invalid-expression;
 }
-class B<U extends core::Object, W extends core::Object> extends self::A<self::B::U> {
+class B<U extends core::Object = dynamic, W extends core::Object = dynamic> extends self::A<self::B::U> {
   static field dynamic _redirecting# = <dynamic>[self::B::•];
   constructor empty() → void
     ;
-  static factory •<U extends core::Object, W extends core::Object>() → self::B<self::B::•::U, self::B::•::W>
+  static factory •<U extends core::Object = dynamic, W extends core::Object = dynamic>() → self::B<self::B::•::U, self::B::•::W>
     let dynamic #redirecting_factory = self::C::• in let self::B::•::U #typeArg0 = null in let self::B::•::W #typeArg1 = null in let core::String #typeArg2 = null in invalid-expression;
 }
-class C<V extends core::Object, S extends core::Object, R extends core::Object> extends self::B<self::C::V, self::C::S> {
+class C<V extends core::Object = dynamic, S extends core::Object = dynamic, R extends core::Object = dynamic> extends self::B<self::C::V, self::C::S> {
   constructor •() → void
     ;
   method toString() → dynamic
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.outline.expect b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.outline.expect
index 7e4faab..f6ba5d2 100644
--- a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.outline.expect
+++ b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.outline.expect
@@ -2,21 +2,21 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<T extends core::Object> extends core::Object {
+abstract class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
   constructor empty() → void
     ;
-  static factory •<T extends core::Object>() → self::A<self::A::•::T>
+  static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
     let dynamic #redirecting_factory = self::B::• in let self::A::•::T #typeArg0 = null in let core::List<self::A::•::T> #typeArg1 = null in invalid-expression;
 }
-abstract class B<U extends core::Object, W extends core::Object> extends self::A<self::B::U> {
+abstract class B<U extends core::Object = dynamic, W extends core::Object = dynamic> extends self::A<self::B::U> {
   static field dynamic _redirecting# = <dynamic>[self::B::•];
   constructor empty() → void
     ;
-  static factory •<U extends core::Object, W extends core::Object>() → self::B<self::B::•::U, self::B::•::W>
+  static factory •<U extends core::Object = dynamic, W extends core::Object = dynamic>() → self::B<self::B::•::U, self::B::•::W>
     let dynamic #redirecting_factory = self::C::• in let self::B::•::U #typeArg0 = null in let self::B::•::W #typeArg1 = null in let core::Map<self::B::•::U, self::B::•::W> #typeArg2 = null in invalid-expression;
 }
-class C<V extends core::Object, S extends core::Object, R extends core::Object> extends self::B<self::C::V, self::C::S> {
+class C<V extends core::Object = dynamic, S extends core::Object = dynamic, R extends core::Object = dynamic> extends self::B<self::C::V, self::C::S> {
   constructor •() → void
     ;
   method toString() → dynamic
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.direct.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.direct.expect
index 8a13842..c39fbd5 100644
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.direct.expect
+++ b/pkg/front_end/testcases/redirection_type_arguments.dart.direct.expect
@@ -11,7 +11,7 @@
   static factory •() → self::A
     let dynamic #redirecting_factory = self::B::• in let core::String #typeArg0 = null in invalid-expression;
 }
-class B<T extends core::Object> extends self::A {
+class B<T extends core::Object = dynamic> extends self::A {
   const constructor •() → void
     : super self::A::empty()
     ;
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.direct.transformed.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.direct.transformed.expect
index 8a13842..c39fbd5 100644
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/redirection_type_arguments.dart.direct.transformed.expect
@@ -11,7 +11,7 @@
   static factory •() → self::A
     let dynamic #redirecting_factory = self::B::• in let core::String #typeArg0 = null in invalid-expression;
 }
-class B<T extends core::Object> extends self::A {
+class B<T extends core::Object = dynamic> extends self::A {
   const constructor •() → void
     : super self::A::empty()
     ;
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.outline.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.outline.expect
index 3d5f4a4..7ec5a97 100644
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.outline.expect
+++ b/pkg/front_end/testcases/redirection_type_arguments.dart.outline.expect
@@ -9,7 +9,7 @@
   static factory •() → self::A
     let dynamic #redirecting_factory = self::B::• in let core::String #typeArg0 = null in invalid-expression;
 }
-class B<T extends core::Object> extends self::A {
+class B<T extends core::Object = dynamic> extends self::A {
   const constructor •() → void
     ;
   method toString() → dynamic
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.strong.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.strong.expect
index 1ded566..781d97dc 100644
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/redirection_type_arguments.dart.strong.expect
@@ -11,7 +11,7 @@
   static factory •() → self::A
     let dynamic #redirecting_factory = self::B::• in let core::String #typeArg0 = null in invalid-expression;
 }
-class B<T extends core::Object> extends self::A {
+class B<T extends core::Object = dynamic> extends self::A {
   const constructor •() → void
     : super self::A::empty()
     ;
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.strong.transformed.expect
index f69d118..993c466 100644
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/redirection_type_arguments.dart.strong.transformed.expect
@@ -11,7 +11,7 @@
   static factory •() → self::A
     let<BottomType> #redirecting_factory = self::B::• in let core::String #typeArg0 = null in invalid-expression;
 }
-class B<T extends core::Object> extends self::A {
+class B<T extends core::Object = dynamic> extends self::A {
   const constructor •() → void
     : super self::A::empty()
     ;
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29981.dart.direct.expect
index 6da0dfb..dad6a74 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C<dynamic> field = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29981.dart.direct.transformed.expect
index 6da0dfb..dad6a74 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C<dynamic> field = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.outline.expect b/pkg/front_end/testcases/regress/issue_29981.dart.outline.expect
index b6cacd1..95b5a02 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C<dynamic> field;
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
index c4d09ee..5b58a21 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field invalid-type field = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29981.dart.strong.transformed.expect
index c4d09ee..5b58a21 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field invalid-type field = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30838.dart.direct.expect
index f535fa7..9e4af92 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<S extends core::Object> = <T extends core::Object>(T) → S;
+typedef Foo<S extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → S;
 class A extends core::Object {
   field <T extends core::Object>(T) → core::int f = null;
   synthetic constructor •() → void
@@ -12,7 +12,7 @@
     this.f<core::String>("hello");
   }
 }
-static method foo<T extends core::Object>(self::foo::T x) → core::int
+static method foo<T extends core::Object = dynamic>(self::foo::T x) → core::int
   return 3;
 static method bar() → <T extends core::Object>(T) → core::int
   return self::foo;
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30838.dart.direct.transformed.expect
index f535fa7..9e4af92 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<S extends core::Object> = <T extends core::Object>(T) → S;
+typedef Foo<S extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → S;
 class A extends core::Object {
   field <T extends core::Object>(T) → core::int f = null;
   synthetic constructor •() → void
@@ -12,7 +12,7 @@
     this.f<core::String>("hello");
   }
 }
-static method foo<T extends core::Object>(self::foo::T x) → core::int
+static method foo<T extends core::Object = dynamic>(self::foo::T x) → core::int
   return 3;
 static method bar() → <T extends core::Object>(T) → core::int
   return self::foo;
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect b/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect
index c9ded96..55709ba 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<S extends core::Object> = <T extends core::Object>(T) → S;
+typedef Foo<S extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → S;
 class A extends core::Object {
   field <T extends core::Object>(T) → core::int f;
   synthetic constructor •() → void
@@ -10,7 +10,7 @@
   method test() → void
     ;
 }
-static method foo<T extends core::Object>(self::foo::T x) → core::int
+static method foo<T extends core::Object = dynamic>(self::foo::T x) → core::int
   ;
 static method bar() → <T extends core::Object>(T) → core::int
   ;
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect b/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect
index c2c1595..f08b8e7 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<S extends core::Object> = <T extends core::Object>(T) → S;
+typedef Foo<S extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → S;
 class A extends core::Object {
   field <T extends core::Object>(T) → core::int f = null;
   synthetic constructor •() → void
@@ -12,7 +12,7 @@
     this.{self::A::f}<core::String>("hello");
   }
 }
-static method foo<T extends core::Object>(self::foo::T x) → core::int
+static method foo<T extends core::Object = dynamic>(self::foo::T x) → core::int
   return 3;
 static method bar() → <T extends core::Object>(T) → core::int
   return self::foo;
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect
index c2c1595..f08b8e7 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<S extends core::Object> = <T extends core::Object>(T) → S;
+typedef Foo<S extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → S;
 class A extends core::Object {
   field <T extends core::Object>(T) → core::int f = null;
   synthetic constructor •() → void
@@ -12,7 +12,7 @@
     this.{self::A::f}<core::String>("hello");
   }
 }
-static method foo<T extends core::Object>(self::foo::T x) → core::int
+static method foo<T extends core::Object = dynamic>(self::foo::T x) → core::int
   return 3;
 static method bar() → <T extends core::Object>(T) → core::int
   return self::foo;
diff --git a/pkg/front_end/testcases/regress/issue_31181.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31181.dart.direct.expect
index b89cafc..28d2985 100644
--- a/pkg/front_end/testcases/regress/issue_31181.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31181.dart.direct.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<T extends core::Object> = <T extends core::Object>(T) → T;
-static field <T extends core::Object>(T) → T x;
+typedef Foo<T extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → T;
+static field <T extends core::Object = dynamic>(T) → T x;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31181.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31181.dart.direct.transformed.expect
index b89cafc..28d2985 100644
--- a/pkg/front_end/testcases/regress/issue_31181.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31181.dart.direct.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<T extends core::Object> = <T extends core::Object>(T) → T;
-static field <T extends core::Object>(T) → T x;
+typedef Foo<T extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → T;
+static field <T extends core::Object = dynamic>(T) → T x;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31181.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31181.dart.outline.expect
index 8ca2fe8..b2e2e71 100644
--- a/pkg/front_end/testcases/regress/issue_31181.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31181.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<T extends core::Object> = <T extends core::Object>(T) → T;
-static field <T extends core::Object>(T) → T x;
+typedef Foo<T extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → T;
+static field <T extends core::Object = dynamic>(T) → T x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/regress/issue_31181.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31181.dart.strong.expect
index b89cafc..28d2985 100644
--- a/pkg/front_end/testcases/regress/issue_31181.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31181.dart.strong.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<T extends core::Object> = <T extends core::Object>(T) → T;
-static field <T extends core::Object>(T) → T x;
+typedef Foo<T extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → T;
+static field <T extends core::Object = dynamic>(T) → T x;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31181.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31181.dart.strong.transformed.expect
index b89cafc..28d2985 100644
--- a/pkg/front_end/testcases/regress/issue_31181.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31181.dart.strong.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<T extends core::Object> = <T extends core::Object>(T) → T;
-static field <T extends core::Object>(T) → T x;
+typedef Foo<T extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → T;
+static field <T extends core::Object = dynamic>(T) → T x;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31190.dart.direct.expect
index 4fad235..808b453 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Typed<T extends core::Object> extends core::Object {
+class Typed<T extends core::Object = dynamic> extends core::Object {
   field self::Typed::T v = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31190.dart.direct.transformed.expect
index 4fad235..808b453 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Typed<T extends core::Object> extends core::Object {
+class Typed<T extends core::Object = dynamic> extends core::Object {
   field self::Typed::T v = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31190.dart.outline.expect
index 3f98d5d..b7201fd 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Typed<T extends core::Object> extends core::Object {
+class Typed<T extends core::Object = dynamic> extends core::Object {
   field self::Typed::T v;
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect
index 2eacbb9..38248c76 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Typed<T extends core::Object> extends core::Object {
+class Typed<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::Typed::T v = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31190.dart.strong.transformed.expect
index 2eacbb9..38248c76 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Typed<T extends core::Object> extends core::Object {
+class Typed<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::Typed::T v = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31213.dart.direct.expect
index 860b081..a54adf0 100644
--- a/pkg/front_end/testcases/regress/issue_31213.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.direct.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef C<A extends core::Object, K extends core::Object> = <B extends core::Object>(A, K, B) → core::int;
-typedef D<K extends core::Object> = <A extends core::Object>(core::int) → <B extends core::Object>(A, K, B) → core::int;
-static method producer<K extends core::Object>() → dynamic {
-  return <A extends core::Object>(core::int v1) → dynamic {
-    return <B extends core::Object>(A v2, self::producer::K v3, B v4) → dynamic => 0;
+typedef C<A extends core::Object = dynamic, K extends core::Object = dynamic> = <B extends core::Object = dynamic>(A, K, B) → core::int;
+typedef D<K extends core::Object = dynamic> = <A extends core::Object = dynamic>(core::int) → <B extends core::Object>(A, K, B) → core::int;
+static method producer<K extends core::Object = dynamic>() → dynamic {
+  return <A extends core::Object = dynamic>(core::int v1) → dynamic {
+    return <B extends core::Object = dynamic>(A v2, self::producer::K v3, B v4) → dynamic => 0;
   };
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31213.dart.direct.transformed.expect
index 860b081..a54adf0 100644
--- a/pkg/front_end/testcases/regress/issue_31213.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.direct.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef C<A extends core::Object, K extends core::Object> = <B extends core::Object>(A, K, B) → core::int;
-typedef D<K extends core::Object> = <A extends core::Object>(core::int) → <B extends core::Object>(A, K, B) → core::int;
-static method producer<K extends core::Object>() → dynamic {
-  return <A extends core::Object>(core::int v1) → dynamic {
-    return <B extends core::Object>(A v2, self::producer::K v3, B v4) → dynamic => 0;
+typedef C<A extends core::Object = dynamic, K extends core::Object = dynamic> = <B extends core::Object = dynamic>(A, K, B) → core::int;
+typedef D<K extends core::Object = dynamic> = <A extends core::Object = dynamic>(core::int) → <B extends core::Object>(A, K, B) → core::int;
+static method producer<K extends core::Object = dynamic>() → dynamic {
+  return <A extends core::Object = dynamic>(core::int v1) → dynamic {
+    return <B extends core::Object = dynamic>(A v2, self::producer::K v3, B v4) → dynamic => 0;
   };
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31213.dart.outline.expect
index ab22b45..2626a19 100644
--- a/pkg/front_end/testcases/regress/issue_31213.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef C<A extends core::Object, K extends core::Object> = <B extends core::Object>(A, K, B) → core::int;
-typedef D<K extends core::Object> = <A extends core::Object>(core::int) → <B extends core::Object>(A, K, B) → core::int;
-static method producer<K extends core::Object>() → dynamic
+typedef C<A extends core::Object = dynamic, K extends core::Object = dynamic> = <B extends core::Object = dynamic>(A, K, B) → core::int;
+typedef D<K extends core::Object = dynamic> = <A extends core::Object = dynamic>(core::int) → <B extends core::Object>(A, K, B) → core::int;
+static method producer<K extends core::Object = dynamic>() → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31213.dart.strong.expect
index c6e0d5f..730da9b 100644
--- a/pkg/front_end/testcases/regress/issue_31213.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.strong.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef C<A extends core::Object, K extends core::Object> = <B extends core::Object>(A, K, B) → core::int;
-typedef D<K extends core::Object> = <A extends core::Object>(core::int) → <B extends core::Object>(A, K, B) → core::int;
-static method producer<K extends core::Object>() → dynamic {
-  return <A extends core::Object>(core::int v1) → <B extends core::Object>(A, self::producer::K, B) → core::int {
-    return <B extends core::Object>(A v2, self::producer::K v3, B v4) → core::int => 0;
+typedef C<A extends core::Object = dynamic, K extends core::Object = dynamic> = <B extends core::Object = dynamic>(A, K, B) → core::int;
+typedef D<K extends core::Object = dynamic> = <A extends core::Object = dynamic>(core::int) → <B extends core::Object>(A, K, B) → core::int;
+static method producer<K extends core::Object = dynamic>() → dynamic {
+  return <A extends core::Object = dynamic>(core::int v1) → <B extends core::Object = dynamic>(A, self::producer::K, B) → core::int {
+    return <B extends core::Object = dynamic>(A v2, self::producer::K v3, B v4) → core::int => 0;
   };
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31213.dart.strong.transformed.expect
index c6e0d5f..730da9b 100644
--- a/pkg/front_end/testcases/regress/issue_31213.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef C<A extends core::Object, K extends core::Object> = <B extends core::Object>(A, K, B) → core::int;
-typedef D<K extends core::Object> = <A extends core::Object>(core::int) → <B extends core::Object>(A, K, B) → core::int;
-static method producer<K extends core::Object>() → dynamic {
-  return <A extends core::Object>(core::int v1) → <B extends core::Object>(A, self::producer::K, B) → core::int {
-    return <B extends core::Object>(A v2, self::producer::K v3, B v4) → core::int => 0;
+typedef C<A extends core::Object = dynamic, K extends core::Object = dynamic> = <B extends core::Object = dynamic>(A, K, B) → core::int;
+typedef D<K extends core::Object = dynamic> = <A extends core::Object = dynamic>(core::int) → <B extends core::Object>(A, K, B) → core::int;
+static method producer<K extends core::Object = dynamic>() → dynamic {
+  return <A extends core::Object = dynamic>(core::int v1) → <B extends core::Object = dynamic>(A, self::producer::K, B) → core::int {
+    return <B extends core::Object = dynamic>(A v2, self::producer::K v3, B v4) → core::int => 0;
   };
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31766.dart.direct.expect
index ad01f98..c532f88 100644
--- a/pkg/front_end/testcases/regress/issue_31766.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.direct.expect
@@ -10,11 +10,11 @@
     return null;
 }
 static method main() → dynamic {
-  function bar<T extends self::A>(T t) → void {
+  function bar<T extends self::A = dynamic>(T t) → void {
     core::print("t.foo()=${t.foo()}");
   }
   bar.call(new self::A::•());
-  (<S extends self::A>(S s) → dynamic {
+  (<S extends self::A = dynamic>(S s) → dynamic {
     core::print("s.foo()=${s.foo()}");
   }).call(new self::A::•());
 }
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31766.dart.direct.transformed.expect
index ad01f98..c532f88 100644
--- a/pkg/front_end/testcases/regress/issue_31766.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.direct.transformed.expect
@@ -10,11 +10,11 @@
     return null;
 }
 static method main() → dynamic {
-  function bar<T extends self::A>(T t) → void {
+  function bar<T extends self::A = dynamic>(T t) → void {
     core::print("t.foo()=${t.foo()}");
   }
   bar.call(new self::A::•());
-  (<S extends self::A>(S s) → dynamic {
+  (<S extends self::A = dynamic>(S s) → dynamic {
     core::print("s.foo()=${s.foo()}");
   }).call(new self::A::•());
 }
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect
index 5228fa9..33b060d 100644
--- a/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect
@@ -10,11 +10,11 @@
     return null;
 }
 static method main() → dynamic {
-  function bar<T extends self::A>(T t) → void {
+  function bar<T extends self::A = dynamic>(T t) → void {
     core::print("t.foo()=${t.{self::A::foo}()}");
   }
   bar.call<self::A>(new self::A::•());
-  (<S extends self::A>(S s) → core::Null {
+  (<S extends self::A = dynamic>(S s) → core::Null {
     core::print("s.foo()=${s.{self::A::foo}()}");
   }).call<self::A>(new self::A::•());
 }
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31766.dart.strong.transformed.expect
index 5228fa9..33b060d 100644
--- a/pkg/front_end/testcases/regress/issue_31766.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.strong.transformed.expect
@@ -10,11 +10,11 @@
     return null;
 }
 static method main() → dynamic {
-  function bar<T extends self::A>(T t) → void {
+  function bar<T extends self::A = dynamic>(T t) → void {
     core::print("t.foo()=${t.{self::A::foo}()}");
   }
   bar.call<self::A>(new self::A::•());
-  (<S extends self::A>(S s) → core::Null {
+  (<S extends self::A = dynamic>(S s) → core::Null {
     core::print("s.foo()=${s.{self::A::foo}()}");
   }).call<self::A>(new self::A::•());
 }
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31846.dart.direct.expect
index 960d4d1..710cc04 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.direct.expect
@@ -4,7 +4,7 @@
 
 static method main() → dynamic {
   core::print(self::main is () → dynamic);
-  core::print((<T extends core::Object>(T x) → dynamic => x).runtimeType);
-  core::print((<T extends core::num>(T x) → dynamic => x).runtimeType);
-  core::print((<T extends core::Comparable<T>>(T x) → dynamic => x).runtimeType);
+  core::print((<T extends core::Object = dynamic>(T x) → dynamic => x).runtimeType);
+  core::print((<T extends core::num = dynamic>(T x) → dynamic => x).runtimeType);
+  core::print((<T extends core::Comparable<T> = dynamic>(T x) → dynamic => x).runtimeType);
 }
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31846.dart.direct.transformed.expect
index 960d4d1..710cc04 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 static method main() → dynamic {
   core::print(self::main is () → dynamic);
-  core::print((<T extends core::Object>(T x) → dynamic => x).runtimeType);
-  core::print((<T extends core::num>(T x) → dynamic => x).runtimeType);
-  core::print((<T extends core::Comparable<T>>(T x) → dynamic => x).runtimeType);
+  core::print((<T extends core::Object = dynamic>(T x) → dynamic => x).runtimeType);
+  core::print((<T extends core::num = dynamic>(T x) → dynamic => x).runtimeType);
+  core::print((<T extends core::Comparable<T> = dynamic>(T x) → dynamic => x).runtimeType);
 }
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect
index 8a842f2..fc1a7b3 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect
@@ -4,7 +4,7 @@
 
 static method main() → dynamic {
   core::print(self::main is () → dynamic);
-  core::print((<T extends core::Object>(T x) → T => x).{core::Object::runtimeType});
-  core::print((<T extends core::num>(T x) → T => x).{core::Object::runtimeType});
-  core::print((<T extends core::Comparable<T>>(T x) → T => x).{core::Object::runtimeType});
+  core::print((<T extends core::Object = dynamic>(T x) → T => x).{core::Object::runtimeType});
+  core::print((<T extends core::num = dynamic>(T x) → T => x).{core::Object::runtimeType});
+  core::print((<T extends core::Comparable<T> = dynamic>(T x) → T => x).{core::Object::runtimeType});
 }
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
index 8a842f2..fc1a7b3 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 static method main() → dynamic {
   core::print(self::main is () → dynamic);
-  core::print((<T extends core::Object>(T x) → T => x).{core::Object::runtimeType});
-  core::print((<T extends core::num>(T x) → T => x).{core::Object::runtimeType});
-  core::print((<T extends core::Comparable<T>>(T x) → T => x).{core::Object::runtimeType});
+  core::print((<T extends core::Object = dynamic>(T x) → T => x).{core::Object::runtimeType});
+  core::print((<T extends core::num = dynamic>(T x) → T => x).{core::Object::runtimeType});
+  core::print((<T extends core::Comparable<T> = dynamic>(T x) → T => x).{core::Object::runtimeType});
 }
diff --git a/pkg/front_end/testcases/regress/issue_31996.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31996.dart.direct.expect
index 7b5a76e..46c7f90 100644
--- a/pkg/front_end/testcases/regress/issue_31996.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31996.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class B<T extends core::Object> extends core::Object {
+abstract class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-abstract class C<T extends core::Object> extends core::Object {
+abstract class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/regress/issue_31996.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31996.dart.direct.transformed.expect
index 7b5a76e..46c7f90 100644
--- a/pkg/front_end/testcases/regress/issue_31996.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31996.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class B<T extends core::Object> extends core::Object {
+abstract class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-abstract class C<T extends core::Object> extends core::Object {
+abstract class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/regress/issue_31996.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31996.dart.outline.expect
index 5dca73f..38497b9 100644
--- a/pkg/front_end/testcases/regress/issue_31996.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31996.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class B<T extends core::Object> extends core::Object {
+abstract class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-abstract class C<T extends core::Object> extends core::Object {
+abstract class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_31996.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31996.dart.strong.expect
index 7b5a76e..46c7f90 100644
--- a/pkg/front_end/testcases/regress/issue_31996.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31996.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class B<T extends core::Object> extends core::Object {
+abstract class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-abstract class C<T extends core::Object> extends core::Object {
+abstract class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/regress/issue_31996.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31996.dart.strong.transformed.expect
index 7b5a76e..46c7f90 100644
--- a/pkg/front_end/testcases/regress/issue_31996.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31996.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class B<T extends core::Object> extends core::Object {
+abstract class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-abstract class C<T extends core::Object> extends core::Object {
+abstract class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.direct.expect b/pkg/front_end/testcases/regress/issue_32182.dart.direct.expect
index 634143d..f95cc9a 100644
--- a/pkg/front_end/testcases/regress/issue_32182.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_32182.dart.direct.transformed.expect
index aeae487..a899754 100644
--- a/pkg/front_end/testcases/regress/issue_32182.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.outline.expect b/pkg/front_end/testcases/regress/issue_32182.dart.outline.expect
index 92da155..a8c130e 100644
--- a/pkg/front_end/testcases/regress/issue_32182.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.strong.expect b/pkg/front_end/testcases/regress/issue_32182.dart.strong.expect
index e9a1802..3d90b60 100644
--- a/pkg/front_end/testcases/regress/issue_32182.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_32182.dart.strong.transformed.expect
index 179409c..34ee38b 100644
--- a/pkg/front_end/testcases/regress/issue_32182.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.expect
index cd8a1ec..24a436e 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field (self::C::T) → void y = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.transformed.expect
index cd8a1ec..24a436e 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field (self::C::T) → void y = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.outline.expect
index 27f223b..e23f39e 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field (self::C::T) → void y;
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.expect
index c6d729f..44fde23 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field (self::C::T) → void y = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.transformed.expect
index c6d729f..44fde23 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field (self::C::T) → void y = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.expect
index bf5d9be..bd2b5aa 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends (self::C::T) → void>(self::C::f::U x) → void {}
+  method f<U extends (self::C::T) → void = dynamic>(self::C::f::U x) → void {}
 }
 static method g(self::C<core::num> c) → void {
   c.f<(core::Object) → void>((core::Object o) → dynamic {});
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.transformed.expect
index bf5d9be..bd2b5aa 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends (self::C::T) → void>(self::C::f::U x) → void {}
+  method f<U extends (self::C::T) → void = dynamic>(self::C::f::U x) → void {}
 }
 static method g(self::C<core::num> c) → void {
   c.f<(core::Object) → void>((core::Object o) → dynamic {});
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.outline.expect
index 8ec2342..a709687 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
-  method f<U extends (self::C::T) → void>(self::C::f::U x) → void
+  method f<U extends (self::C::T) → void = dynamic>(self::C::f::U x) → void
     ;
 }
 static method g(self::C<core::num> c) → void
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.expect
index 547faf4..9ca2a67 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends (self::C::T) → void>(self::C::f::U x) → void {}
+  method f<U extends (self::C::T) → void = dynamic>(self::C::f::U x) → void {}
 }
 static method g(self::C<core::num> c) → void {
   c.{self::C::f}<(core::Object) → void>((core::Object o) → core::Null {});
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.transformed.expect
index 547faf4..9ca2a67 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends (self::C::T) → void>(self::C::f::U x) → void {}
+  method f<U extends (self::C::T) → void = dynamic>(self::C::f::U x) → void {}
 }
 static method g(self::C<core::num> c) → void {
   c.{self::C::f}<(core::Object) → void>((core::Object o) → core::Null {});
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.expect
index 5221de2..e5707a0 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.transformed.expect
index 5221de2..e5707a0 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.outline.expect
index a87c9ba..87b34bb 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method f1() → (self::C::T) → void
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.expect
index a18c06b..c94a828 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.transformed.expect
index a18c06b..c94a828 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.expect
index 8acd66a..e4d2536 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.transformed.expect
index 8acd66a..e4d2536 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.outline.expect
index a87c9ba..87b34bb 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method f1() → (self::C::T) → void
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.expect
index a67d03d..e9ad7e2 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.transformed.expect
index a67d03d..e9ad7e2 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.expect
index 70ed6d7..7c86eac 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-typedef G<T extends core::Object> = () → (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+typedef G<T extends core::Object = dynamic> = () → (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field (self::C::T) → void _x;
   constructor •((self::C::T) → void _x) → void
     : self::C::_x = _x, super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.transformed.expect
index 70ed6d7..7c86eac 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.transformed.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-typedef G<T extends core::Object> = () → (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+typedef G<T extends core::Object = dynamic> = () → (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field (self::C::T) → void _x;
   constructor •((self::C::T) → void _x) → void
     : self::C::_x = _x, super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.outline.expect
index e1a454a..929714f 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-typedef G<T extends core::Object> = () → (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+typedef G<T extends core::Object = dynamic> = () → (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field (self::C::T) → void _x;
   constructor •((self::C::T) → void _x) → void
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.expect
index ce92ed1..c12fd60 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-typedef G<T extends core::Object> = () → (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+typedef G<T extends core::Object = dynamic> = () → (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field (self::C::T) → void _x;
   constructor •((self::C::T) → void _x) → void
     : self::C::_x = _x, super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.transformed.expect
index ce92ed1..c12fd60 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.transformed.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-typedef G<T extends core::Object> = () → (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+typedef G<T extends core::Object = dynamic> = () → (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field (self::C::T) → void _x;
   constructor •((self::C::T) → void _x) → void
     : self::C::_x = _x, super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.expect
index e4fcea0..427e870 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field (self::C::T) → void y = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.transformed.expect
index e4fcea0..427e870 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field (self::C::T) → void y = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.outline.expect
index 871ab56..46e1514 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field (self::C::T) → void y;
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.expect
index a13a055..0d90e29 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field (self::C::T) → void y = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect
index a13a055..0d90e29 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field (self::C::T) → void y = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.expect
index 012a192..a07d5f0 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.transformed.expect
index 012a192..a07d5f0 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.outline.expect
index 5f2d058..1043616 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   get f1() → (self::C::T) → void
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.expect
index 5f2899e..147d4fd 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.transformed.expect
index 5f2899e..147d4fd 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.expect
index 7b9c2c6..35547b1 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.transformed.expect
index 7b9c2c6..35547b1 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.outline.expect
index 5f2d058..1043616 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   get f1() → (self::C::T) → void
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.expect
index 764aea8..6f4b3ea 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.transformed.expect
index 764aea8..6f4b3ea 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.expect
index b0a70d9..4f1bbc3 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends self::C::T>(self::C::f::U x) → void {}
-  method g1<U extends self::C::T>() → void {
+  method f<U extends self::C::T = dynamic>(self::C::f::U x) → void {}
+  method g1<U extends self::C::T = dynamic>() → void {
     this.{self::C::f}<self::C::g1::U>(1.5);
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.transformed.expect
index b0a70d9..4f1bbc3 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends self::C::T>(self::C::f::U x) → void {}
-  method g1<U extends self::C::T>() → void {
+  method f<U extends self::C::T = dynamic>(self::C::f::U x) → void {}
+  method g1<U extends self::C::T = dynamic>() → void {
     this.{self::C::f}<self::C::g1::U>(1.5);
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.outline.expect
index eaad1c0..ec15d19 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.outline.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
-  method f<U extends self::C::T>(self::C::f::U x) → void
+  method f<U extends self::C::T = dynamic>(self::C::f::U x) → void
     ;
-  method g1<U extends self::C::T>() → void
+  method g1<U extends self::C::T = dynamic>() → void
     ;
 }
 static method g2(self::C<core::Object> c) → void
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 73a7f87..26fb1d3 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
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  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 {
+  method f<generic-covariant-impl generic-covariant-interface U extends self::C::T = dynamic>(self::C::f::U x) → void {}
+  method g1<generic-covariant-impl generic-covariant-interface U extends self::C::T = dynamic>() → void {
     this.{self::C::f}<self::C::g1::U>(let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::C::g1::U'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::C::g1::U'.
     this.f<U>(1.5);
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect
index 25a05fa..d43df56 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  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 {
+  method f<generic-covariant-impl generic-covariant-interface U extends self::C::T = dynamic>(self::C::f::U x) → void {}
+  method g1<generic-covariant-impl generic-covariant-interface U extends self::C::T = dynamic>() → void {
     this.{self::C::f}<self::C::g1::U>(let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::C::g1::U'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::C::g1::U'.
     this.f<U>(1.5);
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.expect
index 421712c..cf3c2b8 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.transformed.expect
index 421712c..cf3c2b8 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.outline.expect
index 6ebe36d..67723c56 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method f(self::C::T x) → void
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.strong.expect
index 78f2e36..5552a2d 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.strong.transformed.expect
index 78f2e36..5552a2d 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.expect
index 51f994d..3487157 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.transformed.expect
index 51f994d..3487157 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.outline.expect
index d3057ec..3968bbe 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method f1(core::List<self::C::T> x) → void
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.strong.expect
index e945744..79250d9 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.strong.transformed.expect
index e945744..79250d9 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.expect
index 49169f4..7dfdaaf 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.expect
@@ -2,21 +2,21 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f1(self::I::T x) → void;
   abstract method f2(self::I::T x) → void;
 }
-class C<U extends core::Object> extends core::Object implements self::I<core::int> {
+class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f1(core::int x) → void {}
   method f2(core::int x, [self::C::U y = null]) → void {}
 }
-class D<U extends core::Object> extends self::C<self::D::U> {
+class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
   synthetic constructor •() → void
     : super self::C::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.transformed.expect
index 49169f4..7dfdaaf 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.transformed.expect
@@ -2,21 +2,21 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f1(self::I::T x) → void;
   abstract method f2(self::I::T x) → void;
 }
-class C<U extends core::Object> extends core::Object implements self::I<core::int> {
+class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f1(core::int x) → void {}
   method f2(core::int x, [self::C::U y = null]) → void {}
 }
-class D<U extends core::Object> extends self::C<self::D::U> {
+class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
   synthetic constructor •() → void
     : super self::C::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.outline.expect
index 6a0cec0..426bf40 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.outline.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract method f1(self::I::T x) → void;
   abstract method f2(self::I::T x) → void;
 }
-class C<U extends core::Object> extends core::Object implements self::I<core::int> {
+class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
   synthetic constructor •() → void
     ;
   method f1(core::int x) → void
@@ -16,7 +16,7 @@
   method f2(core::int x, [self::C::U y]) → void
     ;
 }
-class D<U extends core::Object> extends self::C<self::D::U> {
+class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
   synthetic constructor •() → void
     ;
   method f1(core::int x) → void
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.strong.expect
index b941549..97d183c 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.strong.expect
@@ -2,21 +2,21 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f1(generic-covariant-impl generic-covariant-interface self::I::T x) → void;
   abstract method f2(generic-covariant-impl generic-covariant-interface self::I::T x) → void;
 }
-class C<U extends core::Object> extends core::Object implements self::I<core::int> {
+class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f1(generic-covariant-impl core::int x) → void {}
   method f2(generic-covariant-impl core::int x, [generic-covariant-impl generic-covariant-interface self::C::U y = null]) → void {}
 }
-class D<U extends core::Object> extends self::C<self::D::U> {
+class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
   synthetic constructor •() → void
     : super self::C::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.strong.transformed.expect
index b941549..97d183c 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.strong.transformed.expect
@@ -2,21 +2,21 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f1(generic-covariant-impl generic-covariant-interface self::I::T x) → void;
   abstract method f2(generic-covariant-impl generic-covariant-interface self::I::T x) → void;
 }
-class C<U extends core::Object> extends core::Object implements self::I<core::int> {
+class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f1(generic-covariant-impl core::int x) → void {}
   method f2(generic-covariant-impl core::int x, [generic-covariant-impl generic-covariant-interface self::C::U y = null]) → void {}
 }
-class D<U extends core::Object> extends self::C<self::D::U> {
+class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
   synthetic constructor •() → void
     : super self::C::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.expect
index 8d93c66..6577fa6 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.transformed.expect
index 0292b5f..f4b7d39 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.outline.expect
index a9b1002..0a93e1b 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.outline.expect
@@ -8,7 +8,7 @@
   method f(core::int x) → void
     ;
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract method f(self::I::T x) → void;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.expect
index 10178cb..d5ddea7 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.transformed.expect
index 2a932d4..1feabc7 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.expect
index e6d6b9b..5c01902 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.transformed.expect
index e6d6b9b..5c01902 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.outline.expect
index 57bd231..5990c58 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.outline.expect
@@ -8,7 +8,7 @@
   method f(core::int x) → void
     ;
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract method f(self::I::T x) → void;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.strong.expect
index dfe595c..fb37f0a 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.strong.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.strong.transformed.expect
index dfe595c..fb37f0a 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.expect
index 2a83d23..eb9914c 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.transformed.expect
index 11b38c7..0cc0cd00 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.outline.expect
index 94b5113..4815e5f 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.outline.expect
@@ -8,7 +8,7 @@
   method f(core::int x) → void
     ;
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract method f(self::I::T x) → void;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.expect
index 2f06fdd..710336f 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.transformed.expect
index e10a6c4..7d07c7b 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.expect
index f7ef8a8..625be9b 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-typedef G<T extends core::Object, U extends core::Object> = (T) → U;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+typedef G<T extends core::Object = dynamic, U extends core::Object = dynamic> = (T) → U;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.transformed.expect
index f7ef8a8..625be9b 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.transformed.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-typedef G<T extends core::Object, U extends core::Object> = (T) → U;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+typedef G<T extends core::Object = dynamic, U extends core::Object = dynamic> = (T) → U;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.outline.expect
index 351f537..f1468ee 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-typedef G<T extends core::Object, U extends core::Object> = (T) → U;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+typedef G<T extends core::Object = dynamic, U extends core::Object = dynamic> = (T) → U;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method f1(self::C::T x) → void
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.strong.expect
index 89e8e41..b36578d 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.strong.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-typedef G<T extends core::Object, U extends core::Object> = (T) → U;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+typedef G<T extends core::Object = dynamic, U extends core::Object = dynamic> = (T) → U;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.strong.transformed.expect
index 89e8e41..b36578d 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.strong.transformed.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-typedef G<T extends core::Object, U extends core::Object> = (T) → U;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+typedef G<T extends core::Object = dynamic, U extends core::Object = dynamic> = (T) → U;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.expect
index 773f079..85f3c37 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → dynamic;
+typedef F<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.transformed.expect
index 773f079..85f3c37 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → dynamic;
+typedef F<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.outline.expect
index c28351a..2b11d85 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → dynamic;
+typedef F<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.strong.expect
index 03b5829..ba57944 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → dynamic;
+typedef F<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.strong.transformed.expect
index 03b5829..ba57944 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → dynamic;
+typedef F<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.expect
index 3552fdc..af80278 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.transformed.expect
index 3552fdc..af80278 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.outline.expect
index 0ab028a..70e1cb2 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T x;
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.strong.expect
index 6dcd2b4..872b355 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.strong.transformed.expect
index 6dcd2b4..872b355 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.expect
index e710937..4ac52bc 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.transformed.expect
index e710937..4ac52bc 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.outline.expect
index 29cb370..3ce3e00 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method f1(self::C::T x) → void
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.strong.expect
index 4655e62..24e6b93 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.strong.transformed.expect
index 4655e62..24e6b93 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.expect
index 1bd3bd3..7595443 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends self::C::T>(self::C::f::U x) → void {}
+  method f<U extends self::C::T = dynamic>(self::C::f::U x) → void {}
 }
 static method g1(dynamic d) → void {
   d.f<core::num>(1.5);
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.transformed.expect
index 1bd3bd3..7595443 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<U extends self::C::T>(self::C::f::U x) → void {}
+  method f<U extends self::C::T = dynamic>(self::C::f::U x) → void {}
 }
 static method g1(dynamic d) → void {
   d.f<core::num>(1.5);
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.outline.expect
index 1beaf51..b72ecf1 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
-  method f<U extends self::C::T>(self::C::f::U x) → void
+  method f<U extends self::C::T = dynamic>(self::C::f::U x) → void
     ;
 }
 static method g1(dynamic d) → void
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.strong.expect
index 3ebc69c..015a396 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.strong.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<generic-covariant-impl generic-covariant-interface U extends self::C::T>(self::C::f::U x) → void {}
+  method f<generic-covariant-impl generic-covariant-interface U extends self::C::T = dynamic>(self::C::f::U x) → void {}
 }
 static method g1(dynamic d) → void {
   d.f<core::num>(1.5);
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.strong.transformed.expect
index 3ebc69c..015a396 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  method f<generic-covariant-impl generic-covariant-interface U extends self::C::T>(self::C::f::U x) → void {}
+  method f<generic-covariant-impl generic-covariant-interface U extends self::C::T = dynamic>(self::C::f::U x) → void {}
 }
 static method g1(dynamic d) → void {
   d.f<core::num>(1.5);
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.expect
index bd9af0e..ed9baff 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.transformed.expect
index bd9af0e..ed9baff 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect
index 2ac3d36..b253175 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x;
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.expect
index 0620b1b..ad33099 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::B::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.transformed.expect
index 0620b1b..ad33099 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::B::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.expect
index e6905e8..de3d63c 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.expect
@@ -19,7 +19,7 @@
     }
   }
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.transformed.expect
index e6905e8..de3d63c 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.transformed.expect
@@ -19,7 +19,7 @@
     }
   }
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.outline.expect
index eb83109..9719eeb 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.outline.expect
@@ -13,7 +13,7 @@
   method check(core::Object expectedValue) → void
     ;
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract method f([self::I::T x]) → void;
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.expect
index 8db2e73..3cd551d 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.expect
@@ -19,7 +19,7 @@
     }
   }
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.transformed.expect
index 8db2e73..3cd551d 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
     }
   }
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.expect
index bc78480..33fa3f3 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x, core::int y) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.transformed.expect
index bc78480..33fa3f3 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x, core::int y) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.outline.expect
index 9abb71b..8206474 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.outline.expect
@@ -8,7 +8,7 @@
   method f(core::int x, core::int y) → void
     ;
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract method f(self::I::T x, core::int y) → void;
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.strong.expect
index 0bfc9ad..71807009 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.strong.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x, core::int y) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.strong.transformed.expect
index 0bfc9ad..71807009 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x, core::int y) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.expect
index e76c032..61904ef 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T y = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.transformed.expect
index e76c032..61904ef 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T y = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.outline.expect
index d22bd7e..88ddc9b 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T y;
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.strong.expect
index 42d0664..94d01ed 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T y = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.strong.transformed.expect
index 42d0664..94d01ed 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::C::T y = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.expect
index 6c33166..19e4b9b 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.expect
@@ -15,7 +15,7 @@
     ;
   method f(covariant core::Object x) → void {}
 }
-class C<T extends core::Object> extends core::Object implements self::B {
+class C<T extends core::Object = dynamic> extends core::Object implements self::B {
   field self::C::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.transformed.expect
index 6c33166..19e4b9b 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.transformed.expect
@@ -15,7 +15,7 @@
     ;
   method f(covariant core::Object x) → void {}
 }
-class C<T extends core::Object> extends core::Object implements self::B {
+class C<T extends core::Object = dynamic> extends core::Object implements self::B {
   field self::C::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.outline.expect
index 8382a52..6f06015 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.outline.expect
@@ -14,7 +14,7 @@
   method f(covariant core::Object x) → void
     ;
 }
-class C<T extends core::Object> extends core::Object implements self::B {
+class C<T extends core::Object = dynamic> extends core::Object implements self::B {
   field self::C::T x;
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.strong.expect
index 3cb3cc3..a03ad85 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.strong.expect
@@ -15,7 +15,7 @@
     ;
   method f(covariant core::Object x) → void {}
 }
-class C<T extends core::Object> extends core::Object implements self::B {
+class C<T extends core::Object = dynamic> extends core::Object implements self::B {
   covariant generic-covariant-impl generic-covariant-interface field self::C::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.strong.transformed.expect
index 3cb3cc3..a03ad85 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.strong.transformed.expect
@@ -15,7 +15,7 @@
     ;
   method f(covariant core::Object x) → void {}
 }
-class C<T extends core::Object> extends core::Object implements self::B {
+class C<T extends core::Object = dynamic> extends core::Object implements self::B {
   covariant generic-covariant-impl generic-covariant-interface field self::C::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.expect
index fa00c10..fb75e74 100644
--- a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::num x) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.transformed.expect
index fa00c10..fb75e74 100644
--- a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::num x) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.outline.expect
index 75bdee2..0a75151 100644
--- a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.outline.expect
@@ -8,7 +8,7 @@
   method f(core::num x) → void
     ;
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract method f(self::I::T x) → void;
diff --git a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.strong.expect
index 4cdc473..730f655 100644
--- a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.strong.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::num x) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.strong.transformed.expect
index 4cdc473..730f655 100644
--- a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::num x) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.expect
index b0e9bfc..20d497c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → dynamic;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → dynamic;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.transformed.expect
index b0e9bfc..20d497c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → dynamic;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → dynamic;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.outline.expect
index 9c70c67..1b240b6 100644
--- a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → dynamic;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → dynamic;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method f(self::C::T x) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.expect
index a8e4634..56e15b3 100644
--- a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → dynamic;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → dynamic;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.transformed.expect
index a8e4634..56e15b3 100644
--- a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → dynamic;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → dynamic;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.expect
index 142da81..1c8d174 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object, U extends (self::B::T) → void> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic, U extends (self::B::T) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.transformed.expect
index 142da81..1c8d174 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object, U extends (self::B::T) → void> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic, U extends (self::B::T) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect
index 51e24b8..99545e4 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object, U extends (self::B::T) → void> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic, U extends (self::B::T) → void = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   operator +(dynamic other) → self::B<self::B::T, (self::B::T) → void>
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect
index abb7c26..447bd5c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object, U extends (self::B::T) → void> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic, U extends (self::B::T) → void = (dynamic) → void> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
index abb7c26..447bd5c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object, U extends (self::B::T) → void> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic, U extends (self::B::T) → void = (dynamic) → void> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.direct.expect
index f7da8fe..aa918d1 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   final field (self::C::T) → core::num plusResult;
   constructor •((self::C::T) → core::num plusResult) → void
     : self::C::plusResult = plusResult, super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.direct.transformed.expect
index f7da8fe..aa918d1 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   final field (self::C::T) → core::num plusResult;
   constructor •((self::C::T) → core::num plusResult) → void
     : self::C::plusResult = plusResult, super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.outline.expect
index cd27122..466bc13 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   final field (self::C::T) → core::num plusResult;
   constructor •((self::C::T) → core::num plusResult) → 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 8a36099..1447ddb 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
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   final field (self::C::T) → core::num plusResult;
   constructor •((self::C::T) → core::num plusResult) → void
     : self::C::plusResult = plusResult, super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
index 9e71b47..8378a4c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   final field (self::C::T) → core::num plusResult;
   constructor •((self::C::T) → core::num plusResult) → void
     : self::C::plusResult = plusResult, super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.expect
index e5d0682..7941e44 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   operator +(self::B<self::B::T> other) → self::B<self::B::T>
     return null;
 }
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.transformed.expect
index e5d0682..7941e44 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.transformed.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   operator +(self::B<self::B::T> other) → self::B<self::B::T>
     return null;
 }
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.outline.expect
index 0b7e9a5..6305ba1 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.outline.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   operator +(self::B<self::B::T> other) → self::B<self::B::T>
     ;
 }
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   get x() → self::B<(self::C::T) → void>
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 5661177..35cd46f 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
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   operator +(generic-covariant-impl generic-covariant-interface self::B<self::B::T> other) → self::B<self::B::T>
     return null;
 }
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
index 7a9ab98..5a9326d 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   operator +(generic-covariant-impl generic-covariant-interface self::B<self::B::T> other) → self::B<self::B::T>
     return null;
 }
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.expect
index 78a8669..8370814 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   operator +(self::B<self::B::T> other) → self::B<self::B::T>
     return null;
 }
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.transformed.expect
index 78a8669..8370814 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.transformed.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   operator +(self::B<self::B::T> other) → self::B<self::B::T>
     return null;
 }
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.outline.expect
index 4e1e19f..9fe6f92 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.outline.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   operator +(self::B<self::B::T> other) → self::B<self::B::T>
     ;
 }
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   operator [](core::int i) → self::B<(self::C::T) → void>
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.expect
index 4c7b92c..b74c2ed 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   operator +(generic-covariant-impl generic-covariant-interface self::B<self::B::T> other) → self::B<self::B::T>
     return null;
 }
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect
index 4c7b92c..b74c2ed 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   operator +(generic-covariant-impl generic-covariant-interface self::B<self::B::T> other) → self::B<self::B::T>
     return null;
 }
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.expect
index 02c5897..be5b7ea 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.transformed.expect
index 02c5897..be5b7ea 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.outline.expect
index 31036c6..136af72 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   operator [](core::int i) → (self::C::T) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.expect
index 4c9a372..5d00df6 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.transformed.expect
index 4c9a372..5d00df6 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class C<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.expect
index e8eb073..7d922fa 100644
--- a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f(self::B::T x) → void {}
   method g({self::B::T x = null}) → void {}
-  method h<U extends self::B::T>() → void {}
+  method h<U extends self::B::T = dynamic>() → void {}
 }
 class C extends self::B<core::int> {
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.transformed.expect
index e8eb073..7d922fa 100644
--- a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f(self::B::T x) → void {}
   method g({self::B::T x = null}) → void {}
-  method h<U extends self::B::T>() → void {}
+  method h<U extends self::B::T = dynamic>() → void {}
 }
 class C extends self::B<core::int> {
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.outline.expect
index ebd92db..895a16d 100644
--- a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.outline.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method f(self::B::T x) → void
     ;
   method g({self::B::T x}) → void
     ;
-  method h<U extends self::B::T>() → void
+  method h<U extends self::B::T = dynamic>() → void
     ;
 }
 class C extends self::B<core::int> {
diff --git a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.strong.expect
index e4bff7d..485a5a8 100644
--- a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.strong.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f(generic-covariant-impl generic-covariant-interface self::B::T x) → void {}
   method g({generic-covariant-impl generic-covariant-interface self::B::T x = null}) → void {}
-  method h<generic-covariant-impl generic-covariant-interface U extends self::B::T>() → void {}
+  method h<generic-covariant-impl generic-covariant-interface U extends self::B::T = dynamic>() → void {}
 }
 class C extends self::B<core::int> {
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.strong.transformed.expect
index e4bff7d..485a5a8 100644
--- a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f(generic-covariant-impl generic-covariant-interface self::B::T x) → void {}
   method g({generic-covariant-impl generic-covariant-interface self::B::T x = null}) → void {}
-  method h<generic-covariant-impl generic-covariant-interface U extends self::B::T>() → void {}
+  method h<generic-covariant-impl generic-covariant-interface U extends self::B::T = dynamic>() → void {}
 }
 class C extends self::B<core::int> {
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.expect
index 5ae17d3..25d0e7a 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.transformed.expect
index 5ae17d3..25d0e7a 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.outline.expect
index b70e682..5146cef 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x;
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.strong.expect
index e0ee96e..0de2a48 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::B::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.strong.transformed.expect
index e0ee96e..0de2a48 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::B::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.expect
index 2582858..caf1225 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x = null;
   field self::B::T y = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-abstract class C<T extends core::Object> extends core::Object implements self::B<core::num> {
+abstract class C<T extends core::Object = dynamic> extends core::Object implements self::B<core::num> {
   field dynamic x = null;
   synthetic constructor •() → void
     : super core::Object::•()
@@ -17,7 +17,7 @@
   abstract get y() → dynamic;
   abstract set y(dynamic value) → dynamic;
 }
-abstract class D<T extends core::Object> extends core::Object implements self::B<self::D::T> {
+abstract class D<T extends core::Object = dynamic> extends core::Object implements self::B<self::D::T> {
   field dynamic x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.transformed.expect
index 2582858..caf1225 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.transformed.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x = null;
   field self::B::T y = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-abstract class C<T extends core::Object> extends core::Object implements self::B<core::num> {
+abstract class C<T extends core::Object = dynamic> extends core::Object implements self::B<core::num> {
   field dynamic x = null;
   synthetic constructor •() → void
     : super core::Object::•()
@@ -17,7 +17,7 @@
   abstract get y() → dynamic;
   abstract set y(dynamic value) → dynamic;
 }
-abstract class D<T extends core::Object> extends core::Object implements self::B<self::D::T> {
+abstract class D<T extends core::Object = dynamic> extends core::Object implements self::B<self::D::T> {
   field dynamic x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.outline.expect
index 6ae5d4d..441306a 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.outline.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x;
   field self::B::T y;
   synthetic constructor •() → void
     ;
 }
-abstract class C<T extends core::Object> extends core::Object implements self::B<core::num> {
+abstract class C<T extends core::Object = dynamic> extends core::Object implements self::B<core::num> {
   field dynamic x;
   synthetic constructor •() → void
     ;
   abstract get y() → dynamic;
   abstract set y(dynamic value) → dynamic;
 }
-abstract class D<T extends core::Object> extends core::Object implements self::B<self::D::T> {
+abstract class D<T extends core::Object = dynamic> extends core::Object implements self::B<self::D::T> {
   field dynamic x;
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.expect
index d32e1ab..56bdaf5 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::B::T x = null;
   generic-covariant-impl generic-covariant-interface field self::B::T y = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-abstract class C<T extends core::Object> extends core::Object implements self::B<core::num> {
+abstract class C<T extends core::Object = dynamic> extends core::Object implements self::B<core::num> {
   generic-covariant-impl field core::num x = null;
   synthetic constructor •() → void
     : super core::Object::•()
@@ -17,7 +17,7 @@
   abstract get y() → core::num;
   abstract set y(generic-covariant-impl core::num value) → void;
 }
-abstract class D<T extends core::Object> extends core::Object implements self::B<self::D::T> {
+abstract class D<T extends core::Object = dynamic> extends core::Object implements self::B<self::D::T> {
   generic-covariant-impl generic-covariant-interface field self::D::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.transformed.expect
index d32e1ab..56bdaf5 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.transformed.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::B::T x = null;
   generic-covariant-impl generic-covariant-interface field self::B::T y = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-abstract class C<T extends core::Object> extends core::Object implements self::B<core::num> {
+abstract class C<T extends core::Object = dynamic> extends core::Object implements self::B<core::num> {
   generic-covariant-impl field core::num x = null;
   synthetic constructor •() → void
     : super core::Object::•()
@@ -17,7 +17,7 @@
   abstract get y() → core::num;
   abstract set y(generic-covariant-impl core::num value) → void;
 }
-abstract class D<T extends core::Object> extends core::Object implements self::B<self::D::T> {
+abstract class D<T extends core::Object = dynamic> extends core::Object implements self::B<self::D::T> {
   generic-covariant-impl generic-covariant-interface field self::D::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.direct.expect
index 4c4735d..386f01b 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.direct.expect
@@ -19,7 +19,7 @@
     throw "Should not be reached";
   }
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.direct.transformed.expect
index 78ffd8c5..0cdd702 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.direct.transformed.expect
@@ -19,7 +19,7 @@
     throw "Should not be reached";
   }
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
index 05bfd76..a054265 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
@@ -14,7 +14,7 @@
   set y(core::int value) → void
     ;
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract get x() → self::I::T;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
index 7ae9bb9..314d87d 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
@@ -19,7 +19,7 @@
     throw "Should not be reached";
   }
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.expect
index 20bef1d..16a273b 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
+typedef F<T extends core::Object = dynamic> = (T) → void;
 class B extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
@@ -14,14 +14,14 @@
     throw "Should not be reached";
   }
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract get x() → (self::I::T) → void;
   abstract set x(core::Object value) → void;
 }
-abstract class M<T extends core::Object> extends core::Object {
+abstract class M<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   }
   abstract method f() → self::M::T;
 }
-abstract class C<T extends core::Object> = self::B with self::M<(self::C::T) → void> implements self::I<self::C::T> {
+abstract class C<T extends core::Object = dynamic> = self::B with self::M<(self::C::T) → void> implements self::I<self::C::T> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.transformed.expect
index f43208c..92d7a50 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
+typedef F<T extends core::Object = dynamic> = (T) → void;
 class B extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
@@ -14,14 +14,14 @@
     throw "Should not be reached";
   }
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract get x() → (self::I::T) → void;
   abstract set x(core::Object value) → void;
 }
-abstract class M<T extends core::Object> extends core::Object {
+abstract class M<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   }
   abstract method f() → self::M::T;
 }
-abstract class C<T extends core::Object> extends self::B implements self::I<self::C::T>, self::M<(self::C::T) → void> {
+abstract class C<T extends core::Object = dynamic> extends self::B implements self::I<self::C::T>, self::M<(self::C::T) → void> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.outline.expect
index 95b1dc0..6ce8632 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
+typedef F<T extends core::Object = dynamic> = (T) → void;
 class B extends core::Object {
   synthetic constructor •() → void
     ;
@@ -11,13 +11,13 @@
   set x(core::Object value) → void
     ;
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract get x() → (self::I::T) → void;
   abstract set x(core::Object value) → void;
 }
-abstract class M<T extends core::Object> extends core::Object {
+abstract class M<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   get x() → self::M::T
@@ -26,7 +26,7 @@
     ;
   abstract method f() → self::M::T;
 }
-abstract class C<T extends core::Object> = self::B with self::M<(self::C::T) → void> implements self::I<self::C::T> {
+abstract class C<T extends core::Object = dynamic> = self::B with self::M<(self::C::T) → void> implements self::I<self::C::T> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.strong.expect
index f3d6139..606c252 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
+typedef F<T extends core::Object = dynamic> = (T) → void;
 class B extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
@@ -14,14 +14,14 @@
     throw "Should not be reached";
   }
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract get x() → (self::I::T) → void;
   abstract set x(core::Object value) → void;
 }
-abstract class M<T extends core::Object> extends core::Object {
+abstract class M<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   }
   abstract method f() → self::M::T;
 }
-abstract class C<T extends core::Object> = self::B with self::M<(self::C::T) → void> implements self::I<self::C::T> {
+abstract class C<T extends core::Object = dynamic> = self::B with self::M<(self::C::T) → void> implements self::I<self::C::T> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.direct.expect
index f15e59d..ddda646 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.direct.expect
@@ -19,7 +19,7 @@
     throw "Should not be reached";
   }
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.direct.transformed.expect
index b204ff8..062777f 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.direct.transformed.expect
@@ -19,7 +19,7 @@
     throw "Should not be reached";
   }
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
index 27d681e..2bd1d45 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
@@ -14,7 +14,7 @@
   set y(core::int value) → void
     ;
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract get x() → self::I::T;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
index 9fc4e47..77c4077 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
@@ -19,7 +19,7 @@
     throw "Should not be reached";
   }
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.expect
index 8324835..8075c32 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f(core::int x) → self::B::T {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f(core::Object x) → self::I::T;
 }
-class C<T extends core::Object> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.transformed.expect
index 8324835..8075c32 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.transformed.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f(core::int x) → self::B::T {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f(core::Object x) → self::I::T;
 }
-class C<T extends core::Object> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.outline.expect
index ea24f69..9da9feb 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.outline.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method f(core::int x) → self::B::T
     ;
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract method f(core::Object x) → self::I::T;
 }
-class C<T extends core::Object> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.strong.expect
index fde8b6f..d78be9f 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.strong.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f(core::int x) → self::B::T {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f(core::Object x) → self::I::T;
 }
-class C<T extends core::Object> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.expect
index 1d29587..a267375 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f((self::B::T) → void x, core::int y) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f((self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.transformed.expect
index 1d29587..a267375 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.transformed.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f((self::B::T) → void x, core::int y) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f((self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.outline.expect
index 3c3e508..6959519 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.outline.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method f((self::B::T) → void x, core::int y) → void
     ;
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract method f((self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.strong.expect
index ee19538..8e34bf3 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.strong.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f((self::B::T) → void x, core::int y) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f((self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.strong.transformed.expect
index ee19538..8e34bf3 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.strong.transformed.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-class B<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f((self::B::T) → void x, core::int y) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f((self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.expect
index fcf58faa..43f51a2 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x, core::int y) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.transformed.expect
index fcf58faa..43f51a2 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x, core::int y) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.outline.expect
index 9151bf7..123da75 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.outline.expect
@@ -8,7 +8,7 @@
   method f(core::int x, core::int y) → void
     ;
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract method f(self::I::T x, core::Object y) → void;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.strong.expect
index 892c2f0..c26770b 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.strong.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x, core::int y) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.strong.transformed.expect
index 892c2f0..c26770b 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method f(core::int x, core::int y) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.expect
index b2f0239..34a373d 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.transformed.expect
index b2f0239..34a373d 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.outline.expect
index a7c73a2..97b15b3 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method f(self::B::T x, core::int y) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.strong.expect
index 37bfc39..79fe012 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object> extends core::Object {
+class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.expect
index a9dd532..863ae95 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.expect
@@ -2,26 +2,26 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-abstract class A<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+abstract class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f(self::A::T x, core::int y) → void;
 }
-class B<T extends core::Object> extends core::Object implements self::A<(self::B::T) → void> {
+class B<T extends core::Object = dynamic> extends core::Object implements self::A<(self::B::T) → void> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f((self::B::T) → void x, core::int y) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object implements self::A<(self::I::T) → void> {
+abstract class I<T extends core::Object = dynamic> extends core::Object implements self::A<(self::I::T) → void> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f((self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.transformed.expect
index a9dd532..863ae95 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.transformed.expect
@@ -2,26 +2,26 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-abstract class A<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+abstract class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f(self::A::T x, core::int y) → void;
 }
-class B<T extends core::Object> extends core::Object implements self::A<(self::B::T) → void> {
+class B<T extends core::Object = dynamic> extends core::Object implements self::A<(self::B::T) → void> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f((self::B::T) → void x, core::int y) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object implements self::A<(self::I::T) → void> {
+abstract class I<T extends core::Object = dynamic> extends core::Object implements self::A<(self::I::T) → void> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f((self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.outline.expect
index 9e334f5..723d19c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.outline.expect
@@ -2,24 +2,24 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-abstract class A<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+abstract class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract method f(self::A::T x, core::int y) → void;
 }
-class B<T extends core::Object> extends core::Object implements self::A<(self::B::T) → void> {
+class B<T extends core::Object = dynamic> extends core::Object implements self::A<(self::B::T) → void> {
   synthetic constructor •() → void
     ;
   method f((self::B::T) → void x, core::int y) → void
     ;
 }
-abstract class I<T extends core::Object> extends core::Object implements self::A<(self::I::T) → void> {
+abstract class I<T extends core::Object = dynamic> extends core::Object implements self::A<(self::I::T) → void> {
   synthetic constructor •() → void
     ;
   abstract method f((self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.strong.expect
index fcb22cdd..ee0c689 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.strong.expect
@@ -2,26 +2,26 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object> = (T) → void;
-abstract class A<T extends core::Object> extends core::Object {
+typedef F<T extends core::Object = dynamic> = (T) → void;
+abstract class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f(generic-covariant-impl generic-covariant-interface self::A::T x, core::int y) → void;
 }
-class B<T extends core::Object> extends core::Object implements self::A<(self::B::T) → void> {
+class B<T extends core::Object = dynamic> extends core::Object implements self::A<(self::B::T) → void> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method f(generic-covariant-impl (self::B::T) → void x, core::int y) → void {}
 }
-abstract class I<T extends core::Object> extends core::Object implements self::A<(self::I::T) → void> {
+abstract class I<T extends core::Object = dynamic> extends core::Object implements self::A<(self::I::T) → void> {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract method f(generic-covariant-impl (self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
   synthetic constructor •() → void
     : super self::B::•()
     ;
diff --git a/pkg/front_end/testcases/type_variable_as_super.dart.outline.expect b/pkg/front_end/testcases/type_variable_as_super.dart.outline.expect
index a770e2c..5df44e4 100644
--- a/pkg/front_end/testcases/type_variable_as_super.dart.outline.expect
+++ b/pkg/front_end/testcases/type_variable_as_super.dart.outline.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<T extends core::Object> extends core::Object {
+abstract class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
-abstract class B<T extends core::Object> extends core::Object {
+abstract class B<T extends core::Object = dynamic> extends core::Object {
   constructor •() → void
     ;
 }
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.direct.expect b/pkg/front_end/testcases/type_variable_prefix.dart.direct.expect
index b588a3e..515d754 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.direct.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.direct.transformed.expect b/pkg/front_end/testcases/type_variable_prefix.dart.direct.transformed.expect
index b588a3e..515d754 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.outline.expect b/pkg/front_end/testcases/type_variable_prefix.dart.outline.expect
index 6447b5b..be7fb5e 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.outline.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     ;
   method method() → invalid-type
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 862b7b7..52774b2 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect b/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
index bd3a6bd..c26c47a 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/tool/_fasta/compile_platform.dart b/pkg/front_end/tool/_fasta/compile_platform.dart
index 7dcf8b4..58cd0ce 100644
--- a/pkg/front_end/tool/_fasta/compile_platform.dart
+++ b/pkg/front_end/tool/_fasta/compile_platform.dart
@@ -11,7 +11,7 @@
 import 'package:compiler/src/kernel/dart2js_target.dart' show Dart2jsTarget;
 
 import 'package:vm/bytecode/gen_bytecode.dart'
-    show generateBytecode, kEnableKernelBytecodeForPlatform;
+    show generateBytecode, isKernelBytecodeEnabledForPlatform;
 
 import 'package:vm/target/dart_runner.dart' show DartRunnerTarget;
 
@@ -89,7 +89,7 @@
   new File.fromUri(outlineOutput).writeAsBytesSync(result.summary);
   c.options.ticker.logMs("Wrote outline to ${outlineOutput.toFilePath()}");
 
-  if (kEnableKernelBytecodeForPlatform) {
+  if (isKernelBytecodeEnabledForPlatform) {
     generateBytecode(result.component, strongMode: c.options.strongMode);
   }
 
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index ba13f5c..0af9f95 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -42,6 +42,8 @@
 
 type UInt32 = big endian 32-bit unsigned integer
 
+type Double = Double-precision floating-point number.
+
 type List<T> {
   UInt length;
   T[length] items;
@@ -711,7 +713,7 @@
 
 type DoubleLiteral extends Expression {
   Byte tag = 40;
-  StringReference valueString;
+  Double value;
 }
 
 type TrueLiteral extends Expression {
@@ -874,7 +876,7 @@
 
 type DoubleConstant extends Constant {
   Byte tag = 3;
-  StringReference value;
+  Double value;
 }
 
 type StringConstant extends Constant {
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index d9e61cc..4ff4a37 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -97,6 +97,22 @@
         readByte();
   }
 
+  final Float64List _doubleBuffer = new Float64List(1);
+  Uint8List _doubleBufferUint8;
+
+  double readDouble() {
+    _doubleBufferUint8 ??= _doubleBuffer.buffer.asUint8List();
+    _doubleBufferUint8[0] = readByte();
+    _doubleBufferUint8[1] = readByte();
+    _doubleBufferUint8[2] = readByte();
+    _doubleBufferUint8[3] = readByte();
+    _doubleBufferUint8[4] = readByte();
+    _doubleBufferUint8[5] = readByte();
+    _doubleBufferUint8[6] = readByte();
+    _doubleBufferUint8[7] = readByte();
+    return _doubleBuffer[0];
+  }
+
   List<int> readByteList() {
     List<int> bytes = new Uint8List(readUInt());
     bytes.setRange(0, bytes.length, _bytes, _byteOffset);
@@ -174,7 +190,7 @@
       case ConstantTag.IntConstant:
         return new IntConstant((readExpression() as IntLiteral).value);
       case ConstantTag.DoubleConstant:
-        return new DoubleConstant(double.parse(readStringReference()));
+        return new DoubleConstant(readDouble());
       case ConstantTag.StringConstant:
         return new StringConstant(readStringReference());
       case ConstantTag.MapConstant:
@@ -1333,7 +1349,7 @@
       case Tag.BigIntLiteral:
         return new IntLiteral(int.parse(readStringReference()));
       case Tag.DoubleLiteral:
-        return new DoubleLiteral(double.parse(readStringReference()));
+        return new DoubleLiteral(readDouble());
       case Tag.TrueLiteral:
         return new BoolLiteral(true);
       case Tag.FalseLiteral:
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index adb16a0..a65dd03 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -147,7 +147,7 @@
       writeInteger(constant.value);
     } else if (constant is DoubleConstant) {
       writeByte(ConstantTag.DoubleConstant);
-      writeStringReference('${constant.value}');
+      writeDouble(constant.value);
     } else if (constant is StringConstant) {
       writeByte(ConstantTag.StringConstant);
       writeStringReference(constant.value);
@@ -1238,13 +1238,12 @@
 
   @override
   void visitDoubleLiteral(DoubleLiteral node) {
+    writeByte(Tag.DoubleLiteral);
     writeDouble(node.value);
   }
 
   writeDouble(double value) {
-    // TODO: Pick a better format for double literals.
-    writeByte(Tag.DoubleLiteral);
-    writeStringReference('$value');
+    _sink.addDouble(value);
   }
 
   @override
@@ -2190,8 +2189,20 @@
   int length = 0;
   int flushedLength = 0;
 
+  Float64List _doubleBuffer = new Float64List(1);
+  Uint8List _doubleBufferUint8;
+
   BufferedSink(this._sink);
 
+  void addDouble(double d) {
+    _doubleBufferUint8 ??= _doubleBuffer.buffer.asUint8List();
+    _doubleBuffer[0] = d;
+    addByte4(_doubleBufferUint8[0], _doubleBufferUint8[1],
+        _doubleBufferUint8[2], _doubleBufferUint8[3]);
+    addByte4(_doubleBufferUint8[4], _doubleBufferUint8[5],
+        _doubleBufferUint8[6], _doubleBufferUint8[7]);
+  }
+
   void addByte(int byte) {
     _buffer[length++] = byte;
     if (length == SIZE) {
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index ec9a8aa..1f49bf5 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -153,6 +153,15 @@
   void performGlobalTransformations(CoreTypes coreTypes, Component component,
       {void logger(String msg)});
 
+  /// Perform target-specific modular transformations on the given program.
+  ///
+  /// This is used when an individual expression is compiled, e.g. for debugging
+  /// purposes. It is illegal to modify any of the enclosing nodes of the
+  /// procedure.
+  void performTransformationsOnProcedure(
+      CoreTypes coreTypes, ClassHierarchy hierarchy, Procedure procedure,
+      {void logger(String msg)}) {}
+
   /// Whether a platform library may define a restricted type, such as `bool`,
   /// `int`, `double`, `num`, and `String`.
   ///
diff --git a/pkg/kernel/lib/target/vm.dart b/pkg/kernel/lib/target/vm.dart
index 322d2c5..e79a78c 100644
--- a/pkg/kernel/lib/target/vm.dart
+++ b/pkg/kernel/lib/target/vm.dart
@@ -12,7 +12,7 @@
 import '../transformations/mixin_full_resolution.dart' as transformMixins
     show transformLibraries;
 import '../transformations/continuation.dart' as transformAsync
-    show transformLibraries;
+    show transformLibraries, transformProcedure;
 
 import 'targets.dart';
 
@@ -75,6 +75,14 @@
       {void logger(String msg)}) {}
 
   @override
+  void performTransformationsOnProcedure(
+      CoreTypes coreTypes, ClassHierarchy hierarchy, Procedure procedure,
+      {void logger(String msg)}) {
+    transformAsync.transformProcedure(coreTypes, procedure, flags.syncAsync);
+    logger?.call("Transformed async functions");
+  }
+
+  @override
   Expression instantiateInvocation(CoreTypes coreTypes, Expression receiver,
       String name, Arguments arguments, int offset, bool isSuper) {
     // See [_InvocationMirror]
diff --git a/pkg/meta/CHANGELOG.md b/pkg/meta/CHANGELOG.md
index 12ec383..ed639d0 100644
--- a/pkg/meta/CHANGELOG.md
+++ b/pkg/meta/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 1.1.5
+
+* Introduce @isTest and @isTestGroup to declare a function that is a
+  test, or a test group.
+
 ## 1.1.4
 
 * Added dart2js.dart.
@@ -7,9 +12,11 @@
 * Rollback SDK constraint update for 2.0.0. No longer needed.
 
 ## 1.1.1
+
 * Update SDK constraint to be 2.0.0 dev friendly.
 
 ## 1.1.0
+
 * Introduce `@alwaysThrows` to declare that a function always throws
     (SDK issue [17999](https://github.com/dart-lang/sdk/issues/17999)). This
     is first available in Dart SDK 1.25.0-dev.1.0.
@@ -33,6 +40,7 @@
     ```
 
 ## 1.0.5
+
 * Introduce `@experimental` to annotate a library, or any declaration that is
   part of the public interface of a library (such as top-level members, class
   members, and function parameters) to indicate that the annotated API is
@@ -41,6 +49,7 @@
   be a breaking change.
 
 ## 1.0.4
+
 * Introduce `@virtual` to allow field overrides in strong mode
     (SDK issue [27384](https://github.com/dart-lang/sdk/issues/27384)).
 
@@ -59,6 +68,7 @@
     ```
 
 ## 1.0.3
+
 * Introduce `@checked` to override a method and tighten a parameter
     type (SDK issue [25578](https://github.com/dart-lang/sdk/issues/25578)).
 
@@ -79,34 +89,42 @@
     ```
 
 ## 1.0.2
+
 * Introduce `@visibleForTesting` annotation for declarations that may be referenced only in the library or in a test.
 
 ## 1.0.1
+
 * Updated `@factory` to allow statics and methods returning `null`.
 
 ## 1.0.0
+
 * First stable API release.
 
 ## 0.12.2
+
 * Updated `@protected` to include implemented interfaces (linter#252).
 
 ## 0.12.1
+
 * Fixed markdown in dartdocs.
 
 ## 0.12.0
+
 * Introduce `@optionalTypeArgs` annotation for classes whose type arguments are to be treated as optional.
 
 ## 0.11.0
+
 * Added new `Required` constructor with a means to specify a reason to explain why a parameter is required.
 
 ## 0.10.0
-* Introduce `@factory` annotation for methods that must either be abstract or
-must return a newly allocated object.
+
+* Introduce `@factory` annotation for methods that must either be abstract or must return a newly allocated object.
 * Introduce `@literal` annotation that indicates that any invocation of a
 constructor must use the keyword `const` unless one or more of the
 arguments to the constructor is not a compile-time constant.
 
 ## 0.9.0
+
 * Introduce `@protected` annotation for members that must only be called from
 instance members of subclasses.
 * Introduce `@required` annotation for optional parameters that should be treated
diff --git a/pkg/meta/pubspec.yaml b/pkg/meta/pubspec.yaml
index ae9a123..73e1dfd 100644
--- a/pkg/meta/pubspec.yaml
+++ b/pkg/meta/pubspec.yaml
@@ -1,5 +1,5 @@
 name: meta
-version: 1.1.4
+version: 1.1.5
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/meta
 description: >
diff --git a/pkg/testing/lib/src/stdio_process.dart b/pkg/testing/lib/src/stdio_process.dart
index 1004a59..72b534a 100644
--- a/pkg/testing/lib/src/stdio_process.dart
+++ b/pkg/testing/lib/src/stdio_process.dart
@@ -60,7 +60,7 @@
         process.kill();
         timer = new Timer(const Duration(seconds: 10), () {
           sb.writeln("Sending SIGKILL to process");
-          process.kill(ProcessSignal.SIGKILL);
+          process.kill(ProcessSignal.sigkill);
         });
       });
     }
diff --git a/pkg/vm/bin/gen_kernel.dart b/pkg/vm/bin/gen_kernel.dart
index d845a2d..0a2e4a2 100644
--- a/pkg/vm/bin/gen_kernel.dart
+++ b/pkg/vm/bin/gen_kernel.dart
@@ -14,7 +14,7 @@
 import 'package:kernel/target/vm.dart' show VmTarget;
 import 'package:kernel/text/ast_to_text.dart'
     show globalDebuggingNames, NameSystem;
-import 'package:vm/bytecode/gen_bytecode.dart' show kEnableKernelBytecode;
+import 'package:vm/bytecode/gen_bytecode.dart' show isKernelBytecodeEnabled;
 import 'package:vm/kernel_front_end.dart' show compileToKernel, ErrorDetector;
 
 final ArgParser _argParser = new ArgParser(allowTrailingOptions: true)
@@ -39,7 +39,7 @@
   ..addMultiOption('entry-points',
       help: 'Path to JSON file with the list of entry points')
   ..addFlag('gen-bytecode',
-      help: 'Generate bytecode', defaultsTo: kEnableKernelBytecode);
+      help: 'Generate bytecode', defaultsTo: isKernelBytecodeEnabled);
 
 final String _usage = '''
 Usage: dart pkg/vm/bin/gen_kernel.dart --platform vm_platform_strong.dill [options] input.dart
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index ef4c8ef..329b554 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -32,7 +32,7 @@
 import 'package:front_end/src/compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
 import 'package:front_end/src/fasta/kernel/utils.dart';
-import 'package:front_end/src/testing/hybrid_file_system.dart';
+import 'package:front_end/src/fasta/hybrid_file_system.dart';
 import 'package:kernel/kernel.dart' show Component;
 import 'package:kernel/target/targets.dart' show TargetFlags;
 import 'package:kernel/target/vm.dart' show VmTarget;
diff --git a/pkg/vm/bin/run_binary_size_analysis.dart b/pkg/vm/bin/run_binary_size_analysis.dart
index 512e56f..4a63676 100644
--- a/pkg/vm/bin/run_binary_size_analysis.dart
+++ b/pkg/vm/bin/run_binary_size_analysis.dart
@@ -122,7 +122,7 @@
   node['t'] = symbolTypeGlobalText;
   node['value'] = size;
   depth += 2;
-  root['maxDepth'] = max(root['maxDepth'], depth);
+  root['maxDepth'] = max<int>(root['maxDepth'], depth);
 }
 
 /// Convert all children entries from maps to lists.
diff --git a/pkg/vm/lib/bytecode/constant_pool.dart b/pkg/vm/lib/bytecode/constant_pool.dart
index 25da76d..958c7c6 100644
--- a/pkg/vm/lib/bytecode/constant_pool.dart
+++ b/pkg/vm/lib/bytecode/constant_pool.dart
@@ -397,8 +397,8 @@
       'ArgDesc num-args $numArguments, num-type-args $numTypeArgs, names $argNames';
 
   @override
-  int get hashCode =>
-      (numArguments * 31 + numTypeArgs) * 31 + listHashCode(argNames);
+  int get hashCode => _combineHashes(
+      _combineHashes(numArguments, numTypeArgs), listHashCode(argNames));
 
   @override
   bool operator ==(other) =>
@@ -770,9 +770,9 @@
               new MapEntry(fieldRef.asField.name.name, valueIndex))}';
 
   @override
-  int get hashCode =>
-      (classNode.hashCode * 31 + _typeArgumentsConstantIndex) * 31 +
-      mapHashCode(_fieldValues);
+  int get hashCode => _combineHashes(
+      _combineHashes(classNode.hashCode, _typeArgumentsConstantIndex),
+      mapHashCode(_fieldValues));
 
   @override
   bool operator ==(other) =>
@@ -844,7 +844,7 @@
 
   @override
   int get hashCode =>
-      instantiatingClass.hashCode * 31 + _typeArgumentsConstantIndex;
+      _combineHashes(instantiatingClass.hashCode, _typeArgumentsConstantIndex);
 
   @override
   bool operator ==(other) =>
@@ -893,3 +893,6 @@
     return sb.toString();
   }
 }
+
+int _combineHashes(int hash1, int hash2) =>
+    (((hash1 * 31) & 0x3fffffff) + hash2) & 0x3fffffff;
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 3763ecc..c51cf1f 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -20,12 +20,12 @@
 import 'package:vm/metadata/bytecode.dart';
 
 /// Flag to toggle generation of bytecode in kernel files.
-const bool kEnableKernelBytecode = false;
+const bool isKernelBytecodeEnabled = false;
 
 /// Flag to toggle generation of bytecode in platform kernel files.
-const bool kEnableKernelBytecodeForPlatform = kEnableKernelBytecode;
+const bool isKernelBytecodeEnabledForPlatform = isKernelBytecodeEnabled;
 
-const bool kTrace = false;
+const bool isTraceEnabled = false;
 
 void generateBytecode(Component component, {bool strongMode: true}) {
   final coreTypes = new CoreTypes(component);
@@ -114,7 +114,7 @@
         end(node);
       }
     } on UnsupportedOperationError catch (e) {
-      if (kTrace) {
+      if (isTraceEnabled) {
         print('Unable to generate bytecode for $node: $e');
       }
     }
@@ -382,7 +382,7 @@
     enclosingMember = null;
     enclosingClass = null;
     metadata.mapping[node] = new BytecodeMetadata(asm.bytecode, cp);
-    if (kTrace) {
+    if (isTraceEnabled) {
       print('Generated bytecode for $node');
     }
   }
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index 99a885c..71ee83e 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -7,6 +7,7 @@
 
 import 'dart:collection';
 import 'dart:core' hide Type;
+import 'dart:math' show max;
 
 import 'package:kernel/ast.dart' hide Statement, StatementVisitor;
 import 'package:kernel/class_hierarchy.dart' show ClosedWorldClassHierarchy;
@@ -55,6 +56,12 @@
 
   void invalidateDependentInvocations(_WorkList workList) {
     if (_dependentInvocations != null) {
+      if (kPrintTrace) {
+        tracePrint('   - CHANGED: $this');
+        for (var di in _dependentInvocations) {
+          tracePrint('     - invalidating $di');
+        }
+      }
       _dependentInvocations.forEach(workList.invalidateInvocation);
     }
   }
@@ -77,6 +84,13 @@
   /// result or not (to avoid invalidation of callers if result hasn't changed).
   Type invalidatedResult;
 
+  /// Number of times result of this invocation was invalidated.
+  int invalidationCounter = 0;
+
+  /// If an invocation is invalidated more than [invalidationLimit] times,
+  /// its result is saturated in order to guarantee convergence.
+  static const int invalidationLimit = 1000;
+
   Type process(TypeFlowAnalysis typeFlowAnalysis);
 
   _Invocation(this.selector, this.args);
@@ -320,6 +334,9 @@
               .getInvocation(directSelector, directArgs);
 
           type = typeFlowAnalysis.workList.processInvocation(directInvocation);
+          if (kPrintTrace) {
+            tracePrint('Dispatch: $directInvocation, result: $type');
+          }
 
           // Result of this invocation depends on the results of direct
           // invocations corresponding to each target.
@@ -672,7 +689,9 @@
         newValue.intersection(staticType, typeFlowAnalysis.hierarchyCache),
         typeFlowAnalysis.hierarchyCache);
     if (newType != value) {
-      tracePrint("Set field $field value $newType");
+      if (kPrintTrace) {
+        tracePrint("Set field $field value $newType");
+      }
       invalidateDependentInvocations(typeFlowAnalysis.workList);
       value = newType;
     }
@@ -866,7 +885,9 @@
 
   @override
   Type specializeTypeCone(DartType base) {
-    tracePrint("specializeTypeCone for $base");
+    if (kPrintTrace) {
+      tracePrint("specializeTypeCone for $base");
+    }
     Statistics.typeConeSpecializations++;
 
     // TODO(alexmarkov): handle function types properly
@@ -1009,7 +1030,7 @@
       callStack.add(invocation);
       pending.remove(invocation);
 
-      final Type result = invocation.process(_typeFlowAnalysis);
+      Type result = invocation.process(_typeFlowAnalysis);
 
       assertx(result != null);
       invocation.result = result;
@@ -1017,6 +1038,21 @@
       if (invocation.invalidatedResult != null) {
         if (invocation.invalidatedResult != result) {
           invocation.invalidateDependentInvocations(this);
+
+          invocation.invalidationCounter++;
+          Statistics.maxInvalidationsPerInvocation = max(
+              Statistics.maxInvalidationsPerInvocation,
+              invocation.invalidationCounter);
+          // In rare cases, loops in dependencies and approximation of
+          // recursive invocations may cause infinite bouncing of result
+          // types. To prevent infinite looping and guarantee convergence of
+          // the analysis, result is saturated after invocation is invalidated
+          // at least [_Invocation.invalidationLimit] times.
+          if (invocation.invalidationCounter > _Invocation.invalidationLimit) {
+            result = result.union(
+                invocation.invalidatedResult, _typeFlowAnalysis.hierarchyCache);
+            invocation.result = result;
+          }
         }
         invocation.invalidatedResult = null;
       }
@@ -1034,14 +1070,20 @@
       processing.remove(invocation);
 
       Statistics.invocationsProcessed++;
+      if (kPrintTrace) {
+        tracePrint('END PROCESSING $invocation, RESULT $result');
+      }
       return result;
     } else {
       // Recursive invocation, approximate with static type.
       Statistics.recursiveInvocationsApproximated++;
       final staticType =
           new Type.fromStatic(invocation.selector.staticReturnType);
-      tracePrint(
-          "Approximated recursive invocation with static type $staticType");
+      if (kPrintTrace) {
+        tracePrint(
+            "Approximated recursive invocation with static type $staticType");
+        tracePrint('END PROCESSING $invocation, RESULT $staticType');
+      }
       return staticType;
     }
   }
@@ -1145,7 +1187,9 @@
 
   @override
   void addRawCall(Selector selector) {
-    debugPrint("ADD RAW CALL: $selector");
+    if (kPrintDebug) {
+      debugPrint("ADD RAW CALL: $selector");
+    }
     assertx(selector is! DynamicSelector); // TODO(alexmarkov)
 
     applyCall(null, selector, summaryCollector.rawArguments(selector),
@@ -1154,7 +1198,9 @@
 
   @override
   ConcreteType addAllocatedClass(Class c) {
-    debugPrint("ADD ALLOCATED CLASS: $c");
+    if (kPrintDebug) {
+      debugPrint("ADD ALLOCATED CLASS: $c");
+    }
     return hierarchyCache.addAllocatedClass(c);
   }
 }
diff --git a/pkg/vm/lib/transformations/type_flow/utils.dart b/pkg/vm/lib/transformations/type_flow/utils.dart
index 95e4467..de0d7a0 100644
--- a/pkg/vm/lib/transformations/type_flow/utils.dart
+++ b/pkg/vm/lib/transformations/type_flow/utils.dart
@@ -75,6 +75,7 @@
   static int invocationsProcessed = 0;
   static int usedCachedResultsOfInvocations = 0;
   static int invocationsInvalidated = 0;
+  static int maxInvalidationsPerInvocation = 0;
   static int recursiveInvocationsApproximated = 0;
   static int typeConeSpecializations = 0;
   static int classesDropped = 0;
@@ -93,6 +94,7 @@
     invocationsProcessed = 0;
     usedCachedResultsOfInvocations = 0;
     invocationsInvalidated = 0;
+    maxInvalidationsPerInvocation = 0;
     recursiveInvocationsApproximated = 0;
     typeConeSpecializations = 0;
     classesDropped = 0;
@@ -112,6 +114,7 @@
     ${invocationsProcessed} invocations processed
     ${usedCachedResultsOfInvocations} times cached result of invocation is used
     ${invocationsInvalidated} invocations invalidated
+    ${maxInvalidationsPerInvocation} maximum invalidations per invocation
     ${recursiveInvocationsApproximated} recursive invocations approximated
     ${typeConeSpecializations} type cones specialized
     ${classesDropped} classes dropped
diff --git a/pkg/vm/test/frontend_server_test.dart b/pkg/vm/test/frontend_server_test.dart
index fb1c877..7ea07d4 100644
--- a/pkg/vm/test/frontend_server_test.dart
+++ b/pkg/vm/test/frontend_server_test.dart
@@ -7,6 +7,7 @@
 import 'package:kernel/binary/ast_to_binary.dart';
 import 'package:kernel/ast.dart' show Component;
 import 'package:mockito/mockito.dart';
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 import 'package:vm/incremental_compiler.dart';
 
@@ -462,7 +463,7 @@
     Directory tempDir;
     setUp(() {
       var systemTempDir = Directory.systemTemp;
-      tempDir = systemTempDir.createTempSync('foo');
+      tempDir = systemTempDir.createTempSync('foo bar');
     });
 
     tearDown(() {
@@ -656,15 +657,11 @@
     });
 
     test('compile and produce deps file', () async {
-      if (Platform.isWindows) {
-        // TODO(dartbug.com/33032): Fix depfile generation on Windows.
-        return;
-      }
       var file = new File('${tempDir.path}/foo.dart')..createSync();
       file.writeAsStringSync("main() {}\n");
       var dillFile = new File('${tempDir.path}/app.dill');
       expect(dillFile.existsSync(), equals(false));
-      var depFile = new File('${tempDir.path}/depfile');
+      var depFile = new File('${tempDir.path}/the depfile');
       expect(depFile.existsSync(), equals(false));
       final List<String> args = <String>[
         '--sdk-root=${sdkRoot.toFilePath()}',
@@ -679,8 +676,8 @@
 
       expect(depFile.existsSync(), true);
       var depContents = depFile.readAsStringSync();
-      var depContentsParsed = depContents.split(':');
-      expect(depContentsParsed[0], dillFile.path);
+      var depContentsParsed = depContents.split(': ');
+      expect(path.basename(depContentsParsed[0]), path.basename(dillFile.path));
       expect(depContentsParsed[1], isNotEmpty);
     });
   });
diff --git a/pkg/vm/testcases/bytecode/instance_creation.dart.expect b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
index b026f3c0..b91a903 100644
--- a/pkg/vm/testcases/bytecode/instance_creation.dart.expect
+++ b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Base<T1 extends core::Object, T2 extends core::Object> extends core::Object {
+class Base<T1 extends core::Object = dynamic, T2 extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl generic-covariant-interface field self::Base::T1 t1 = null;
   generic-covariant-impl generic-covariant-interface field self::Base::T2 t2 = null;
 [@vm.bytecode=
@@ -92,7 +92,7 @@
   abstract forwarding-stub set t1(generic-covariant-impl core::int _) → void;
   abstract forwarding-stub set t2(generic-covariant-impl core::String _) → void;
 }
-class B<T extends core::Object> extends self::Base<core::List<self::B::T>, core::String> {
+class B<T extends core::Object = dynamic> extends self::Base<core::List<self::B::T>, core::String> {
 [@vm.bytecode=
 Bytecode {
   Entry                1
@@ -282,7 +282,7 @@
   [4] = ArgDesc num-args 1, num-type-args 0, names []
   [5] = StaticICData target '#lib::B::', arg-desc CP#4
 }
-]static method foo3<T extends core::Object>() → void {
+]static method foo3<T extends core::Object = dynamic>() → void {
   new self::B::•<core::List<self::foo3::T>>();
 }
 [@vm.bytecode=
diff --git a/pkg/vm/testcases/bytecode/literals.dart.expect b/pkg/vm/testcases/bytecode/literals.dart.expect
index b56cae6..df1fe96 100644
--- a/pkg/vm/testcases/bytecode/literals.dart.expect
+++ b/pkg/vm/testcases/bytecode/literals.dart.expect
@@ -609,7 +609,7 @@
   [22] = StaticICData target 'dart.core::Map::_fromLiteral', arg-desc CP#7
   [23] = StaticICData target 'dart.core::print', arg-desc CP#9
 }
-]static method test_map_literal<T extends core::Object>(core::int a, core::int b, self::test_map_literal::T c) → void {
+]static method test_map_literal<T extends core::Object = dynamic>(core::int a, core::int b, self::test_map_literal::T c) → void {
   core::print(<core::int, core::int>{1: a, b: 2});
   core::print(<core::String, core::int>{"foo": a, b.{core::int::toString}(): 3});
   core::print(<core::String, self::test_map_literal::T>{});
@@ -660,7 +660,7 @@
   [4] = Null
   [5] = StaticICData target 'dart.core::print', arg-desc CP#1
 }
-]static method test_type_literal<T extends core::Object>() → void {
+]static method test_type_literal<T extends core::Object = dynamic>() → void {
   core::print(core::String);
   core::print(self::test_type_literal::T);
 }
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect
index f53ec42..e6af3e1 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart.expect
+++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
 [@vm.bytecode=
 Bytecode {
   Entry                0
@@ -44,7 +44,7 @@
     : super self::A::•()
     ;
 }
-class C<T1 extends core::Object, T2 extends core::Object, T3 extends core::Object> extends self::B {
+class C<T1 extends core::Object = dynamic, T2 extends core::Object = dynamic, T3 extends core::Object = dynamic> extends self::B {
 [@vm.bytecode=
 Bytecode {
   Entry                0
@@ -65,7 +65,7 @@
     : super self::B::•()
     ;
 }
-class D<P extends core::Object, Q extends core::Object> extends self::C<core::int, self::D::Q, self::D::P> {
+class D<P extends core::Object = dynamic, Q extends core::Object = dynamic> extends self::C<core::int, self::D::Q, self::D::P> {
   generic-covariant-impl generic-covariant-interface field core::Map<self::D::P, self::D::Q> foo = null;
 [@vm.bytecode=
 Bytecode {
@@ -215,7 +215,7 @@
   [14] = ICData target-name 'get:values', arg-desc CP#6
   [15] = Null
 }
-]  method foo3<T1 extends core::Object, T2 extends core::Object>(dynamic z) → dynamic {
+]  method foo3<T1 extends core::Object = dynamic, T2 extends core::Object = dynamic>(dynamic z) → dynamic {
     if(z is self::A<self::D::foo3::T1>) {
       core::print("31");
     }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart
new file mode 100644
index 0000000..da1f458
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart
@@ -0,0 +1,122 @@
+// 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 test carefully reproduces subtle situation when TFA fails to converge
+// unless result types are saturated.
+// * There is a loop in dependencies (or even multiple loops).
+// * There is a recursive invocation which may result in a type approximation.
+// * Invalidation of results of certain invocations cause types to bounce
+//   between approximated and non-approximated results, causing more
+//   self-induced invalidations.
+//
+
+class StreamSubscription {}
+
+class _BufferingStreamSubscription extends StreamSubscription {}
+
+class _BroadcastSubscription extends StreamSubscription {}
+
+abstract class Stream {
+  StreamSubscription foobar(void onData(event), {Function onError});
+}
+
+abstract class _StreamImpl extends Stream {
+  StreamSubscription foobar(void onData(data), {Function onError}) {
+    return _createSubscription();
+  }
+
+  StreamSubscription _createSubscription() {
+    return new _BufferingStreamSubscription();
+  }
+}
+
+class _ControllerStream extends _StreamImpl {
+  StreamSubscription _createSubscription() {
+    return new _BroadcastSubscription();
+  }
+}
+
+class _GeneratedStreamImpl extends _StreamImpl {}
+
+class StreamView extends Stream {
+  final Stream _stream;
+
+  StreamView(Stream stream) : _stream = stream;
+
+  StreamSubscription foobar(void onData(value), {Function onError}) {
+    return _stream.foobar(onData, onError: onError);
+  }
+}
+
+class ByteStream extends StreamView {
+  ByteStream(Stream stream) : super(stream);
+
+  super_foobar1(void onData(value)) {
+    super.foobar(onData);
+  }
+
+  super_foobar2(void onData(value)) {
+    super.foobar(onData);
+  }
+
+  super_foobar3({void onData(value), Function onError}) {
+    super.foobar(onData, onError: onError);
+  }
+
+  Stream get super_stream => super._stream;
+}
+
+class _HandleErrorStream extends Stream {
+  StreamSubscription foobar(void onData(event), {Function onError}) {
+    return new _BufferingStreamSubscription();
+  }
+}
+
+void round0() {
+  new ByteStream(new ByteStream(new _GeneratedStreamImpl()));
+}
+
+void round1({void onData(value)}) {
+  var x = new ByteStream(new ByteStream(new _GeneratedStreamImpl()));
+  x.super_foobar1(onData);
+}
+
+void round2({void onData(value), Function onError}) {
+  new _ControllerStream();
+  Stream x = new _GeneratedStreamImpl();
+  x = new ByteStream(x);
+  x.foobar(onData, onError: onError);
+}
+
+void round3({void onData(value), Function onError}) {
+  Stream x = new _GeneratedStreamImpl();
+  x = new ByteStream(x);
+  x = new _ControllerStream();
+  x.foobar(onData, onError: onError);
+}
+
+void round4({void onData(value)}) {
+  var x = new ByteStream(new _ControllerStream());
+  var y = x.super_stream;
+  var z = x._stream;
+  if (y == z) {
+    x.super_foobar2(onData);
+  }
+}
+
+void round5() {
+  var x = new ByteStream(new _GeneratedStreamImpl());
+  new _HandleErrorStream();
+  x.super_foobar3();
+}
+
+main(List<String> args) {
+  new _GeneratedStreamImpl();
+  round0();
+  round1();
+  round2();
+  round3();
+  round4();
+  round5();
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
new file mode 100644
index 0000000..fd8c263
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
@@ -0,0 +1,120 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+abstract class StreamSubscription extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class _BufferingStreamSubscription extends self::StreamSubscription {
+  synthetic constructor •() → void
+    : super self::StreamSubscription::•()
+    ;
+}
+class _BroadcastSubscription extends self::StreamSubscription {
+  synthetic constructor •() → void
+    : super self::StreamSubscription::•()
+    ;
+}
+abstract class Stream extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  abstract method foobar((dynamic) → void onData, {core::Function onError = null}) → self::StreamSubscription;
+}
+abstract class _StreamImpl extends self::Stream {
+  synthetic constructor •() → void
+    : super self::Stream::•()
+    ;
+  method foobar([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData, {[@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → self::StreamSubscription {
+    return [@vm.inferred-type.metadata=!] this.{self::_StreamImpl::_createSubscription}();
+  }
+  method _createSubscription() → self::StreamSubscription {
+    return new self::_BufferingStreamSubscription::•();
+  }
+}
+class _ControllerStream extends self::_StreamImpl {
+  synthetic constructor •() → void
+    : super self::_StreamImpl::•()
+    ;
+  method _createSubscription() → self::StreamSubscription {
+    return new self::_BroadcastSubscription::•();
+  }
+}
+class _GeneratedStreamImpl extends self::_StreamImpl {
+  synthetic constructor •() → void
+    : super self::_StreamImpl::•()
+    ;
+}
+abstract class StreamView extends self::Stream {
+[@vm.inferred-type.metadata=!]  final field self::Stream _stream;
+  constructor •([@vm.inferred-type.metadata=!] self::Stream stream) → void
+    : self::StreamView::_stream = stream, super self::Stream::•()
+    ;
+  method foobar([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData, {[@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → self::StreamSubscription {
+    return [@vm.direct-call.metadata=#lib::StreamView::_stream] [@vm.inferred-type.metadata=!] this.{self::StreamView::_stream}.{self::Stream::foobar}(onData, onError: onError);
+  }
+}
+class ByteStream extends self::StreamView {
+  constructor •([@vm.inferred-type.metadata=!] self::Stream stream) → void
+    : super self::StreamView::•(stream)
+    ;
+  method super_foobar1([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData) → dynamic {
+    super.{self::StreamView::foobar}(onData);
+  }
+  method super_foobar2([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData) → dynamic {
+    super.{self::StreamView::foobar}(onData);
+  }
+  method super_foobar3({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null, [@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → dynamic {
+    super.{self::StreamView::foobar}(onData, onError: onError);
+  }
+  get super_stream() → self::Stream
+    return [@vm.inferred-type.metadata=!] super.{self::StreamView::_stream};
+}
+class _HandleErrorStream extends self::Stream {
+  synthetic constructor •() → void
+    : super self::Stream::•()
+    ;
+}
+static method round0() → void {
+  new self::ByteStream::•(new self::ByteStream::•(new self::_GeneratedStreamImpl::•()));
+}
+static method round1({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null}) → void {
+  self::ByteStream x = new self::ByteStream::•(new self::ByteStream::•(new self::_GeneratedStreamImpl::•()));
+  [@vm.direct-call.metadata=#lib::ByteStream::super_foobar1] x.{self::ByteStream::super_foobar1}(onData);
+}
+static method round2({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null, [@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → void {
+  new self::_ControllerStream::•();
+  self::Stream x = new self::_GeneratedStreamImpl::•();
+  x = new self::ByteStream::•(x);
+  x.{self::Stream::foobar}(onData, onError: onError);
+}
+static method round3({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null, [@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → void {
+  self::Stream x = new self::_GeneratedStreamImpl::•();
+  x = new self::ByteStream::•(x);
+  x = new self::_ControllerStream::•();
+  x.{self::Stream::foobar}(onData, onError: onError);
+}
+static method round4({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null}) → void {
+  self::ByteStream x = new self::ByteStream::•(new self::_ControllerStream::•());
+  self::Stream y = [@vm.direct-call.metadata=#lib::ByteStream::super_stream] [@vm.inferred-type.metadata=!] x.{self::ByteStream::super_stream};
+  self::Stream z = [@vm.direct-call.metadata=#lib::StreamView::_stream] [@vm.inferred-type.metadata=!] x.{self::StreamView::_stream};
+  if([@vm.direct-call.metadata=dart.core::Object::==] [@vm.inferred-type.metadata=dart.core::bool] y.{core::Object::==}(z)) {
+    [@vm.direct-call.metadata=#lib::ByteStream::super_foobar2] x.{self::ByteStream::super_foobar2}(onData);
+  }
+}
+static method round5() → void {
+  self::ByteStream x = new self::ByteStream::•(new self::_GeneratedStreamImpl::•());
+  new self::_HandleErrorStream::•();
+  [@vm.direct-call.metadata=#lib::ByteStream::super_foobar3] x.{self::ByteStream::super_foobar3}();
+}
+static method main(core::List<core::String> args) → dynamic {
+  new self::_GeneratedStreamImpl::•();
+  self::round0();
+  self::round1();
+  self::round2();
+  self::round3();
+  self::round4();
+  self::round5();
+}
diff --git a/runtime/BUILD.gn b/runtime/BUILD.gn
index 00065fc..f0e3eac 100644
--- a/runtime/BUILD.gn
+++ b/runtime/BUILD.gn
@@ -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.
 
-import("../build/dart_host_sdk_toolchain.gni")
+import("../build/dart/dart_host_sdk_toolchain.gni")
 import("runtime_args.gni")
 
 config("dart_public_config") {
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index db2fa71..71d98d4 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -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.
 
-import("../../build/compiled_action.gni")
+import("../../build/dart/dart_action.gni")
 import("../../sdk/lib/_http/http_sources.gni")
 import("../../sdk/lib/io/io_sources.gni")
 import("../../sdk/lib/cli/cli_sources.gni")
@@ -651,7 +651,7 @@
   extra_sources = []
 }
 
-compiled_action("generate_snapshot_bin") {
+gen_snapshot_action("generate_snapshot_bin") {
   vm_snapshot_data = "$target_gen_dir/vm_snapshot_data.bin"
   vm_snapshot_instructions = "$target_gen_dir/vm_snapshot_instructions.bin"
   isolate_snapshot_data = "$target_gen_dir/isolate_snapshot_data.bin"
@@ -665,7 +665,6 @@
     isolate_snapshot_data,
     isolate_snapshot_instructions,
   ]
-  tool = ":gen_snapshot"
   args = [
     "--deterministic",
     "--snapshot_kind=" + dart_core_snapshot_kind,
@@ -1071,101 +1070,6 @@
   ]
 }
 
-if (is_fuchsia) {
-  hello_fuchsia_source = rebase_path("../tests/vm/dart/hello_fuchsia_test.dart")
-
-  copy("hello_fuchsia") {
-    sources = [
-      hello_fuchsia_source,
-    ]
-    outputs = [
-      "$root_out_dir/hello_fuchsia.dart",
-    ]
-  }
-
-  hello_fuchsia_assembly = "$target_gen_dir/hello_fuchsia.S"
-
-  compiled_action("hello_fuchsia_assembly") {
-    inputs = [
-      hello_fuchsia_source,
-    ]
-    outputs = [
-      hello_fuchsia_assembly,
-    ]
-    tool = ":dart_bootstrap"
-    args = [
-      "--snapshot-kind=app-aot",
-      "--snapshot=" + rebase_path(hello_fuchsia_assembly),
-      hello_fuchsia_source,
-    ]
-  }
-
-  shared_library("hello_fuchsia_dylib") {
-    deps = [
-      ":hello_fuchsia_assembly",
-    ]
-    sources = [
-      hello_fuchsia_assembly,
-    ]
-    cflags = [
-      "-nostdlib",
-      "-nostartfiles",
-    ]
-    output_name = "hello_fuchsia"
-  }
-
-  # Uncomment after https://fuchsia-review.googlesource.com/#/c/build/+/37541/
-  # lands.
-  # copy("copy_hello_fuchsia_dylib") {
-  #   sources = [
-  #     get_label_info(":hello_fuchsia_lib($shlib_toolchain)", "root_out_dir") +
-  #         "/libhello_fuchsia.so",
-  #   ]
-  #   outputs = [
-  #     "$root_build_dir/{{source_file_part}}",
-  #   ]
-  #   deps = [
-  #     ":hello_fuchsia_dylib($shlib_toolchain)",
-  #   ]
-  # }
-
-  import("//build/package.gni")
-
-  package("package") {
-    deprecated_system_image = true
-
-    package_name = "dart"
-
-    deps = [
-      ":dart",
-      ":dart_precompiled_runtime",
-    ]
-
-    binaries = [
-      {
-        name = "dart"
-      },
-      {
-        name = "dart_precompiled_runtime"
-      },
-    ]
-  }
-
-  package("dart_tests") {
-    deprecated_system_image = true
-
-    deps = [
-      ":hello_fuchsia",
-    ]
-
-    binaries = [
-      {
-        name = "hello_fuchsia.dart"
-      },
-    ]
-  }
-}
-
 executable("process_test") {
   sources = [
     "process_test.cc",
diff --git a/runtime/bin/console_posix.cc b/runtime/bin/console_posix.cc
index 61fd677..af28e15 100644
--- a/runtime/bin/console_posix.cc
+++ b/runtime/bin/console_posix.cc
@@ -88,5 +88,5 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(HOST_OS_LINUX) || defined(HOST_OS_MACOS) ||                 \
+#endif  // defined(HOST_OS_LINUX) || defined(HOST_OS_MACOS) ||
         // defined(HOST_OS_ANDROID) || defined(HOST_OS_FUCHSIA)
diff --git a/runtime/bin/file_patch.dart b/runtime/bin/file_patch.dart
index 5023379..247c480 100644
--- a/runtime/bin/file_patch.dart
+++ b/runtime/bin/file_patch.dart
@@ -103,7 +103,7 @@
 
   _WatcherPath _watcherPath;
 
-  StreamController _broadcastController;
+  StreamController<FileSystemEvent> _broadcastController;
 
   @patch
   static Stream<FileSystemEvent> _watch(
@@ -127,11 +127,11 @@
       throw new FileSystemException(
           "File system watching is not supported on this platform", _path);
     }
-    _broadcastController =
-        new StreamController.broadcast(onListen: _listen, onCancel: _cancel);
+    _broadcastController = new StreamController<FileSystemEvent>.broadcast(
+        onListen: _listen, onCancel: _cancel);
   }
 
-  Stream get _stream => _broadcastController.stream;
+  Stream<FileSystemEvent> get _stream => _broadcastController.stream;
 
   void _listen() {
     if (_id == null) {
@@ -201,7 +201,7 @@
       var stops = [];
       var events = [];
       var pair = {};
-      if (event == RawSocketEvent.READ) {
+      if (event == RawSocketEvent.read) {
         String getPath(event) {
           var path = _pathFromPathId(event[4]).path;
           if (event[2] != null && event[2].isNotEmpty) {
@@ -216,7 +216,7 @@
             // Windows does not get 'isDir' as part of the event.
             return FileSystemEntity.isDirectorySync(getPath(event));
           }
-          return (event[0] & FileSystemEvent._IS_DIR) != 0;
+          return (event[0] & FileSystemEvent._isDir) != 0;
         }
 
         void add(id, event) {
@@ -245,16 +245,16 @@
             }
             bool isDir = getIsDir(event);
             var path = getPath(event);
-            if ((event[0] & FileSystemEvent.CREATE) != 0) {
+            if ((event[0] & FileSystemEvent.create) != 0) {
               add(event[4], new FileSystemCreateEvent._(path, isDir));
             }
-            if ((event[0] & FileSystemEvent.MODIFY) != 0) {
+            if ((event[0] & FileSystemEvent.modify) != 0) {
               add(event[4], new FileSystemModifyEvent._(path, isDir, true));
             }
-            if ((event[0] & FileSystemEvent._MODIFY_ATTRIBUTES) != 0) {
+            if ((event[0] & FileSystemEvent._modifyAttributes) != 0) {
               add(event[4], new FileSystemModifyEvent._(path, isDir, false));
             }
-            if ((event[0] & FileSystemEvent.MOVE) != 0) {
+            if ((event[0] & FileSystemEvent.move) != 0) {
               int link = event[1];
               if (link > 0) {
                 pair.putIfAbsent(pathId, () => {});
@@ -271,10 +271,10 @@
                 rewriteMove(event, isDir);
               }
             }
-            if ((event[0] & FileSystemEvent.DELETE) != 0) {
+            if ((event[0] & FileSystemEvent.delete) != 0) {
               add(event[4], new FileSystemDeleteEvent._(path, isDir));
             }
-            if ((event[0] & FileSystemEvent._DELETE_SELF) != 0) {
+            if ((event[0] & FileSystemEvent._deleteSelf) != 0) {
               add(event[4], new FileSystemDeleteEvent._(path, isDir));
               // Signal done event.
               stops.add([event[4], null]);
@@ -289,8 +289,8 @@
             rewriteMove(event, getIsDir(event));
           }
         }
-      } else if (event == RawSocketEvent.CLOSED) {} else if (event ==
-          RawSocketEvent.READ_CLOSED) {} else {
+      } else if (event == RawSocketEvent.closed) {} else if (event ==
+          RawSocketEvent.readClosed) {} else {
         assert(false);
       }
       events.addAll(stops);
@@ -342,7 +342,7 @@
   Stream _pathWatched() {
     var pathId = _watcherPath.pathId;
     if (!_idMap.containsKey(pathId)) {
-      _idMap[pathId] = new StreamController.broadcast();
+      _idMap[pathId] = new StreamController<FileSystemEvent>.broadcast();
     }
     return _idMap[pathId].stream;
   }
@@ -364,7 +364,7 @@
 
   Stream _pathWatched() {
     var pathId = _watcherPath.pathId;
-    _controller = new StreamController();
+    _controller = new StreamController<FileSystemEvent>();
     _subscription =
         _FileSystemWatcher._listenOnSocket(pathId, 0, pathId).listen((event) {
       assert(event[0] == pathId);
@@ -393,7 +393,7 @@
   Stream _pathWatched() {
     var pathId = _watcherPath.pathId;
     var socketId = _FileSystemWatcher._getSocketId(0, pathId);
-    _controller = new StreamController();
+    _controller = new StreamController<FileSystemEvent>();
     _subscription =
         _FileSystemWatcher._listenOnSocket(socketId, 0, pathId).listen((event) {
       if (event[1] != null) {
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index e216e63..80cf710 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -24,7 +24,7 @@
       Map<String, String> environment,
       bool includeParentEnvironment: true,
       bool runInShell: false,
-      ProcessStartMode mode: ProcessStartMode.NORMAL}) {
+      ProcessStartMode mode: ProcessStartMode.normal}) {
     _ProcessImpl process = new _ProcessImpl(
         executable,
         arguments,
@@ -42,8 +42,8 @@
       Map<String, String> environment,
       bool includeParentEnvironment: true,
       bool runInShell: false,
-      Encoding stdoutEncoding: SYSTEM_ENCODING,
-      Encoding stderrEncoding: SYSTEM_ENCODING}) {
+      Encoding stdoutEncoding: systemEncoding,
+      Encoding stderrEncoding: systemEncoding}) {
     return _runNonInteractiveProcess(
         executable,
         arguments,
@@ -61,8 +61,8 @@
       Map<String, String> environment,
       bool includeParentEnvironment: true,
       bool runInShell: false,
-      Encoding stdoutEncoding: SYSTEM_ENCODING,
-      Encoding stderrEncoding: SYSTEM_ENCODING}) {
+      Encoding stdoutEncoding: systemEncoding,
+      Encoding stderrEncoding: systemEncoding}) {
     return _runNonInteractiveProcessSync(
         executable,
         arguments,
@@ -75,7 +75,7 @@
   }
 
   @patch
-  static bool killPid(int pid, [ProcessSignal signal = ProcessSignal.SIGTERM]) {
+  static bool killPid(int pid, [ProcessSignal signal = ProcessSignal.sigterm]) {
     if (signal is! ProcessSignal) {
       throw new ArgumentError("Argument 'signal' must be a ProcessSignal");
     }
@@ -108,7 +108,7 @@
     _id = id;
     var socket = new _RawSocket(new _NativeSocket.watchSignal(id));
     socket.listen((event) {
-      if (event == RawSocketEvent.READ) {
+      if (event == RawSocketEvent.read) {
         var bytes = socket.read();
         for (int i = 0; i < bytes.length; i++) {
           _controller.add(signal);
@@ -146,13 +146,13 @@
   static bool _killPid(int pid, int signal) native "Process_KillPid";
   @patch
   static Stream<ProcessSignal> _watchSignal(ProcessSignal signal) {
-    if (signal != ProcessSignal.SIGHUP &&
-        signal != ProcessSignal.SIGINT &&
-        signal != ProcessSignal.SIGTERM &&
+    if (signal != ProcessSignal.sighup &&
+        signal != ProcessSignal.sigint &&
+        signal != ProcessSignal.sigterm &&
         (Platform.isWindows ||
-            (signal != ProcessSignal.SIGUSR1 &&
-                signal != ProcessSignal.SIGUSR2 &&
-                signal != ProcessSignal.SIGWINCH))) {
+            (signal != ProcessSignal.sigusr1 &&
+                signal != ProcessSignal.sigusr2 &&
+                signal != ProcessSignal.sigwinch))) {
       throw new SignalException(
           "Listening for signal $signal is not supported");
     }
@@ -304,13 +304,13 @@
       (_stderr._stream as _Socket)._nativeSocket;
 
   static bool _modeIsAttached(ProcessStartMode mode) {
-    return (mode == ProcessStartMode.NORMAL) ||
-        (mode == ProcessStartMode.INHERIT_STDIO);
+    return (mode == ProcessStartMode.normal) ||
+        (mode == ProcessStartMode.inheritStdio);
   }
 
   static bool _modeHasStdio(ProcessStartMode mode) {
-    return (mode == ProcessStartMode.NORMAL) ||
-        (mode == ProcessStartMode.DETACHED_WITH_STDIO);
+    return (mode == ProcessStartMode.normal) ||
+        (mode == ProcessStartMode.detachedWithStdio);
   }
 
   static String _getShellCommand() {
@@ -413,7 +413,7 @@
           _arguments,
           _workingDirectory,
           _environment,
-          _mode.index,
+          _mode._mode,
           _modeHasStdio(_mode) ? _stdinNativeSocket : null,
           _modeHasStdio(_mode) ? _stdoutNativeSocket : null,
           _modeHasStdio(_mode) ? _stderrNativeSocket : null,
@@ -475,7 +475,7 @@
         _arguments,
         _workingDirectory,
         _environment,
-        ProcessStartMode.NORMAL.index,
+        ProcessStartMode.normal._mode,
         _stdinNativeSocket,
         _stdoutNativeSocket,
         _stderrNativeSocket,
@@ -535,7 +535,7 @@
 
   Future<int> get exitCode => _exitCode != null ? _exitCode.future : null;
 
-  bool kill([ProcessSignal signal = ProcessSignal.SIGTERM]) {
+  bool kill([ProcessSignal signal = ProcessSignal.sigterm]) {
     if (signal is! ProcessSignal) {
       throw new ArgumentError("Argument 'signal' must be a ProcessSignal");
     }
@@ -627,6 +627,6 @@
       environment,
       includeParentEnvironment,
       runInShell,
-      ProcessStartMode.NORMAL);
+      ProcessStartMode.normal);
   return process._runAndWait(stdoutEncoding, stderrEncoding);
 }
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index b896978..9d08b5d 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -297,7 +297,7 @@
     OS::PrintErr("No tests matched: %s\n", run_filter);
     return 1;
   }
-  if (DynamicAssertionHelper::failed()) {
+  if (Expect::failed()) {
     return 255;
   }
   return 0;
diff --git a/runtime/bin/secure_socket_patch.dart b/runtime/bin/secure_socket_patch.dart
index cae58a5..74c8bf4 100644
--- a/runtime/bin/secure_socket_patch.dart
+++ b/runtime/bin/secure_socket_patch.dart
@@ -66,12 +66,13 @@
     implements _SecureFilter {
   // Performance is improved if a full buffer of plaintext fits
   // in the encrypted buffer, when encrypted.
+  // SIZE and ENCRYPTED_SIZE are referenced from C++.
   static final int SIZE = 8 * 1024;
   static final int ENCRYPTED_SIZE = 10 * 1024;
 
   _SecureFilterImpl() {
-    buffers = new List<_ExternalBuffer>(_RawSecureSocket.NUM_BUFFERS);
-    for (int i = 0; i < _RawSecureSocket.NUM_BUFFERS; ++i) {
+    buffers = new List<_ExternalBuffer>(_RawSecureSocket.bufferCount);
+    for (int i = 0; i < _RawSecureSocket.bufferCount; ++i) {
       buffers[i] = new _ExternalBuffer(
           _RawSecureSocket._isBufferEncrypted(i) ? ENCRYPTED_SIZE : SIZE);
     }
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index ac7dc37..5f5d220 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -26,22 +26,22 @@
 class InternetAddress {
   @patch
   static InternetAddress get LOOPBACK_IP_V4 {
-    return _InternetAddress.LOOPBACK_IP_V4;
+    return _InternetAddress.loopbackIPv4;
   }
 
   @patch
   static InternetAddress get LOOPBACK_IP_V6 {
-    return _InternetAddress.LOOPBACK_IP_V6;
+    return _InternetAddress.loopbackIPv6;
   }
 
   @patch
   static InternetAddress get ANY_IP_V4 {
-    return _InternetAddress.ANY_IP_V4;
+    return _InternetAddress.anyIPv4;
   }
 
   @patch
   static InternetAddress get ANY_IP_V6 {
-    return _InternetAddress.ANY_IP_V6;
+    return _InternetAddress.anyIPv6;
   }
 
   @patch
@@ -51,7 +51,7 @@
 
   @patch
   static Future<List<InternetAddress>> lookup(String host,
-      {InternetAddressType type: InternetAddressType.ANY}) {
+      {InternetAddressType type: InternetAddressType.any}) {
     return _NativeSocket.lookup(host, type: type);
   }
 
@@ -73,7 +73,7 @@
   static Future<List<NetworkInterface>> list(
       {bool includeLoopback: false,
       bool includeLinkLocal: false,
-      InternetAddressType type: InternetAddressType.ANY}) {
+      InternetAddressType type: InternetAddressType.any}) {
     return _NativeSocket.listInterfaces(
         includeLoopback: includeLoopback,
         includeLinkLocal: includeLinkLocal,
@@ -90,29 +90,27 @@
 }
 
 class _InternetAddress implements InternetAddress {
-  static const int _ADDRESS_LOOPBACK_IP_V4 = 0;
-  static const int _ADDRESS_LOOPBACK_IP_V6 = 1;
-  static const int _ADDRESS_ANY_IP_V4 = 2;
-  static const int _ADDRESS_ANY_IP_V6 = 3;
-  static const int _IPV4_ADDR_LENGTH = 4;
-  static const int _IPV6_ADDR_LENGTH = 16;
+  static const int _addressLoopbackIPv4 = 0;
+  static const int _addressLoopbackIPv6 = 1;
+  static const int _addressAnyIPv4 = 2;
+  static const int _addressAnyIPv6 = 3;
+  static const int _IPv4AddrLength = 4;
+  static const int _IPv6AddrLength = 16;
 
-  static _InternetAddress LOOPBACK_IP_V4 =
-      new _InternetAddress.fixed(_ADDRESS_LOOPBACK_IP_V4);
-  static _InternetAddress LOOPBACK_IP_V6 =
-      new _InternetAddress.fixed(_ADDRESS_LOOPBACK_IP_V6);
-  static _InternetAddress ANY_IP_V4 =
-      new _InternetAddress.fixed(_ADDRESS_ANY_IP_V4);
-  static _InternetAddress ANY_IP_V6 =
-      new _InternetAddress.fixed(_ADDRESS_ANY_IP_V6);
+  static _InternetAddress loopbackIPv4 =
+      new _InternetAddress.fixed(_addressLoopbackIPv4);
+  static _InternetAddress loopbackIPv6 =
+      new _InternetAddress.fixed(_addressLoopbackIPv6);
+  static _InternetAddress anyIPv4 = new _InternetAddress.fixed(_addressAnyIPv4);
+  static _InternetAddress anyIPv6 = new _InternetAddress.fixed(_addressAnyIPv6);
 
   final String address;
   final String _host;
   final Uint8List _in_addr;
 
-  InternetAddressType get type => _in_addr.length == _IPV4_ADDR_LENGTH
-      ? InternetAddressType.IP_V4
-      : InternetAddressType.IP_V6;
+  InternetAddressType get type => _in_addr.length == _IPv4AddrLength
+      ? InternetAddressType.IPv4
+      : InternetAddressType.IPv6;
 
   String get host => _host != null ? _host : address;
 
@@ -120,24 +118,24 @@
 
   bool get isLoopback {
     switch (type) {
-      case InternetAddressType.IP_V4:
+      case InternetAddressType.IPv4:
         return _in_addr[0] == 127;
 
-      case InternetAddressType.IP_V6:
-        for (int i = 0; i < _IPV6_ADDR_LENGTH - 1; i++) {
+      case InternetAddressType.IPv6:
+        for (int i = 0; i < _IPv6AddrLength - 1; i++) {
           if (_in_addr[i] != 0) return false;
         }
-        return _in_addr[_IPV6_ADDR_LENGTH - 1] == 1;
+        return _in_addr[_IPv6AddrLength - 1] == 1;
     }
   }
 
   bool get isLinkLocal {
     switch (type) {
-      case InternetAddressType.IP_V4:
+      case InternetAddressType.IPv4:
         // Checking for 169.254.0.0/16.
         return _in_addr[0] == 169 && _in_addr[1] == 254;
 
-      case InternetAddressType.IP_V6:
+      case InternetAddressType.IPv6:
         // Checking for fe80::/10.
         return _in_addr[0] == 0xFE && (_in_addr[1] & 0xB0) == 0x80;
     }
@@ -145,11 +143,11 @@
 
   bool get isMulticast {
     switch (type) {
-      case InternetAddressType.IP_V4:
+      case InternetAddressType.IPv4:
         // Checking for 224.0.0.0 through 239.255.255.255.
         return _in_addr[0] >= 224 && _in_addr[0] < 240;
 
-      case InternetAddressType.IP_V6:
+      case InternetAddressType.IPv6:
         // Checking for ff00::/8.
         return _in_addr[0] == 0xFF;
     }
@@ -172,20 +170,20 @@
 
   factory _InternetAddress.fixed(int id) {
     switch (id) {
-      case _ADDRESS_LOOPBACK_IP_V4:
-        var in_addr = new Uint8List(_IPV4_ADDR_LENGTH);
+      case _addressLoopbackIPv4:
+        var in_addr = new Uint8List(_IPv4AddrLength);
         in_addr[0] = 127;
-        in_addr[_IPV4_ADDR_LENGTH - 1] = 1;
+        in_addr[_IPv4AddrLength - 1] = 1;
         return new _InternetAddress("127.0.0.1", null, in_addr);
-      case _ADDRESS_LOOPBACK_IP_V6:
-        var in_addr = new Uint8List(_IPV6_ADDR_LENGTH);
-        in_addr[_IPV6_ADDR_LENGTH - 1] = 1;
+      case _addressLoopbackIPv6:
+        var in_addr = new Uint8List(_IPv6AddrLength);
+        in_addr[_IPv6AddrLength - 1] = 1;
         return new _InternetAddress("::1", null, in_addr);
-      case _ADDRESS_ANY_IP_V4:
-        var in_addr = new Uint8List(_IPV4_ADDR_LENGTH);
+      case _addressAnyIPv4:
+        var in_addr = new Uint8List(_IPv4AddrLength);
         return new _InternetAddress("0.0.0.0", "0.0.0.0", in_addr);
-      case _ADDRESS_ANY_IP_V6:
-        var in_addr = new Uint8List(_IPV6_ADDR_LENGTH);
+      case _addressAnyIPv6:
+        var in_addr = new Uint8List(_IPv6AddrLength);
         return new _InternetAddress("::", "::", in_addr);
       default:
         assert(false);
@@ -251,63 +249,63 @@
   // eventhandler. COMMAND flags are never received from the
   // eventhandler. Additional flags are used to communicate other
   // information.
-  static const int READ_EVENT = 0;
-  static const int WRITE_EVENT = 1;
-  static const int ERROR_EVENT = 2;
-  static const int CLOSED_EVENT = 3;
-  static const int DESTROYED_EVENT = 4;
-  static const int FIRST_EVENT = READ_EVENT;
-  static const int LAST_EVENT = DESTROYED_EVENT;
-  static const int EVENT_COUNT = LAST_EVENT - FIRST_EVENT + 1;
+  static const int readEvent = 0;
+  static const int writeEvent = 1;
+  static const int errorEvent = 2;
+  static const int closedEvent = 3;
+  static const int destroyedEvent = 4;
+  static const int firstEvent = readEvent;
+  static const int lastEvent = destroyedEvent;
+  static const int eventCount = lastEvent - firstEvent + 1;
 
-  static const int CLOSE_COMMAND = 8;
-  static const int SHUTDOWN_READ_COMMAND = 9;
-  static const int SHUTDOWN_WRITE_COMMAND = 10;
-  // The lower bits of RETURN_TOKEN_COMMAND messages contains the number
+  static const int closeCommand = 8;
+  static const int shutdownReadCommand = 9;
+  static const int shutdownWriteCommand = 10;
+  // The lower bits of returnTokenCommand messages contains the number
   // of tokens returned.
-  static const int RETURN_TOKEN_COMMAND = 11;
-  static const int SET_EVENT_MASK_COMMAND = 12;
-  static const int FIRST_COMMAND = CLOSE_COMMAND;
-  static const int LAST_COMMAND = SET_EVENT_MASK_COMMAND;
+  static const int returnTokenCommand = 11;
+  static const int setEventMaskCommand = 12;
+  static const int firstCommand = closeCommand;
+  static const int lastCommand = setEventMaskCommand;
 
   // Type flag send to the eventhandler providing additional
   // information on the type of the file descriptor.
-  static const int LISTENING_SOCKET = 16;
-  static const int PIPE_SOCKET = 17;
-  static const int TYPE_NORMAL_SOCKET = 0;
-  static const int TYPE_LISTENING_SOCKET = 1 << LISTENING_SOCKET;
-  static const int TYPE_PIPE = 1 << PIPE_SOCKET;
-  static const int TYPE_TYPE_MASK = TYPE_LISTENING_SOCKET | PIPE_SOCKET;
+  static const int listeningSocket = 16;
+  static const int pipeSocket = 17;
+  static const int typeNormalSocket = 0;
+  static const int typeListeningSocket = 1 << listeningSocket;
+  static const int typePipe = 1 << pipeSocket;
+  static const int typeTypeMask = typeListeningSocket | pipeSocket;
 
   // Protocol flags.
   // Keep in sync with SocketType enum in socket.h.
-  static const int TCP_SOCKET = 18;
-  static const int UDP_SOCKET = 19;
-  static const int INTERNAL_SOCKET = 20;
-  static const int INTERNAL_SIGNAL_SOCKET = 21;
-  static const int TYPE_TCP_SOCKET = 1 << TCP_SOCKET;
-  static const int TYPE_UDP_SOCKET = 1 << UDP_SOCKET;
-  static const int TYPE_INTERNAL_SOCKET = 1 << INTERNAL_SOCKET;
-  static const int TYPE_INTERNAL_SIGNAL_SOCKET = 1 << INTERNAL_SIGNAL_SOCKET;
-  static const int TYPE_PROTOCOL_MASK = TYPE_TCP_SOCKET |
-      TYPE_UDP_SOCKET |
-      TYPE_INTERNAL_SOCKET |
-      TYPE_INTERNAL_SIGNAL_SOCKET;
+  static const int tcpSocket = 18;
+  static const int udpSocket = 19;
+  static const int internalSocket = 20;
+  static const int internalSignalSocket = 21;
+  static const int typeTcpSocket = 1 << tcpSocket;
+  static const int typeUdpSocket = 1 << udpSocket;
+  static const int typeInternalSocket = 1 << internalSocket;
+  static const int typeInternalSignalSocket = 1 << internalSignalSocket;
+  static const int typeProtocolMask = typeTcpSocket |
+      typeUdpSocket |
+      typeInternalSocket |
+      typeInternalSignalSocket;
 
   // Native port messages.
-  static const HOST_NAME_LOOKUP = 0;
-  static const LIST_INTERFACES = 1;
-  static const REVERSE_LOOKUP = 2;
+  static const hostNameLookupMessage = 0;
+  static const listInterfacesMessage = 1;
+  static const reverseLookupMessage = 2;
 
   // Protocol flags.
-  static const int PROTOCOL_IPV4 = 1 << 0;
-  static const int PROTOCOL_IPV6 = 1 << 1;
+  static const int protocolIPv4 = 1 << 0;
+  static const int protocolIPv6 = 1 << 1;
 
-  static const int NORMAL_TOKEN_BATCH_SIZE = 8;
-  static const int LISTENING_TOKEN_BATCH_SIZE = 2;
+  static const int normalTokenBatchSize = 8;
+  static const int listeningTokenBatchSize = 2;
 
-  static const Duration _RETRY_DURATION = const Duration(milliseconds: 250);
-  static const Duration _RETRY_DURATION_LOOPBACK =
+  static const Duration _retryDuration = const Duration(milliseconds: 250);
+  static const Duration _retryDurationLoopback =
       const Duration(milliseconds: 25);
 
   // Socket close state
@@ -319,7 +317,7 @@
   Completer closeCompleter = new Completer.sync();
 
   // Handlers and receive port for socket events from the event handler.
-  final List eventHandlers = new List(EVENT_COUNT + 1);
+  final List eventHandlers = new List(eventCount + 1);
   RawReceivePort eventPort;
   bool flagsSent = false;
 
@@ -351,9 +349,9 @@
   Object owner;
 
   static Future<List<InternetAddress>> lookup(String host,
-      {InternetAddressType type: InternetAddressType.ANY}) {
-    return _IOService
-        ._dispatch(_SOCKET_LOOKUP, [host, type._value]).then((response) {
+      {InternetAddressType type: InternetAddressType.any}) {
+    return _IOService._dispatch(
+        _IOService.socketLookup, [host, type._value]).then((response) {
       if (isErrorResponse(response)) {
         throw createError(response, "Failed host lookup: '$host'");
       } else {
@@ -366,7 +364,7 @@
   }
 
   static Future<InternetAddress> reverseLookup(InternetAddress addr) {
-    return _IOService._dispatch(_SOCKET_REVERSE_LOOKUP,
+    return _IOService._dispatch(_IOService.socketReverseLookup,
         [(addr as _InternetAddress)._in_addr]).then((response) {
       if (isErrorResponse(response)) {
         throw createError(response, "Failed reverse host lookup", addr);
@@ -379,9 +377,9 @@
   static Future<List<NetworkInterface>> listInterfaces(
       {bool includeLoopback: false,
       bool includeLinkLocal: false,
-      InternetAddressType type: InternetAddressType.ANY}) {
-    return _IOService
-        ._dispatch(_SOCKET_LIST_INTERFACES, [type._value]).then((response) {
+      InternetAddressType type: InternetAddressType.any}) {
+    return _IOService._dispatch(
+        _IOService.socketListInterfaces, [type._value]).then((response) {
       if (isErrorResponse(response)) {
         throw createError(response, "Failed listing interfaces");
       } else {
@@ -483,7 +481,7 @@
           // Set up timer for when we should retry the next address
           // (if any).
           var duration =
-              address.isLoopback ? _RETRY_DURATION_LOOPBACK : _RETRY_DURATION;
+              address.isLoopback ? _retryDurationLoopback : _retryDuration;
           var timer = new Timer(duration, connectNext);
           setupResourceInfo(socket);
 
@@ -576,33 +574,33 @@
   }
 
   _NativeSocket.datagram(this.localAddress)
-      : typeFlags = TYPE_NORMAL_SOCKET | TYPE_UDP_SOCKET;
+      : typeFlags = typeNormalSocket | typeUdpSocket;
 
-  _NativeSocket.normal() : typeFlags = TYPE_NORMAL_SOCKET | TYPE_TCP_SOCKET;
+  _NativeSocket.normal() : typeFlags = typeNormalSocket | typeTcpSocket;
 
-  _NativeSocket.listen() : typeFlags = TYPE_LISTENING_SOCKET | TYPE_TCP_SOCKET {
+  _NativeSocket.listen() : typeFlags = typeListeningSocket | typeTcpSocket {
     isClosedWrite = true;
   }
 
-  _NativeSocket.pipe() : typeFlags = TYPE_PIPE;
+  _NativeSocket.pipe() : typeFlags = typePipe;
 
   _NativeSocket._watchCommon(int id, int type)
-      : typeFlags = TYPE_NORMAL_SOCKET | type {
+      : typeFlags = typeNormalSocket | type {
     isClosedWrite = true;
     nativeSetSocketId(id, typeFlags);
   }
 
   _NativeSocket.watchSignal(int id)
-      : this._watchCommon(id, TYPE_INTERNAL_SIGNAL_SOCKET);
+      : this._watchCommon(id, typeInternalSignalSocket);
 
-  _NativeSocket.watch(int id) : this._watchCommon(id, TYPE_INTERNAL_SOCKET);
+  _NativeSocket.watch(int id) : this._watchCommon(id, typeInternalSocket);
 
-  bool get isListening => (typeFlags & TYPE_LISTENING_SOCKET) != 0;
-  bool get isPipe => (typeFlags & TYPE_PIPE) != 0;
-  bool get isInternal => (typeFlags & TYPE_INTERNAL_SOCKET) != 0;
-  bool get isInternalSignal => (typeFlags & TYPE_INTERNAL_SIGNAL_SOCKET) != 0;
-  bool get isTcp => (typeFlags & TYPE_TCP_SOCKET) != 0;
-  bool get isUdp => (typeFlags & TYPE_UDP_SOCKET) != 0;
+  bool get isListening => (typeFlags & typeListeningSocket) != 0;
+  bool get isPipe => (typeFlags & typePipe) != 0;
+  bool get isInternal => (typeFlags & typeInternalSocket) != 0;
+  bool get isInternalSignal => (typeFlags & typeInternalSignalSocket) != 0;
+  bool get isTcp => (typeFlags & typeTcpSocket) != 0;
+  bool get isUdp => (typeFlags & typeUdpSocket) != 0;
 
   Map _toJSON(bool ref) => throw new UnimplementedError();
   String get _serviceTypePath => throw new UnimplementedError();
@@ -734,7 +732,7 @@
     assert(available > 0);
     available--;
     tokens++;
-    returnTokens(LISTENING_TOKEN_BATCH_SIZE);
+    returnTokens(listeningTokenBatchSize);
     var socket = new _NativeSocket.normal();
     if (nativeAccept(socket) != true) return null;
     socket.localPort = localPort;
@@ -786,14 +784,14 @@
       if (available == 0) {
         if (isClosedRead && !closedReadEventSent) {
           if (isClosedWrite) close();
-          var handler = eventHandlers[CLOSED_EVENT];
+          var handler = eventHandlers[closedEvent];
           if (handler == null) return;
           closedReadEventSent = true;
           handler();
         }
         return;
       }
-      var handler = eventHandlers[READ_EVENT];
+      var handler = eventHandlers[readEvent];
       if (handler == null) return;
       readEventIssued = true;
       handler();
@@ -812,7 +810,7 @@
       if (isClosing) return;
       if (!sendWriteEvents) return;
       sendWriteEvents = false;
-      var handler = eventHandlers[WRITE_EVENT];
+      var handler = eventHandlers[writeEvent];
       if (handler == null) return;
       handler();
     }
@@ -830,23 +828,23 @@
     // TODO(paulberry): when issue #31305 is fixed, we should be able to simply
     // declare `events` as a `covariant int` parameter.
     int events = eventsObj;
-    for (int i = FIRST_EVENT; i <= LAST_EVENT; i++) {
+    for (int i = firstEvent; i <= lastEvent; i++) {
       if (((events & (1 << i)) != 0)) {
-        if ((i == CLOSED_EVENT || i == READ_EVENT) && isClosedRead) continue;
-        if (isClosing && i != DESTROYED_EVENT) continue;
-        if (i == CLOSED_EVENT && !isListening && !isClosing && !isClosed) {
+        if ((i == closedEvent || i == readEvent) && isClosedRead) continue;
+        if (isClosing && i != destroyedEvent) continue;
+        if (i == closedEvent && !isListening && !isClosing && !isClosed) {
           isClosedRead = true;
           issueReadEvent();
           continue;
         }
 
-        if (i == WRITE_EVENT) {
+        if (i == writeEvent) {
           writeAvailable = true;
           issueWriteEvent(delayed: false);
           continue;
         }
 
-        if (i == READ_EVENT) {
+        if (i == readEvent) {
           if (isListening) {
             available++;
           } else {
@@ -857,7 +855,7 @@
         }
 
         var handler = eventHandlers[i];
-        if (i == DESTROYED_EVENT) {
+        if (i == destroyedEvent) {
           assert(isClosing);
           assert(!isClosed);
           // TODO(ricow): Remove/update when we track internal and pipe uses.
@@ -873,7 +871,7 @@
           continue;
         }
 
-        if (i == ERROR_EVENT) {
+        if (i == errorEvent) {
           if (!isClosing) {
             reportError(nativeGetError(), "");
           }
@@ -886,7 +884,7 @@
     }
     if (!isListening) {
       tokens++;
-      returnTokens(NORMAL_TOKEN_BATCH_SIZE);
+      returnTokens(normalTokenBatchSize);
     }
   }
 
@@ -895,19 +893,19 @@
       assert(eventPort != null);
       // Return in batches.
       if (tokens == tokenBatchSize) {
-        assert(tokens < (1 << FIRST_COMMAND));
-        sendToEventHandler((1 << RETURN_TOKEN_COMMAND) | tokens);
+        assert(tokens < (1 << firstCommand));
+        sendToEventHandler((1 << returnTokenCommand) | tokens);
         tokens = 0;
       }
     }
   }
 
   void setHandlers({read, write, error, closed, destroyed}) {
-    eventHandlers[READ_EVENT] = read;
-    eventHandlers[WRITE_EVENT] = write;
-    eventHandlers[ERROR_EVENT] = error;
-    eventHandlers[CLOSED_EVENT] = closed;
-    eventHandlers[DESTROYED_EVENT] = destroyed;
+    eventHandlers[readEvent] = read;
+    eventHandlers[writeEvent] = write;
+    eventHandlers[errorEvent] = error;
+    eventHandlers[closedEvent] = closed;
+    eventHandlers[destroyedEvent] = destroyed;
   }
 
   void setListening({read: true, write: true}) {
@@ -917,16 +915,16 @@
     if (write) issueWriteEvent();
     if (!flagsSent && !isClosing) {
       flagsSent = true;
-      int flags = 1 << SET_EVENT_MASK_COMMAND;
-      if (!isClosedRead) flags |= 1 << READ_EVENT;
-      if (!isClosedWrite) flags |= 1 << WRITE_EVENT;
+      int flags = 1 << setEventMaskCommand;
+      if (!isClosedRead) flags |= 1 << readEvent;
+      if (!isClosedWrite) flags |= 1 << writeEvent;
       sendToEventHandler(flags);
     }
   }
 
   Future close() {
     if (!isClosing && !isClosed) {
-      sendToEventHandler(1 << CLOSE_COMMAND);
+      sendToEventHandler(1 << closeCommand);
       isClosing = true;
     }
     return closeCompleter.future;
@@ -935,13 +933,13 @@
   void shutdown(SocketDirection direction) {
     if (!isClosing && !isClosed) {
       switch (direction) {
-        case SocketDirection.RECEIVE:
+        case SocketDirection.receive:
           shutdownRead();
           break;
-        case SocketDirection.SEND:
+        case SocketDirection.send:
           shutdownWrite();
           break;
-        case SocketDirection.BOTH:
+        case SocketDirection.both:
           close();
           break;
         default:
@@ -955,7 +953,7 @@
       if (closedReadEventSent) {
         close();
       } else {
-        sendToEventHandler(1 << SHUTDOWN_WRITE_COMMAND);
+        sendToEventHandler(1 << shutdownWriteCommand);
       }
       isClosedWrite = true;
     }
@@ -966,14 +964,14 @@
       if (isClosedWrite) {
         close();
       } else {
-        sendToEventHandler(1 << SHUTDOWN_READ_COMMAND);
+        sendToEventHandler(1 << shutdownReadCommand);
       }
       isClosedRead = true;
     }
   }
 
   void sendToEventHandler(int data) {
-    int fullData = (typeFlags & TYPE_TYPE_MASK) | data;
+    int fullData = (typeFlags & typeTypeMask) | data;
     assert(!isClosing);
     connectToEventHandler();
     _EventHandler._sendData(this, eventPort.sendPort, fullData);
@@ -1005,7 +1003,7 @@
 
   // Check whether this is an error response from a native port call.
   static bool isErrorResponse(response) {
-    return response is List && response[0] != _SUCCESS_RESPONSE;
+    return response is List && response[0] != _successResponse;
   }
 
   // Create the appropriate error/exception from different returned
@@ -1018,9 +1016,9 @@
     } else if (error is List) {
       assert(isErrorResponse(error));
       switch (error[0]) {
-        case _ILLEGAL_ARGUMENT_RESPONSE:
+        case _illegalArgumentResponse:
           return new ArgumentError();
-        case _OSERROR_RESPONSE:
+        case _osErrorResponse:
           return new SocketException(message,
               osError: new OSError(error[2], error[1]),
               address: address,
@@ -1036,8 +1034,8 @@
   void reportError(error, String message) {
     var e = createError(error, message, address, localPort);
     // Invoke the error handler if any.
-    if (eventHandlers[ERROR_EVENT] != null) {
-      eventHandlers[ERROR_EVENT](e);
+    if (eventHandlers[errorEvent] != null) {
+      eventHandlers[errorEvent](e);
     }
     // For all errors we close the socket
     close();
@@ -1060,10 +1058,10 @@
       InternetAddress addr, NetworkInterface interface) {
     // On Mac OS using the interface index for joining IPv4 multicast groups
     // is not supported. Here the IP address of the interface is needed.
-    if (Platform.isMacOS && addr.type == InternetAddressType.IP_V4) {
+    if (Platform.isMacOS && addr.type == InternetAddressType.IPv4) {
       if (interface != null) {
         for (int i = 0; i < interface.addresses.length; i++) {
-          if (interface.addresses[i].type == InternetAddressType.IP_V4) {
+          if (interface.addresses[i].type == InternetAddressType.IPv4) {
             return interface.addresses[i];
           }
         }
@@ -1073,7 +1071,7 @@
             "of the same family as the multicast address");
       } else {
         // Default to the ANY address if no interface is specified.
-        return InternetAddress.ANY_IP_V4;
+        return InternetAddress.anyIPv4;
       }
     } else {
       return null;
@@ -1244,16 +1242,16 @@
         onPause: _onPauseStateChange,
         onResume: _onPauseStateChange);
     _socket.setHandlers(
-        read: () => _controller.add(RawSocketEvent.READ),
+        read: () => _controller.add(RawSocketEvent.read),
         write: () {
           // The write event handler is automatically disabled by the
           // event handler when it fires.
           writeEventsEnabled = false;
-          _controller.add(RawSocketEvent.WRITE);
+          _controller.add(RawSocketEvent.write);
         },
-        closed: () => _controller.add(RawSocketEvent.READ_CLOSED),
+        closed: () => _controller.add(RawSocketEvent.readClosed),
         destroyed: () {
-          _controller.add(RawSocketEvent.CLOSED);
+          _controller.add(RawSocketEvent.closed);
           _controller.close();
         },
         error: zone.bindUnaryCallbackGuarded((e) {
@@ -1277,7 +1275,7 @@
     if (fd != null) {
       var socketType = _StdIOUtils._nativeSocketType(result._socket);
       result._isMacOSTerminalInput =
-          Platform.isMacOS && socketType == _STDIO_HANDLE_TYPE_TERMINAL;
+          Platform.isMacOS && socketType == _stdioHandleTypeTerminal;
     }
     return result;
   }
@@ -1298,7 +1296,7 @@
       if (data == null || data.length < available) {
         // Reading less than available from a Mac OS terminal indicate Ctrl-D.
         // This is interpreted as read closed.
-        scheduleMicrotask(() => _controller.add(RawSocketEvent.READ_CLOSED));
+        scheduleMicrotask(() => _controller.add(RawSocketEvent.readClosed));
       }
       return data;
     } else {
@@ -1656,7 +1654,7 @@
     } else {
       _controllerClosed = true;
       if (_raw != null) {
-        _raw.shutdown(SocketDirection.RECEIVE);
+        _raw.shutdown(SocketDirection.receive);
       }
     }
   }
@@ -1669,14 +1667,14 @@
 
   void _onData(event) {
     switch (event) {
-      case RawSocketEvent.READ:
+      case RawSocketEvent.read:
         var buffer = _raw.read();
         if (buffer != null) _controller.add(buffer);
         break;
-      case RawSocketEvent.WRITE:
+      case RawSocketEvent.write:
         _consumer.write();
         break;
-      case RawSocketEvent.READ_CLOSED:
+      case RawSocketEvent.readClosed:
         _controllerClosed = true;
         _controller.close();
         break;
@@ -1718,7 +1716,7 @@
       _detachReady.complete(null);
     } else {
       if (_raw != null) {
-        _raw.shutdown(SocketDirection.SEND);
+        _raw.shutdown(SocketDirection.send);
         _disableWriteEvent();
       }
     }
@@ -1756,16 +1754,16 @@
         onPause: _onPauseStateChange,
         onResume: _onPauseStateChange);
     _socket.setHandlers(
-        read: () => _controller.add(RawSocketEvent.READ),
+        read: () => _controller.add(RawSocketEvent.read),
         write: () {
           // The write event handler is automatically disabled by the
           // event handler when it fires.
           writeEventsEnabled = false;
-          _controller.add(RawSocketEvent.WRITE);
+          _controller.add(RawSocketEvent.write);
         },
-        closed: () => _controller.add(RawSocketEvent.READ_CLOSED),
+        closed: () => _controller.add(RawSocketEvent.readClosed),
         destroyed: () {
-          _controller.add(RawSocketEvent.CLOSED);
+          _controller.add(RawSocketEvent.closed);
           _controller.close();
         },
         error: zone.bindUnaryCallbackGuarded((e) {
@@ -1821,21 +1819,21 @@
   }
 
   bool get multicastLoopback =>
-      _socket.getOption(SocketOption._IP_MULTICAST_LOOP);
+      _socket.getOption(SocketOption._ipMulticastLoop);
   void set multicastLoopback(bool value) =>
-      _socket.setOption(SocketOption._IP_MULTICAST_LOOP, value);
+      _socket.setOption(SocketOption._ipMulticastLoop, value);
 
-  int get multicastHops => _socket.getOption(SocketOption._IP_MULTICAST_HOPS);
+  int get multicastHops => _socket.getOption(SocketOption._ipMulticastHops);
   void set multicastHops(int value) =>
-      _socket.setOption(SocketOption._IP_MULTICAST_HOPS, value);
+      _socket.setOption(SocketOption._ipMulticastHops, value);
 
   NetworkInterface get multicastInterface => throw "Not implemented";
   void set multicastInterface(NetworkInterface value) =>
       throw "Not implemented";
 
-  bool get broadcastEnabled => _socket.getOption(SocketOption._IP_BROADCAST);
+  bool get broadcastEnabled => _socket.getOption(SocketOption._ipBroadcast);
   void set broadcastEnabled(bool value) =>
-      _socket.setOption(SocketOption._IP_BROADCAST, value);
+      _socket.setOption(SocketOption._ipBroadcast, value);
 
   int get port => _socket.port;
 
diff --git a/runtime/bin/stdio_patch.dart b/runtime/bin/stdio_patch.dart
index 14bee98..ca8f16e 100644
--- a/runtime/bin/stdio_patch.dart
+++ b/runtime/bin/stdio_patch.dart
@@ -9,11 +9,11 @@
   @patch
   static Stdin _getStdioInputStream(int fd) {
     switch (_getStdioHandleType(fd)) {
-      case _STDIO_HANDLE_TYPE_TERMINAL:
-      case _STDIO_HANDLE_TYPE_PIPE:
-      case _STDIO_HANDLE_TYPE_SOCKET:
+      case _stdioHandleTypeTerminal:
+      case _stdioHandleTypePipe:
+      case _stdioHandleTypeSocket:
         return new Stdin._(new _Socket._readPipe(fd), fd);
-      case _STDIO_HANDLE_TYPE_FILE:
+      case _stdioHandleTypeFile:
         return new Stdin._(new _FileStream.forStdin(), fd);
       default:
         throw new FileSystemException(
@@ -24,10 +24,10 @@
   @patch
   static _getStdioOutputStream(int fd) {
     switch (_getStdioHandleType(fd)) {
-      case _STDIO_HANDLE_TYPE_TERMINAL:
-      case _STDIO_HANDLE_TYPE_PIPE:
-      case _STDIO_HANDLE_TYPE_SOCKET:
-      case _STDIO_HANDLE_TYPE_FILE:
+      case _stdioHandleTypeTerminal:
+      case _stdioHandleTypePipe:
+      case _stdioHandleTypeSocket:
+      case _stdioHandleTypeFile:
         return new Stdout._(new IOSink(new _StdConsumer(fd)), fd);
       default:
         throw new FileSystemException(
diff --git a/runtime/bin/sync_socket_patch.dart b/runtime/bin/sync_socket_patch.dart
index 147b0e1..1f525c1 100644
--- a/runtime/bin/sync_socket_patch.dart
+++ b/runtime/bin/sync_socket_patch.dart
@@ -254,13 +254,13 @@
       return;
     }
     switch (direction) {
-      case SocketDirection.RECEIVE:
+      case SocketDirection.receive:
         shutdownRead();
         break;
-      case SocketDirection.SEND:
+      case SocketDirection.send:
         shutdownWrite();
         break;
-      case SocketDirection.BOTH:
+      case SocketDirection.both:
         closeSync();
         break;
       default:
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 1e39caf..b3fdd96 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -1013,7 +1013,7 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT Dart_Handle
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
 Dart_CreateSnapshot(uint8_t** vm_snapshot_data_buffer,
                     intptr_t* vm_snapshot_data_size,
                     uint8_t** isolate_snapshot_data_buffer,
@@ -1035,7 +1035,7 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT Dart_Handle
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
 Dart_CreateScriptSnapshot(uint8_t** script_snapshot_buffer,
                           intptr_t* script_snapshot_size);
 
@@ -1245,7 +1245,7 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT Dart_Handle Dart_HandleMessage();
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_HandleMessage();
 
 /**
  * Drains the microtask queue, then blocks the calling thread until the current
@@ -1255,7 +1255,8 @@
           number of milliseconds even if no message was received.
  * \return A valid handle if no error occurs, otherwise an error handle.
  */
-DART_EXPORT Dart_Handle Dart_WaitForEvent(int64_t timeout_millis);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_WaitForEvent(int64_t timeout_millis);
 
 /**
  * Handles any pending messages for the vm service for the current
@@ -1295,7 +1296,7 @@
  *   exception or other error occurs while processing messages, an
  *   error handle is returned.
  */
-DART_EXPORT Dart_Handle Dart_RunLoop();
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_RunLoop();
 /* TODO(turnidge): Should this be removed from the public api? */
 
 /**
@@ -2218,10 +2219,11 @@
  *   then the new object. If an error occurs during execution, then an
  *   error handle is returned.
  */
-DART_EXPORT Dart_Handle Dart_New(Dart_Handle type,
-                                 Dart_Handle constructor_name,
-                                 int number_of_arguments,
-                                 Dart_Handle* arguments);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_New(Dart_Handle type,
+         Dart_Handle constructor_name,
+         int number_of_arguments,
+         Dart_Handle* arguments);
 
 /**
  * Allocate a new object without invoking a constructor.
@@ -2231,7 +2233,7 @@
  * \return The new object. If an error occurs during execution, then an
  *   error handle is returned.
  */
-DART_EXPORT Dart_Handle Dart_Allocate(Dart_Handle type);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_Allocate(Dart_Handle type);
 
 /**
  * Allocate a new object without invoking a constructor, and sets specified
@@ -2272,10 +2274,11 @@
  *   successfully, then the return value is returned. If an error
  *   occurs during execution, then an error handle is returned.
  */
-DART_EXPORT Dart_Handle Dart_Invoke(Dart_Handle target,
-                                    Dart_Handle name,
-                                    int number_of_arguments,
-                                    Dart_Handle* arguments);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_Invoke(Dart_Handle target,
+            Dart_Handle name,
+            int number_of_arguments,
+            Dart_Handle* arguments);
 /* TODO(turnidge): Document how to invoke operators. */
 
 /**
@@ -2287,9 +2290,10 @@
  *   invoking the closure is returned. If an error occurs during
  *   execution, then an error handle is returned.
  */
-DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure,
-                                           int number_of_arguments,
-                                           Dart_Handle* arguments);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_InvokeClosure(Dart_Handle closure,
+                   int number_of_arguments,
+                   Dart_Handle* arguments);
 
 /**
  * Invokes a Generative Constructor on an object that was previously
@@ -2311,10 +2315,11 @@
  *   successfully, then the object is returned. If an error
  *   occurs during execution, then an error handle is returned.
  */
-DART_EXPORT Dart_Handle Dart_InvokeConstructor(Dart_Handle object,
-                                               Dart_Handle name,
-                                               int number_of_arguments,
-                                               Dart_Handle* arguments);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_InvokeConstructor(Dart_Handle object,
+                       Dart_Handle name,
+                       int number_of_arguments,
+                       Dart_Handle* arguments);
 
 /**
  * Gets the value of a field.
@@ -2336,7 +2341,8 @@
  * \return If no error occurs, then the value of the field is
  *   returned. Otherwise an error handle is returned.
  */
-DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_GetField(Dart_Handle container, Dart_Handle name);
 
 /**
  * Sets the value of a field.
@@ -2358,9 +2364,8 @@
  *
  * \return A valid handle if no error occurs.
  */
-DART_EXPORT Dart_Handle Dart_SetField(Dart_Handle container,
-                                      Dart_Handle name,
-                                      Dart_Handle value);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_SetField(Dart_Handle container, Dart_Handle name, Dart_Handle value);
 
 /*
  * ==========
@@ -2887,11 +2892,12 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url,
-                                        Dart_Handle resolved_url,
-                                        Dart_Handle source,
-                                        intptr_t line_offset,
-                                        intptr_t col_offset);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_LoadScript(Dart_Handle url,
+                Dart_Handle resolved_url,
+                Dart_Handle source,
+                intptr_t line_offset,
+                intptr_t col_offset);
 
 /**
  * Loads the root script for current isolate from a script snapshot. The
@@ -2919,8 +2925,8 @@
  *
  * \return A handle to the root library, or an error.
  */
-DART_EXPORT Dart_Handle Dart_LoadScriptFromKernel(const uint8_t* kernel_buffer,
-                                                  intptr_t kernel_size);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_LoadScriptFromKernel(const uint8_t* kernel_buffer, intptr_t kernel_size);
 
 /**
  * Constructs an in-memory kernel program form a binary.
@@ -3039,11 +3045,12 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url,
-                                         Dart_Handle resolved_url,
-                                         Dart_Handle source,
-                                         intptr_t line_offset,
-                                         intptr_t column_offset);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_LoadLibrary(Dart_Handle url,
+                 Dart_Handle resolved_url,
+                 Dart_Handle source,
+                 intptr_t line_offset,
+                 intptr_t column_offset);
 
 /**
  * Called by the embedder to load a partial program. Does not set the root
@@ -3055,8 +3062,9 @@
  *
  * \return A handle to the main library of the compilation unit, or an error.
  */
-DART_EXPORT Dart_Handle Dart_LoadLibraryFromKernel(const uint8_t* kernel_buffer,
-                                                   intptr_t kernel_buffer_size);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_LoadLibraryFromKernel(const uint8_t* kernel_buffer,
+                           intptr_t kernel_buffer_size);
 
 /**
  * Imports a library into another library, optionally with a prefix.
@@ -3069,9 +3077,10 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT Dart_Handle Dart_LibraryImportLibrary(Dart_Handle library,
-                                                  Dart_Handle import,
-                                                  Dart_Handle prefix);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_LibraryImportLibrary(Dart_Handle library,
+                          Dart_Handle import,
+                          Dart_Handle prefix);
 
 /**
  * Returns a flattened list of pairs. The first element in each pair is the
@@ -3109,12 +3118,13 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT Dart_Handle Dart_LoadSource(Dart_Handle library,
-                                        Dart_Handle url,
-                                        Dart_Handle resolved_url,
-                                        Dart_Handle source,
-                                        intptr_t line_offset,
-                                        intptr_t column_offset);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_LoadSource(Dart_Handle library,
+                Dart_Handle url,
+                Dart_Handle resolved_url,
+                Dart_Handle source,
+                intptr_t line_offset,
+                intptr_t column_offset);
 
 /**
  * Loads a patch source string into a library.
@@ -3123,9 +3133,10 @@
  * \param url A url identifying the origin of the patch source
  * \param source A string of Dart patch source
  */
-DART_EXPORT Dart_Handle Dart_LibraryLoadPatch(Dart_Handle library,
-                                              Dart_Handle url,
-                                              Dart_Handle patch_source);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_LibraryLoadPatch(Dart_Handle library,
+                      Dart_Handle url,
+                      Dart_Handle patch_source);
 
 /**
  * Indicates that all outstanding load requests have been satisfied.
@@ -3140,7 +3151,8 @@
  * \return Success if all classes have been finalized and deferred library
  *   futures are completed. Otherwise, returns an error.
  */
-DART_EXPORT Dart_Handle Dart_FinalizeLoading(bool complete_futures);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_FinalizeLoading(bool complete_futures);
 
 /*
  * =====
@@ -3266,8 +3278,8 @@
  * \param size Returns the size of the buffer.
  * \return Returns an valid handle upon success.
  */
-DART_EXPORT Dart_Handle Dart_SaveCompilationTrace(uint8_t** buffer,
-                                                  intptr_t* buffer_length);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_SaveCompilationTrace(uint8_t** buffer, intptr_t* buffer_length);
 
 /**
  * Compile all functions from data from Dart_SaveCompilationTrace. Unlike JIT
@@ -3277,8 +3289,8 @@
  *
  * \return Returns an error handle if a compilation error was encountered.
  */
-DART_EXPORT Dart_Handle Dart_LoadCompilationTrace(uint8_t* buffer,
-                                                  intptr_t buffer_length);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_LoadCompilationTrace(uint8_t* buffer, intptr_t buffer_length);
 
 /*
  * ==============
@@ -3325,7 +3337,7 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT Dart_Handle
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
 Dart_CreateAppAOTSnapshotAsAssembly(Dart_StreamingWriteCallback callback,
                                     void* callback_data);
 
@@ -3333,7 +3345,7 @@
  *  Like Dart_CreateAppAOTSnapshotAsAssembly, but only includes
  *  kDartVmSnapshotData and kDartVmSnapshotInstructions.
  */
-DART_EXPORT Dart_Handle
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
 Dart_CreateVMAOTSnapshotAsAssembly(Dart_StreamingWriteCallback callback,
                                    void* callback_data);
 
@@ -3343,7 +3355,7 @@
  *  instructions pieces must be loaded with read and execute permissions; the
  *  other pieces may be loaded as read-only.
  */
-DART_EXPORT Dart_Handle
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
 Dart_CreateAppAOTSnapshotAsBlobs(uint8_t** vm_snapshot_data_buffer,
                                  intptr_t* vm_snapshot_data_size,
                                  uint8_t** vm_snapshot_instructions_buffer,
@@ -3362,7 +3374,7 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT Dart_Handle Dart_SortClasses();
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_SortClasses();
 
 /**
  *  Creates a snapshot that caches compiled code and type feedback for faster
@@ -3386,7 +3398,7 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT Dart_Handle
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
 Dart_CreateAppJITSnapshotAsBlobs(uint8_t** isolate_snapshot_data_buffer,
                                  intptr_t* isolate_snapshot_data_size,
                                  uint8_t** isolate_snapshot_instructions_buffer,
@@ -3395,7 +3407,8 @@
 /**
  * Like Dart_CreateAppJITSnapshotAsBlobs, but also creates a new VM snapshot.
  */
-DART_EXPORT Dart_Handle Dart_CreateCoreJITSnapshotAsBlobs(
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_CreateCoreJITSnapshotAsBlobs(
     uint8_t** vm_snapshot_data_buffer,
     intptr_t* vm_snapshot_data_size,
     uint8_t** vm_snapshot_instructions_buffer,
@@ -3414,8 +3427,8 @@
  * \return Returns an error handler if the VM was built in a mode that does not
  * support obfuscation.
  */
-DART_EXPORT Dart_Handle Dart_GetObfuscationMap(uint8_t** buffer,
-                                               intptr_t* buffer_length);
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_GetObfuscationMap(uint8_t** buffer, intptr_t* buffer_length);
 
 /**
  *  Returns whether the VM only supports running from precompiled snapshots and
diff --git a/runtime/include/dart_native_api.h b/runtime/include/dart_native_api.h
index 10fde6e..934ef3d 100644
--- a/runtime/include/dart_native_api.h
+++ b/runtime/include/dart_native_api.h
@@ -167,12 +167,12 @@
  *
  * TODO(turnidge): Document.
  */
-DART_EXPORT Dart_Handle Dart_CompileAll();
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_CompileAll();
 
 /**
  * Parses all loaded functions in the current isolate..
  *
  */
-DART_EXPORT Dart_Handle Dart_ParseAll();
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_ParseAll();
 
 #endif /* INCLUDE_DART_NATIVE_API_H_ */ /* NOLINT */
diff --git a/runtime/lib/bigint_patch.dart b/runtime/lib/bigint_patch.dart
index 7516712..0b0cd0f 100644
--- a/runtime/lib/bigint_patch.dart
+++ b/runtime/lib/bigint_patch.dart
@@ -2628,7 +2628,8 @@
   }
 
   _BigIntImpl _revert(Uint32List xDigits, int xUsed) {
-    var resultDigits = _newDigits(2 * _normModulusUsed);
+    // Reserve enough digits for modulus squaring and accumulator carry.
+    var resultDigits = _newDigits(2 * _normModulusUsed + 2);
     var i = xUsed + (xUsed & 1);
     while (--i >= 0) {
       resultDigits[i] = xDigits[i];
@@ -2640,8 +2641,8 @@
   // x = x/R mod _modulus.
   // Returns xUsed.
   int _reduce(Uint32List xDigits, int xUsed) {
-    while (xUsed < 2 * _normModulusUsed) {
-      // Pad x so _mulAdd has enough room later.
+    while (xUsed < 2 * _normModulusUsed + 2) {
+      // Pad x so _mulAdd has enough room later for a possible carry.
       xDigits[xUsed++] = 0;
     }
     var i = 0;
diff --git a/runtime/lib/compact_hash.dart b/runtime/lib/compact_hash.dart
index 6f55f41..82bc532 100644
--- a/runtime/lib/compact_hash.dart
+++ b/runtime/lib/compact_hash.dart
@@ -78,14 +78,19 @@
   static const int _UNUSED_PAIR = 0;
   static const int _DELETED_PAIR = 1;
 
-  // The top bits are wasted to avoid Mint allocation.
+  // On 32-bit, the top bits are wasted to avoid Mint allocation.
+  // TODO(koda): Reclaim the bits by making the compiler treat hash patterns
+  // as unsigned words.
   static int _indexSizeToHashMask(int indexSize) {
     int indexBits = indexSize.bitLength - 2;
-    return (1 << (30 - indexBits)) - 1;
+    return internal.is64Bit
+        ? (1 << (32 - indexBits)) - 1
+        : (1 << (30 - indexBits)) - 1;
   }
 
   static int _hashPattern(int fullHash, int hashMask, int size) {
     final int maskedHash = fullHash & hashMask;
+    // TODO(koda): Consider keeping bit length and use left shift.
     return (maskedHash == 0) ? (size >> 1) : maskedHash * (size >> 1);
   }
 
diff --git a/runtime/lib/integers_patch.dart b/runtime/lib/integers_patch.dart
index 15598fe..d1c13be 100644
--- a/runtime/lib/integers_patch.dart
+++ b/runtime/lib/integers_patch.dart
@@ -32,7 +32,7 @@
         return null; // Empty.
       }
     }
-    var smiLimit = 9;
+    var smiLimit = is64Bit ? 18 : 9;
     if ((last - ix) >= smiLimit) {
       return null; // May not fit into a Smi.
     }
@@ -133,7 +133,7 @@
 
   static int _parseRadix(
       String source, int radix, int start, int end, int sign) {
-    int tableIndex = (radix - 2) * 2;
+    int tableIndex = (radix - 2) * 4 + (is64Bit ? 2 : 0);
     int blockSize = _PARSE_LIMITS[tableIndex];
     int length = end - start;
     if (length <= blockSize) {
@@ -159,7 +159,7 @@
     int positiveOverflowLimit = 0;
     int negativeOverflowLimit = 0;
     if (_limitIntsTo64Bits) {
-      tableIndex = tableIndex << 1; // Pre-multiply by 2 for simpler indexing.
+      tableIndex = tableIndex << 1; // pre-multiply by 2 for simpler indexing
       positiveOverflowLimit = _int64OverflowLimits[tableIndex];
       if (positiveOverflowLimit == 0) {
         positiveOverflowLimit =
@@ -175,10 +175,14 @@
         if (result >= positiveOverflowLimit) {
           if ((result > positiveOverflowLimit) ||
               (smi > _int64OverflowLimits[tableIndex + 2])) {
+            // Although the unsigned overflow limits do not depend on the
+            // platform, the multiplier and block size, which are used to
+            // compute it, do.
+            int X = is64Bit ? 1 : 0;
             if (radix == 16 &&
-                !(result >= _int64UnsignedOverflowLimit &&
-                    (result > _int64UnsignedOverflowLimit ||
-                        smi > _int64UnsignedSmiOverflowLimit)) &&
+                !(result >= _int64UnsignedOverflowLimits[X] &&
+                    (result > _int64UnsignedOverflowLimits[X] ||
+                        smi > _int64UnsignedSmiOverflowLimits[X])) &&
                 blockEnd + blockSize > end) {
               return (result * multiplier) + smi;
             }
@@ -223,42 +227,43 @@
 
   // For each radix, 2-36, how many digits are guaranteed to fit in a smi,
   // and magnitude of such a block (radix ** digit-count).
+  // 32-bit limit/multiplier at (radix - 2)*4, 64-bit limit at (radix-2)*4+2
   static const _PARSE_LIMITS = const [
-    30, 1073741824, // radix: 2
-    18, 387420489,
-    15, 1073741824,
-    12, 244140625, //  radix: 5
-    11, 362797056,
-    10, 282475249,
-    10, 1073741824,
-    9, 387420489,
-    9, 1000000000, //  radix: 10
-    8, 214358881,
-    8, 429981696,
-    8, 815730721,
-    7, 105413504,
-    7, 170859375, //    radix: 15
-    7, 268435456,
-    7, 410338673,
-    7, 612220032,
-    7, 893871739,
-    6, 64000000, //    radix: 20
-    6, 85766121,
-    6, 113379904,
-    6, 148035889,
-    6, 191102976,
-    6, 244140625, //   radix: 25
-    6, 308915776,
-    6, 387420489,
-    6, 481890304,
-    6, 594823321,
-    6, 729000000, //    radix: 30
-    6, 887503681,
-    6, 1073741824,
-    5, 39135393,
-    5, 45435424,
-    5, 52521875, //    radix: 35
-    5, 60466176,
+    30, 1073741824, 62, 4611686018427387904, // radix: 2
+    18, 387420489, 39, 4052555153018976267,
+    15, 1073741824, 30, 1152921504606846976,
+    12, 244140625, 26, 1490116119384765625, //  radix: 5
+    11, 362797056, 23, 789730223053602816,
+    10, 282475249, 22, 3909821048582988049,
+    10, 1073741824, 20, 1152921504606846976,
+    9, 387420489, 19, 1350851717672992089,
+    9, 1000000000, 18, 1000000000000000000, //  radix: 10
+    8, 214358881, 17, 505447028499293771,
+    8, 429981696, 17, 2218611106740436992,
+    8, 815730721, 16, 665416609183179841,
+    7, 105413504, 16, 2177953337809371136,
+    7, 170859375, 15, 437893890380859375, //    radix: 15
+    7, 268435456, 15, 1152921504606846976,
+    7, 410338673, 15, 2862423051509815793,
+    7, 612220032, 14, 374813367582081024,
+    7, 893871739, 14, 799006685782884121,
+    6, 64000000, 14, 1638400000000000000, //    radix: 20
+    6, 85766121, 14, 3243919932521508681,
+    6, 113379904, 13, 282810057883082752,
+    6, 148035889, 13, 504036361936467383,
+    6, 191102976, 13, 876488338465357824,
+    6, 244140625, 13, 1490116119384765625, //   radix: 25
+    6, 308915776, 13, 2481152873203736576,
+    6, 387420489, 13, 4052555153018976267,
+    6, 481890304, 12, 232218265089212416,
+    6, 594823321, 12, 353814783205469041,
+    6, 729000000, 12, 531441000000000000, //    radix: 30
+    6, 887503681, 12, 787662783788549761,
+    6, 1073741824, 12, 1152921504606846976,
+    5, 39135393, 12, 1667889514952984961,
+    5, 45435424, 12, 2386420683693101056,
+    5, 52521875, 12, 3379220508056640625, //    radix: 35
+    5, 60466176, 11, 131621703842267136,
   ];
 
   /// Flag indicating if integers are limited by 64 bits
@@ -268,8 +273,11 @@
   static const _maxInt64 = 0x7fffffffffffffff;
   static const _minInt64 = -_maxInt64 - 1;
 
-  static const _int64UnsignedOverflowLimit = 0xfffffffff;
-  static const _int64UnsignedSmiOverflowLimit = 0xfffffff;
+  static const _int64UnsignedOverflowLimits = const [0xfffffffff, 0xf];
+  static const _int64UnsignedSmiOverflowLimits = const [
+    0xfffffff,
+    0xfffffffffffffff
+  ];
 
   /// In the `--limit-ints-to-64-bits` mode calculation of the expression
   ///
diff --git a/runtime/lib/internal_patch.dart b/runtime/lib/internal_patch.dart
index dc6b038..fb640c3 100644
--- a/runtime/lib/internal_patch.dart
+++ b/runtime/lib/internal_patch.dart
@@ -93,11 +93,12 @@
   }
 }
 
-// Prepend the parent type arguments (maybe null) to the function type
-// arguments (may be null). The result is null if both input vectors are null
-// or is a newly allocated and canonicalized vector of length 'len'.
-_prependTypeArguments(functionTypeArguments, parentTypeArguments, len)
-    native "Internal_prependTypeArguments";
+// Prepend the parent type arguments (maybe null) of length 'parentLen' to the
+// function type arguments (may be null). The result is null if both input
+// vectors are null or is a newly allocated and canonicalized vector of length
+// 'totalLen'.
+_prependTypeArguments(functionTypeArguments, parentTypeArguments, parentLen,
+    totalLen) native "Internal_prependTypeArguments";
 
 // Called by IRRegExpMacroAssembler::GrowStack.
 Int32List _growRegExpStack(Int32List stack) {
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 8783fee..362842d 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -34,7 +34,9 @@
 
   const Object& result = Object::Handle(DartLibraryCalls::InstanceCreate(
       mirrors_lib, mirror_class_name, constructor_name, constructor_arguments));
-  ASSERT(!result.IsError());
+  if (result.IsError()) {
+    Exceptions::PropagateError(Error::Cast(result));
+  }
   return Instance::Cast(result).raw();
 }
 
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index 6ee28f1..4688f63 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -4,13 +4,11 @@
 
 // part of "mirrors_patch.dart";
 
-var _dirty = false;
-// Note: _emtpyList needs to be assignable to List<T> for any T hence Null.
-final _emptyList = new UnmodifiableListView<Null>([]);
+var _dirty = false; // Set to true by the VM when more libraries are loaded.
 
-class _InternalMirrorError {
+class _InternalMirrorError extends Error {
   final String _msg;
-  const _InternalMirrorError(this._msg);
+  _InternalMirrorError(this._msg);
   String toString() => _msg;
 }
 
@@ -65,13 +63,13 @@
 
 SourceLocation _location(reflectee) native "DeclarationMirror_location";
 
-List _metadata(reflectee) native 'DeclarationMirror_metadata';
+List<dynamic> _metadata(reflectee) native 'DeclarationMirror_metadata';
 
 bool _subtypeTest(Type a, Type b) native 'TypeMirror_subtypeTest';
 
-class _AccessorCacheAssociation {
+class _AccessorCacheAssociation<T extends Function> {
   String key;
-  Function value;
+  T value;
   bool usedSinceGrowth = true;
   _AccessorCacheAssociation(this.key, this.value);
 }
@@ -82,7 +80,7 @@
  * grow again. Implemented as an open addressing hash table.
  */
 class _AccessorCache<T extends Function> {
-  List table;
+  List<_AccessorCacheAssociation<T>> table;
   int shift;
   int mask;
   int capacity; // Max number of associations before we start evicting/growing.
@@ -94,7 +92,9 @@
   _AccessorCache.withInitialShift(int shift) {
     // The scheme used here for handling collisions relies on there always
     // being at least one empty slot.
-    if (shift < 1) throw new Exception("_AccessorCache requires a shift >= 1");
+    if (shift < 1) {
+      throw new _InternalMirrorError("_AccessorCache requires a shift >= 1");
+    }
     initWithShift(shift);
   }
 
@@ -102,7 +102,7 @@
     this.shift = shift;
     this.mask = (1 << shift) - 1;
     this.capacity = (1 << shift) * 3 ~/ 4;
-    this.table = new List(1 << shift);
+    this.table = new List<_AccessorCacheAssociation<T>>(1 << shift);
     assert(table.length > capacity);
   }
 
@@ -118,7 +118,7 @@
     } while (index != start);
     // Should never happen because we start evicting associations before the
     // table is full.
-    throw new Exception("Internal error: _AccessorCache table full");
+    throw new _InternalMirrorError("Internal error: _AccessorCache table full");
   }
 
   int scanForEmpty(String key) {
@@ -132,7 +132,7 @@
     } while (index != start);
     // Should never happen because we start evicting associations before the
     // table is full.
-    throw new Exception("Internal error: _AccessorCache table full");
+    throw new _InternalMirrorError("Internal error: _AccessorCache table full");
   }
 
   void fixCollisionsAfter(int start) {
@@ -218,16 +218,19 @@
   var _libraries;
   Map<Uri, LibraryMirror> get libraries {
     if ((_libraries == null) || _dirty) {
-      _libraries = new Map<Uri, LibraryMirror>.fromIterable(_computeLibraries(),
-          key: (e) => e.uri);
+      _libraries = new Map<Uri, LibraryMirror>();
+      for (LibraryMirror lib in _computeLibraries()) {
+        _libraries[lib.uri] = lib;
+      }
+      _libraries = new UnmodifiableMapView<Uri, LibraryMirror>(_libraries);
       _dirty = false;
     }
     return _libraries;
   }
 
-  static _computeLibraries() native "MirrorSystem_libraries";
+  static List<dynamic> _computeLibraries() native "MirrorSystem_libraries";
 
-  var _isolate;
+  IsolateMirror _isolate;
   IsolateMirror get isolate {
     if (_isolate == null) {
       _isolate = _computeIsolate();
@@ -235,7 +238,7 @@
     return _isolate;
   }
 
-  static _computeIsolate() native "MirrorSystem_isolate";
+  static IsolateMirror _computeIsolate() native "MirrorSystem_isolate";
 
   String toString() => "MirrorSystem for isolate '${isolate.debugName}'";
 }
@@ -298,13 +301,13 @@
 
   TypeMirror get returnType => _target.type;
   List<ParameterMirror> get parameters {
-    if (isGetter) return _emptyList;
-    return new UnmodifiableListView(
-        [new _SyntheticSetterParameter(this, this._target)]);
+    if (isGetter) return const <ParameterMirror>[];
+    return new UnmodifiableListView<ParameterMirror>(
+        <ParameterMirror>[new _SyntheticSetterParameter(this, this._target)]);
   }
 
   SourceLocation get location => null;
-  List<InstanceMirror> get metadata => _emptyList;
+  List<InstanceMirror> get metadata => const <InstanceMirror>[];
   String get source => null;
 }
 
@@ -328,7 +331,7 @@
   bool get hasDefaultValue => false;
   InstanceMirror get defaultValue => null;
   SourceLocation get location => null;
-  List<InstanceMirror> get metadata => _emptyList;
+  List<InstanceMirror> get metadata => const <InstanceMirror>[];
 }
 
 abstract class _LocalObjectMirror extends _LocalMirror implements ObjectMirror {
@@ -608,7 +611,7 @@
     return _simpleName;
   }
 
-  Symbol _qualifiedName = null;
+  Symbol _qualifiedName;
   Symbol get qualifiedName {
     if (_qualifiedName == null) {
       _qualifiedName = _computeQualifiedName(owner, simpleName);
@@ -658,8 +661,8 @@
       _superinterfaces = isOriginalDeclaration
           ? _nativeInterfaces(_reflectedType)
           : _nativeInterfacesInstantiated(_reflectedType);
-      _superinterfaces =
-          new UnmodifiableListView(_superinterfaces.map(reflectType));
+      _superinterfaces = new UnmodifiableListView<ClassMirror>(
+          _superinterfaces.map(reflectType));
     }
     return _superinterfaces;
   }
@@ -787,10 +790,12 @@
     return true;
   }
 
-  List<TypeVariableMirror> _typeVariables = null;
+  List<TypeVariableMirror> _typeVariables;
   List<TypeVariableMirror> get typeVariables {
     if (_typeVariables == null) {
-      if (_isAnonymousMixinApplication) return _typeVariables = _emptyList;
+      if (_isAnonymousMixinApplication) {
+        return _typeVariables = const <TypeVariableMirror>[];
+      }
       _typeVariables = new List<TypeVariableMirror>();
 
       List params = _ClassMirror_type_variables(_reflectee);
@@ -800,19 +805,20 @@
         mirror = new _LocalTypeVariableMirror(params[i + 1], params[i], owner);
         _typeVariables.add(mirror);
       }
-      _typeVariables = new UnmodifiableListView(_typeVariables);
+      _typeVariables =
+          new UnmodifiableListView<TypeVariableMirror>(_typeVariables);
     }
     return _typeVariables;
   }
 
-  List<TypeMirror> _typeArguments = null;
+  List<TypeMirror> _typeArguments;
   List<TypeMirror> get typeArguments {
     if (_typeArguments == null) {
       if (_isGenericDeclaration || _isAnonymousMixinApplication) {
-        _typeArguments = _emptyList;
+        _typeArguments = const <TypeMirror>[];
       } else {
-        _typeArguments =
-            new UnmodifiableListView(_computeTypeArguments(_reflectedType));
+        _typeArguments = new UnmodifiableListView<TypeMirror>(
+            _computeTypeArguments(_reflectedType).cast<TypeMirror>());
       }
     }
     return _typeArguments;
@@ -856,7 +862,8 @@
   List<InstanceMirror> get metadata {
     // Get the metadata objects, convert them into InstanceMirrors using
     // reflect() and then make them into a Dart list.
-    return new UnmodifiableListView(_metadata(_reflectee).map(reflect));
+    return new UnmodifiableListView<InstanceMirror>(
+        _metadata(_reflectee).map(reflect));
   }
 
   bool operator ==(other) {
@@ -895,26 +902,28 @@
     return false;
   }
 
-  static _libraryUri(reflectee) native "ClassMirror_libraryUri";
+  static String _libraryUri(reflectee) native "ClassMirror_libraryUri";
 
-  static _supertype(reflectedType) native "ClassMirror_supertype";
+  static Type _supertype(reflectedType) native "ClassMirror_supertype";
 
-  static _supertypeInstantiated(reflectedType)
+  static Type _supertypeInstantiated(reflectedType)
       native "ClassMirror_supertype_instantiated";
 
-  static _nativeInterfaces(reflectedType) native "ClassMirror_interfaces";
+  static List<dynamic> _nativeInterfaces(reflectedType)
+      native "ClassMirror_interfaces";
 
-  static _nativeInterfacesInstantiated(reflectedType)
+  static List<dynamic> _nativeInterfacesInstantiated(reflectedType)
       native "ClassMirror_interfaces_instantiated";
 
-  static _nativeMixin(reflectedType) native "ClassMirror_mixin";
+  static Type _nativeMixin(reflectedType) native "ClassMirror_mixin";
 
-  static _nativeMixinInstantiated(reflectedType, instantiator)
+  static Type _nativeMixinInstantiated(reflectedType, instantiator)
       native "ClassMirror_mixin_instantiated";
 
-  _computeMembers(reflectee, instantiator) native "ClassMirror_members";
+  List<dynamic> _computeMembers(reflectee, instantiator)
+      native "ClassMirror_members";
 
-  _computeConstructors(reflectee, instantiator)
+  List<dynamic> _computeConstructors(reflectee, instantiator)
       native "ClassMirror_constructors";
 
   _invoke(reflectee, memberName, arguments, argumentNames)
@@ -927,10 +936,11 @@
   static _invokeConstructor(reflectee, type, constructorName, arguments,
       argumentNames) native 'ClassMirror_invokeConstructor';
 
-  static _ClassMirror_type_variables(reflectee)
+  static List<dynamic> _ClassMirror_type_variables(reflectee)
       native "ClassMirror_type_variables";
 
-  static _computeTypeArguments(reflectee) native "ClassMirror_type_arguments";
+  static List<dynamic> _computeTypeArguments(reflectee)
+      native "ClassMirror_type_arguments";
 }
 
 class _LocalFunctionTypeMirror extends _LocalClassMirror
@@ -943,7 +953,7 @@
   bool get _isAnonymousMixinApplication => false;
 
   // FunctionTypeMirrors have a simpleName generated from their signature.
-  Symbol _simpleName = null;
+  Symbol _simpleName;
   Symbol get simpleName {
     if (_simpleName == null) {
       _simpleName = _s(_makeSignatureString(returnType, parameters));
@@ -959,7 +969,7 @@
     return _callMethod;
   }
 
-  TypeMirror _returnType = null;
+  TypeMirror _returnType;
   TypeMirror get returnType {
     if (_returnType == null) {
       _returnType =
@@ -968,20 +978,20 @@
     return _returnType;
   }
 
-  List<ParameterMirror> _parameters = null;
+  List<ParameterMirror> _parameters;
   List<ParameterMirror> get parameters {
     if (_parameters == null) {
       _parameters = _FunctionTypeMirror_parameters(_functionReflectee);
-      _parameters = new UnmodifiableListView(_parameters);
+      _parameters = new UnmodifiableListView<ParameterMirror>(_parameters);
     }
     return _parameters;
   }
 
   bool get isOriginalDeclaration => true;
   ClassMirror get originalDeclaration => this;
-  get typeVariables => _emptyList;
-  get typeArguments => _emptyList;
-  get metadata => _emptyList;
+  get typeVariables => const <TypeVariableMirror>[];
+  get typeArguments => const <TypeMirror>[];
+  get metadata => const <InstanceMirror>[];
   get location => null;
 
   String toString() => "FunctionTypeMirror on '${_n(simpleName)}'";
@@ -992,7 +1002,7 @@
   static Type _FunctionTypeMirror_return_type(functionReflectee)
       native "FunctionTypeMirror_return_type";
 
-  List<ParameterMirror> _FunctionTypeMirror_parameters(functionReflectee)
+  List<dynamic> _FunctionTypeMirror_parameters(functionReflectee)
       native "FunctionTypeMirror_parameters";
 }
 
@@ -1005,7 +1015,7 @@
 
   Symbol get simpleName => _simpleName;
 
-  Symbol _qualifiedName = null;
+  Symbol _qualifiedName;
   Symbol get qualifiedName {
     if (_qualifiedName == null) {
       _qualifiedName = _computeQualifiedName(owner, simpleName);
@@ -1022,7 +1032,8 @@
   List<InstanceMirror> get metadata {
     // Get the metadata objects, convert them into InstanceMirrors using
     // reflect() and then make them into a Dart list.
-    return new UnmodifiableListView(_metadata(_reflectee).map(reflect));
+    return new UnmodifiableListView<InstanceMirror>(
+        _metadata(_reflectee).map(reflect));
   }
 
   bool operator ==(other) {
@@ -1050,7 +1061,7 @@
   bool get isStatic => false;
   bool get isTopLevel => false;
 
-  TypeMirror _upperBound = null;
+  TypeMirror _upperBound;
   TypeMirror get upperBound {
     if (_upperBound == null) {
       _upperBound = reflectType(_TypeVariableMirror_upper_bound(_reflectee));
@@ -1065,8 +1076,8 @@
 
   Type get _reflectedType => _reflectee;
 
-  List<TypeVariableMirror> get typeVariables => _emptyList;
-  List<TypeMirror> get typeArguments => _emptyList;
+  List<TypeVariableMirror> get typeVariables => const <TypeVariableMirror>[];
+  List<TypeMirror> get typeArguments => const <TypeMirror>[];
 
   bool get isOriginalDeclaration => true;
   TypeMirror get originalDeclaration => this;
@@ -1124,7 +1135,7 @@
     return _owner;
   }
 
-  _LocalFunctionTypeMirror _referent = null;
+  _LocalFunctionTypeMirror _referent;
   FunctionTypeMirror get referent {
     if (_referent == null) {
       _referent = _nativeReferent(_reflectedType);
@@ -1152,7 +1163,7 @@
     }
   }
 
-  List<TypeVariableMirror> _typeVariables = null;
+  List<TypeVariableMirror> _typeVariables;
   List<TypeVariableMirror> get typeVariables {
     if (_typeVariables == null) {
       _typeVariables = new List<TypeVariableMirror>();
@@ -1167,14 +1178,15 @@
     return _typeVariables;
   }
 
-  List<TypeMirror> _typeArguments = null;
+  List<TypeMirror> _typeArguments;
   List<TypeMirror> get typeArguments {
     if (_typeArguments == null) {
       if (_isGenericDeclaration) {
-        _typeArguments = _emptyList;
+        _typeArguments = const <TypeMirror>[];
       } else {
-        _typeArguments = new UnmodifiableListView(
-            _LocalClassMirror._computeTypeArguments(_reflectedType));
+        _typeArguments = new UnmodifiableListView<TypeMirror>(_LocalClassMirror
+            ._computeTypeArguments(_reflectedType)
+            .cast<TypeMirror>());
       }
     }
     return _typeArguments;
@@ -1197,9 +1209,11 @@
         _subtypeTest(otherReflectedType, _reflectedType);
   }
 
-  static _nativeReferent(reflectedType) native "TypedefMirror_referent";
+  static FunctionTypeMirror _nativeReferent(reflectedType)
+      native "TypedefMirror_referent";
 
-  static _nativeDeclaration(reflectedType) native "TypedefMirror_declaration";
+  static TypedefMirror _nativeDeclaration(reflectedType)
+      native "TypedefMirror_declaration";
 }
 
 Symbol _asSetter(Symbol getter, LibraryMirror library) {
@@ -1247,7 +1261,8 @@
   List<InstanceMirror> get metadata {
     // Get the metadata objects, convert them into InstanceMirrors using
     // reflect() and then make them into a Dart list.
-    return new UnmodifiableListView(_metadata(_reflectee).map(reflect));
+    return new UnmodifiableListView<InstanceMirror>(
+        _metadata(_reflectee).map(reflect));
   }
 
   bool operator ==(other) {
@@ -1262,12 +1277,15 @@
   var _cachedLibraryDependencies;
   get libraryDependencies {
     if (_cachedLibraryDependencies == null) {
-      _cachedLibraryDependencies = _libraryDependencies(_reflectee);
+      _cachedLibraryDependencies =
+          new UnmodifiableListView<LibraryDependencyMirror>(
+              _libraryDependencies(_reflectee).cast<LibraryDependencyMirror>());
     }
     return _cachedLibraryDependencies;
   }
 
-  _libraryDependencies(reflectee) native 'LibraryMirror_libraryDependencies';
+  List<dynamic> _libraryDependencies(reflectee)
+      native 'LibraryMirror_libraryDependencies';
 
   _invoke(reflectee, memberName, arguments, argumentNames)
       native 'LibraryMirror_invoke';
@@ -1277,7 +1295,7 @@
   _invokeSetter(reflectee, setterName, value)
       native 'LibraryMirror_invokeSetter';
 
-  _computeMembers(reflectee) native "LibraryMirror_members";
+  List<dynamic> _computeMembers(reflectee) native "LibraryMirror_members";
 }
 
 class _LocalLibraryDependencyMirror extends _LocalMirror
@@ -1297,9 +1315,10 @@
       prefixString,
       this.isImport,
       this.isDeferred,
-      unwrappedMetadata)
+      List<dynamic> unwrappedMetadata)
       : prefix = _s(prefixString),
-        metadata = new UnmodifiableListView(unwrappedMetadata.map(reflect));
+        metadata = new UnmodifiableListView<InstanceMirror>(
+            unwrappedMetadata.map(reflect));
 
   bool get isExport => !isImport;
 
@@ -1324,7 +1343,8 @@
     });
   }
 
-  static _tryUpgradePrefix(libraryPrefix) native "LibraryMirror_fromPrefix";
+  static LibraryMirror _tryUpgradePrefix(libraryPrefix)
+      native "LibraryMirror_fromPrefix";
 
   SourceLocation get location => null;
 }
@@ -1395,7 +1415,7 @@
   bool get isTopLevel => owner is LibraryMirror;
   bool get isSynthetic => false;
 
-  TypeMirror _returnType = null;
+  TypeMirror _returnType;
   TypeMirror get returnType {
     if (_returnType == null) {
       if (isConstructor) {
@@ -1408,18 +1428,18 @@
     return _returnType;
   }
 
-  List<ParameterMirror> _parameters = null;
+  List<ParameterMirror> _parameters;
   List<ParameterMirror> get parameters {
     if (_parameters == null) {
-      _parameters = _MethodMirror_parameters(_reflectee);
-      _parameters = new UnmodifiableListView(_parameters);
+      _parameters = new UnmodifiableListView<ParameterMirror>(
+          _MethodMirror_parameters(_reflectee).cast<ParameterMirror>());
     }
     return _parameters;
   }
 
   bool get isRegularMethod => !isGetter && !isSetter && !isConstructor;
 
-  Symbol _constructorName = null;
+  Symbol _constructorName;
   Symbol get constructorName {
     if (_constructorName == null) {
       if (!isConstructor) {
@@ -1460,7 +1480,7 @@
   static dynamic _MethodMirror_return_type(reflectee, instantiator)
       native "MethodMirror_return_type";
 
-  List<ParameterMirror> _MethodMirror_parameters(reflectee)
+  List<dynamic> _MethodMirror_parameters(reflectee)
       native "MethodMirror_parameters";
 
   static String _MethodMirror_source(reflectee) native "MethodMirror_source";
@@ -1553,11 +1573,12 @@
   }
 
   List<InstanceMirror> get metadata {
-    if (_unmirroredMetadata == null) return _emptyList;
-    return new UnmodifiableListView(_unmirroredMetadata.map(reflect));
+    if (_unmirroredMetadata == null) return const <InstanceMirror>[];
+    return new UnmodifiableListView<InstanceMirror>(
+        _unmirroredMetadata.map(reflect));
   }
 
-  TypeMirror _type = null;
+  TypeMirror _type;
   TypeMirror get type {
     if (_type == null) {
       _type = reflectType(
@@ -1584,7 +1605,7 @@
   DeclarationMirror get owner => null;
 
   SourceLocation get location => null;
-  List<InstanceMirror> get metadata => _emptyList;
+  List<InstanceMirror> get metadata => const <InstanceMirror>[];
 
   bool get hasReflectedType => simpleName == #dynamic;
   Type get reflectedType {
@@ -1592,8 +1613,8 @@
     throw new UnsupportedError("void has no reflected type");
   }
 
-  List<TypeVariableMirror> get typeVariables => _emptyList;
-  List<TypeMirror> get typeArguments => _emptyList;
+  List<TypeVariableMirror> get typeVariables => const <TypeVariableMirror>[];
+  List<TypeMirror> get typeArguments => const <TypeMirror>[];
 
   bool get isOriginalDeclaration => true;
   TypeMirror get originalDeclaration => this;
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index fe0711f..9008f08 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -457,14 +457,15 @@
   return result.raw();
 }
 
-DEFINE_NATIVE_ENTRY(Internal_prependTypeArguments, 3) {
+DEFINE_NATIVE_ENTRY(Internal_prependTypeArguments, 4) {
   const TypeArguments& function_type_arguments =
       TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0));
   const TypeArguments& parent_type_arguments =
       TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(1));
-  GET_NON_NULL_NATIVE_ARGUMENT(Smi, smi_len, arguments->NativeArgAt(2));
-  const intptr_t len = smi_len.Value();
-  return function_type_arguments.Prepend(zone, parent_type_arguments, len);
+  GET_NON_NULL_NATIVE_ARGUMENT(Smi, smi_parent_len, arguments->NativeArgAt(2));
+  GET_NON_NULL_NATIVE_ARGUMENT(Smi, smi_len, arguments->NativeArgAt(3));
+  return function_type_arguments.Prepend(
+      zone, parent_type_arguments, smi_parent_len.Value(), smi_len.Value());
 }
 
 DEFINE_NATIVE_ENTRY(InvocationMirror_unpackTypeArguments, 1) {
diff --git a/runtime/observatory/BUILD.gn b/runtime/observatory/BUILD.gn
index 77571e2..badb8cb 100644
--- a/runtime/observatory/BUILD.gn
+++ b/runtime/observatory/BUILD.gn
@@ -2,9 +2,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("../../build/dart_host_sdk_toolchain.gni")
+import("../../build/dart/dart_host_sdk_toolchain.gni")
+import("../../build/dart/prebuilt_dart_sdk.gni")
 import("../../build/executable_suffix.gni")
-import("../../build/prebuilt_dart_sdk.gni")
 import("observatory_sources.gni")
 
 # Construct arguments to the observatory tool for finding pub.
diff --git a/runtime/observatory/lib/src/elements/function_view.dart b/runtime/observatory/lib/src/elements/function_view.dart
index b11bc3a..a829ded 100644
--- a/runtime/observatory/lib/src/elements/function_view.dart
+++ b/runtime/observatory/lib/src/elements/function_view.dart
@@ -401,8 +401,6 @@
         return 'closure';
       case M.FunctionKind.implicitClosure:
         return 'implicit closure';
-      case M.FunctionKind.convertedClosure:
-        return 'converted closure';
       case M.FunctionKind.getter:
         return 'getter';
       case M.FunctionKind.setter:
diff --git a/runtime/observatory/lib/src/models/objects/function.dart b/runtime/observatory/lib/src/models/objects/function.dart
index 6851759..0d4a997 100644
--- a/runtime/observatory/lib/src/models/objects/function.dart
+++ b/runtime/observatory/lib/src/models/objects/function.dart
@@ -8,7 +8,6 @@
   regular,
   closure,
   implicitClosure,
-  convertedClosure,
   getter,
   setter,
   constructor,
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 29800f7..1fa79a6 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -3056,8 +3056,6 @@
       return M.FunctionKind.closure;
     case 'ImplicitClosureFunction':
       return M.FunctionKind.implicitClosure;
-    case 'ConvertedClosureFunction':
-      return M.FunctionKind.convertedClosure;
     case 'GetterFunction':
       return M.FunctionKind.getter;
     case 'SetterFunction':
diff --git a/runtime/observatory/tests/service/evaluate_async_closure_test.dart b/runtime/observatory/tests/service/evaluate_async_closure_test.dart
new file mode 100644
index 0000000..d014683
--- /dev/null
+++ b/runtime/observatory/tests/service/evaluate_async_closure_test.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.
+// VMOptions=--error_on_bad_type --error_on_bad_override
+
+import 'dart:async';
+
+import 'package:observatory/service_io.dart';
+import 'package:unittest/unittest.dart';
+
+import 'test_helper.dart';
+
+var tests = <IsolateTest>[
+  (Isolate isolate) async {
+    // Silence analyzer on 'dart:async' import.
+    expect(new Future.value(0) != null, isTrue);
+    String test = "(){ "
+        "  var k = () { return Future.value(3); }; "
+        "  var w = () async { return await k(); }; "
+        "  return w(); "
+        "}()";
+    Library lib = await isolate.rootLibrary.load();
+
+    var result = await lib.evaluate(test);
+    expect("$result", equals("Instance(a _Future)"));
+  },
+];
+
+main(args) => runIsolateTests(args, tests);
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index 55035cd..5a699c0 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -7,6 +7,8 @@
 get_isolate_rpc_test: Pass, RuntimeError # Issue 29324
 get_retained_size_rpc_test: Pass, RuntimeError # Issue 28193
 isolate_lifecycle_test: Pass, RuntimeError # Issue 24174
+pause_on_exceptions_test: Pass, RuntimeError # Issue 33049
+pause_on_start_and_exit_with_child_test: Pass, RuntimeError # Issue 33049
 reload_sources_test: Pass, Slow # Reload is slow on the bots
 valid_source_locations_test: Pass, Slow # Generally slow, even in release-x64.
 
diff --git a/runtime/platform/assert.cc b/runtime/platform/assert.cc
index fb7cc88..262548e 100644
--- a/runtime/platform/assert.cc
+++ b/runtime/platform/assert.cc
@@ -10,9 +10,9 @@
 
 namespace dart {
 
-bool DynamicAssertionHelper::failed_ = false;
+bool Expect::failed_ = false;
 
-void DynamicAssertionHelper::Fail(const char* format, ...) {
+void DynamicAssertionHelper::Print(const char* format, va_list arguments) {
   // Take only the last 1KB of the file name if it is longer.
   const intptr_t file_len = strlen(file_);
   const intptr_t file_offset = (file_len > (1 * KB)) ? file_len - (1 * KB) : 0;
@@ -25,22 +25,32 @@
       snprintf(buffer, sizeof(buffer), "%s: %d: error: ", file, line_);
 
   // Print the error message into the buffer.
-  va_list arguments;
-  va_start(arguments, format);
   vsnprintf(buffer + file_and_line_length,
             sizeof(buffer) - file_and_line_length, format, arguments);
-  va_end(arguments);
 
   // Print the buffer on stderr and/or syslog.
   OS::PrintErr("%s\n", buffer);
+}
 
-  // In case of failed assertions, abort right away. Otherwise, wait
-  // until the program is exiting before producing a non-zero exit
+void Assert::Fail(const char* format, ...) {
+  va_list arguments;
+  va_start(arguments, format);
+  Print(format, arguments);
+  va_end(arguments);
+
+  // Abort right away.
+  NOT_IN_PRODUCT(Dart_DumpNativeStackTrace(NULL));
+  OS::Abort();
+}
+
+void Expect::Fail(const char* format, ...) {
+  va_list arguments;
+  va_start(arguments, format);
+  Print(format, arguments);
+  va_end(arguments);
+
+  // Wait until the program is exiting before producing a non-zero exit
   // code through abort.
-  if (kind_ == ASSERT) {
-    NOT_IN_PRODUCT(Dart_DumpNativeStackTrace(NULL));
-    OS::Abort();
-  }
   failed_ = true;
 }
 
diff --git a/runtime/platform/assert.h b/runtime/platform/assert.h
index 1b01b73..48d1443 100644
--- a/runtime/platform/assert.h
+++ b/runtime/platform/assert.h
@@ -26,15 +26,34 @@
 
 class DynamicAssertionHelper {
  public:
-  enum Kind { ASSERT, EXPECT };
+  DynamicAssertionHelper(const char* file, int line)
+      : file_(file), line_(line) {}
 
-  DynamicAssertionHelper(const char* file, int line, Kind kind)
-      : file_(file), line_(line), kind_(kind) {}
+ protected:
+  void Print(const char* format, va_list arguments);
+
+  const char* const file_;
+  const int line_;
+
+  DISALLOW_IMPLICIT_CONSTRUCTORS(DynamicAssertionHelper);
+};
+
+class Assert : public DynamicAssertionHelper {
+ public:
+  Assert(const char* file, int line) : DynamicAssertionHelper(file, line) {}
+
+  DART_NORETURN void Fail(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
+
+  template <typename T>
+  T NotNull(const T p);
+};
+
+class Expect : public DynamicAssertionHelper {
+ public:
+  Expect(const char* file, int line) : DynamicAssertionHelper(file, line) {}
 
   void Fail(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
 
-  static bool failed() { return failed_; }
-
 #if defined(TESTING)
   template <typename E, typename A>
   void Equals(const E& expected, const A& actual);
@@ -65,38 +84,29 @@
 
   template <typename E, typename A>
   void GreaterEqual(const E& left, const A& right);
-#endif
 
   template <typename T>
   T NotNull(const T p);
+#endif
+
+  static bool failed() { return failed_; }
 
  private:
   static bool failed_;
-
-  const char* const file_;
-  const int line_;
-  const Kind kind_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(DynamicAssertionHelper);
 };
 
-class Assert : public DynamicAssertionHelper {
- public:
-  Assert(const char* file, int line)
-      : DynamicAssertionHelper(file, line, ASSERT) {}
-};
-
-class Expect : public DynamicAssertionHelper {
- public:
-  Expect(const char* file, int line)
-      : DynamicAssertionHelper(file, line, EXPECT) {}
-};
+template <typename T>
+T Assert::NotNull(const T p) {
+  if (p != NULL) return p;
+  Fail("expected: not NULL, found NULL");
+  return NULL;
+}
 
 #if defined(TESTING)
 // Only allow the expensive (with respect to code size) assertions
 // in testing code.
 template <typename E, typename A>
-void DynamicAssertionHelper::Equals(const E& expected, const A& actual) {
+void Expect::Equals(const E& expected, const A& actual) {
   if (actual == expected) return;
   std::ostringstream ess, ass;
   ess << expected;
@@ -106,7 +116,7 @@
 }
 
 template <typename E, typename A>
-void DynamicAssertionHelper::NotEquals(const E& not_expected, const A& actual) {
+void Expect::NotEquals(const E& not_expected, const A& actual) {
   if (actual != not_expected) return;
   std::ostringstream ness;
   ness << not_expected;
@@ -115,9 +125,7 @@
 }
 
 template <typename E, typename A, typename T>
-void DynamicAssertionHelper::FloatEquals(const E& expected,
-                                         const A& actual,
-                                         const T& tol) {
+void Expect::FloatEquals(const E& expected, const A& actual, const T& tol) {
   if (((expected - tol) <= actual) && (actual <= (expected + tol))) {
     return;
   }
@@ -131,8 +139,8 @@
 }
 
 template <typename E, typename A>
-NO_SANITIZE_MEMORY void DynamicAssertionHelper::StringEquals(const E& expected,
-                                                             const A& actual) {
+NO_SANITIZE_MEMORY void Expect::StringEquals(const E& expected,
+                                             const A& actual) {
   std::ostringstream ess, ass;
   ess << expected;
   ass << actual;
@@ -142,8 +150,8 @@
 }
 
 template <typename E, typename A>
-NO_SANITIZE_MEMORY void DynamicAssertionHelper::IsSubstring(const E& needle,
-                                                            const A& haystack) {
+NO_SANITIZE_MEMORY void Expect::IsSubstring(const E& needle,
+                                            const A& haystack) {
   std::ostringstream ess, ass;
   ess << needle;
   ass << haystack;
@@ -154,9 +162,8 @@
 }
 
 template <typename E, typename A>
-NO_SANITIZE_MEMORY void DynamicAssertionHelper::IsNotSubstring(
-    const E& needle,
-    const A& haystack) {
+NO_SANITIZE_MEMORY void Expect::IsNotSubstring(const E& needle,
+                                               const A& haystack) {
   std::ostringstream ess, ass;
   ess << needle;
   ass << haystack;
@@ -167,7 +174,7 @@
 }
 
 template <typename E, typename A>
-void DynamicAssertionHelper::LessThan(const E& left, const A& right) {
+void Expect::LessThan(const E& left, const A& right) {
   if (left < right) return;
   std::ostringstream ess, ass;
   ess << left;
@@ -177,7 +184,7 @@
 }
 
 template <typename E, typename A>
-void DynamicAssertionHelper::LessEqual(const E& left, const A& right) {
+void Expect::LessEqual(const E& left, const A& right) {
   if (left <= right) return;
   std::ostringstream ess, ass;
   ess << left;
@@ -187,7 +194,7 @@
 }
 
 template <typename E, typename A>
-void DynamicAssertionHelper::GreaterThan(const E& left, const A& right) {
+void Expect::GreaterThan(const E& left, const A& right) {
   if (left > right) return;
   std::ostringstream ess, ass;
   ess << left;
@@ -197,7 +204,7 @@
 }
 
 template <typename E, typename A>
-void DynamicAssertionHelper::GreaterEqual(const E& left, const A& right) {
+void Expect::GreaterEqual(const E& left, const A& right) {
   if (left >= right) return;
   std::ostringstream ess, ass;
   ess << left;
@@ -205,14 +212,14 @@
   std::string es = ess.str(), as = ass.str();
   Fail("expected: %s >= %s", es.c_str(), as.c_str());
 }
-#endif
 
 template <typename T>
-T DynamicAssertionHelper::NotNull(const T p) {
+T Expect::NotNull(const T p) {
   if (p != NULL) return p;
   Fail("expected: not NULL, found NULL");
   return NULL;
 }
+#endif
 
 }  // namespace dart
 
diff --git a/runtime/platform/atomic_android.h b/runtime/platform/atomic_android.h
index 8178d6e..42dda56 100644
--- a/runtime/platform/atomic_android.h
+++ b/runtime/platform/atomic_android.h
@@ -28,6 +28,9 @@
 }
 
 inline void AtomicOperations::IncrementInt64By(int64_t* p, int64_t value) {
+  // Some ARM implementations require 8-byte alignment for atomic access but
+  // not non-atomic access.
+  ASSERT((reinterpret_cast<uword>(p) % 8) == 0);
   __sync_fetch_and_add(p, value);
 }
 
diff --git a/runtime/platform/atomic_linux.h b/runtime/platform/atomic_linux.h
index 627bc9f..3db8d73 100644
--- a/runtime/platform/atomic_linux.h
+++ b/runtime/platform/atomic_linux.h
@@ -28,6 +28,9 @@
 }
 
 inline void AtomicOperations::IncrementInt64By(int64_t* p, int64_t value) {
+  // Some ARM implementations require 8-byte alignment for atomic access but
+  // not non-atomic access.
+  ASSERT((reinterpret_cast<uword>(p) % 8) == 0);
   __sync_fetch_and_add(p, value);
 }
 
diff --git a/runtime/platform/atomic_macos.h b/runtime/platform/atomic_macos.h
index e8c1545..b08ba4f 100644
--- a/runtime/platform/atomic_macos.h
+++ b/runtime/platform/atomic_macos.h
@@ -28,6 +28,9 @@
 }
 
 inline void AtomicOperations::IncrementInt64By(int64_t* p, int64_t value) {
+  // Some ARM implementations require 8-byte alignment for atomic access but
+  // not non-atomic access.
+  ASSERT((reinterpret_cast<uword>(p) % 8) == 0);
   __sync_fetch_and_add(p, value);
 }
 
diff --git a/runtime/platform/utils.cc b/runtime/platform/utils.cc
index c53af65..205cafc 100644
--- a/runtime/platform/utils.cc
+++ b/runtime/platform/utils.cc
@@ -78,8 +78,10 @@
   switch (size) {
     case 3:
       hash ^= cursor[2] << 16;
+      /* Falls through. */
     case 2:
       hash ^= cursor[1] << 8;
+      /* Falls through. */
     case 1:
       hash ^= cursor[0];
       hash *= M;
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 4c98cc9..1c25d3c 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -9,6 +9,7 @@
 cc/Fail0: Fail # These tests are expected to crash on all platforms.
 cc/Fail1: Fail # These tests are expected to crash on all platforms.
 cc/Fail2: Fail # These tests are expected to crash on all platforms.
+cc/IsolateReload_ChangeInstanceFormat9: Fail, Crash # issue 32942
 cc/IsolateReload_PendingConstructorCall_AbstractToConcrete: Fail, Crash # Issue 32981. Fails on non-Windows, crashes on Windows (because of test.py special handline)
 cc/IsolateReload_PendingConstructorCall_ConcreteToAbstract: Fail, Crash # Issue 32981. Fails on non-Windows, crashes on Windows (because of test.py special handline)
 cc/IsolateReload_PendingStaticCall_DefinedToNSM: Fail # Issue 32981
@@ -46,8 +47,8 @@
 dart/wrap_around_in_range_analysis_test: SkipByDesign # The test requires int64.
 
 [ $compiler == dartk ]
-cc/DartAPI_New: Fail
-cc/DartAPI_TypeGetParameterizedTypes: Crash
+cc/DartAPI_New: Fail # Issue #33041
+cc/DartAPI_TypeGetParameterizedTypes: Crash # Issue 33042
 dart/redirection_type_shuffling_test/00: RuntimeError
 dart/redirection_type_shuffling_test/none: RuntimeError
 
@@ -147,8 +148,7 @@
 [ $compiler == dartk && $runtime == vm ]
 cc/Class_ComputeEndTokenPos: Crash
 cc/DartAPI_IsolateShutdownRunDartCode: Skip # Flaky
-cc/DartAPI_LazyLoadDeoptimizes: Fail
-cc/DartAPI_LoadLibrary: Crash
+cc/DartAPI_LoadLibrary: Crash # Issue 33048.
 cc/DebuggerAPI_BreakpointStubPatching: Fail
 cc/DebuggerAPI_GetClosureInfo: Fail
 cc/DebuggerAPI_InterruptIsolate: SkipSlow
@@ -203,8 +203,6 @@
 cc/Service_Code: Fail
 
 [ $compiler == dartk && $strong ]
-cc/DartAPI_ImportLibrary3: Fail # Issue 32190
-cc/DartAPI_LazyLoadDeoptimizes: Crash # Issue 32190
 cc/DartGeneratedArrayLiteralMessages: Crash # Issue 32190
 cc/FullSnapshot1: Crash # Issue 32190
 cc/IsolateReload_LibraryImportAdded: Crash # Issue 32190
@@ -294,6 +292,7 @@
 [ $compiler == dartk || $compiler == dartkp ]
 cc/CanonicalizationInScriptSnapshots: SkipByDesign # Script snapshots unsupported.
 cc/DartAPI_IsolateSetCheckedMode: SkipByDesign # Checked mode is not relevant for dart 2?
+cc/DartAPI_LazyLoadDeoptimizes: SkipByDesign # Issue 33043, Dart_LoadSource unsupported.
 cc/DartAPI_LoadLibraryPatch_Error1: SkipByDesign # Dart_LibraryLoadPatch unsupported.
 cc/DartAPI_LoadLibraryPatch_Error2: SkipByDesign
 cc/DartAPI_LoadLibraryPatch_Error3: SkipByDesign
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index 5a14a55..69e3168 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -3,7 +3,6 @@
 # BSD-style license that can be found in the LICENSE file.
 
 import("../../build/executable_suffix.gni")
-import("../../build/prebuilt_dart_sdk.gni")
 import("../../sdk/lib/async/async_sources.gni")
 import("../../sdk/lib/collection/collection_sources.gni")
 import("../../sdk/lib/convert/convert_sources.gni")
diff --git a/runtime/vm/ast.cc b/runtime/vm/ast.cc
index e7e74bc..08def4b 100644
--- a/runtime/vm/ast.cc
+++ b/runtime/vm/ast.cc
@@ -314,7 +314,7 @@
           this->right()->AsLiteralNode()->literal().IsNull()) {
         return false;
       }
-    // Fall-through intentional.
+      /* Falls through */
     case Token::kADD:
     case Token::kSUB:
     case Token::kMUL:
@@ -353,7 +353,7 @@
       if (left_val->IsString()) {
         return right_val->IsString() ? left_val : NULL;
       }
-    // Fall-through intentional.
+      /* Falls through */
     case Token::kSUB:
     case Token::kMUL:
     case Token::kDIV:
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index 4fc6436..ddce675 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -289,11 +289,13 @@
   args[0] = Dart_NewInteger(kNumIterations);
 
   // Warmup first to avoid compilation jitters.
-  Dart_Invoke(lib, NewString("benchmark"), 1, args);
+  result = Dart_Invoke(lib, NewString("benchmark"), 1, args);
+  EXPECT_VALID(result);
 
   Timer timer(true, "UseDartApi benchmark");
   timer.Start();
-  Dart_Invoke(lib, NewString("benchmark"), 1, args);
+  result = Dart_Invoke(lib, NewString("benchmark"), 1, args);
+  EXPECT_VALID(result);
   timer.Stop();
   int64_t elapsed_time = timer.TotalElapsedTime();
   benchmark->set_score(elapsed_time);
@@ -554,7 +556,8 @@
 
   Timer timer(true, "currentMirrorSystem() benchmark");
   timer.Start();
-  Dart_Invoke(lib, NewString("benchmark"), 0, NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("benchmark"), 0, NULL);
+  EXPECT_VALID(result);
   timer.Stop();
   int64_t elapsed_time = timer.TotalElapsedTime();
   benchmark->set_score(elapsed_time);
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 753fbd4..b292388 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -315,7 +315,7 @@
   V(Internal_makeFixedListUnmodifiable, 1)                                     \
   V(Internal_inquireIs64Bit, 0)                                                \
   V(Internal_extractTypeArguments, 2)                                          \
-  V(Internal_prependTypeArguments, 3)                                          \
+  V(Internal_prependTypeArguments, 4)                                          \
   V(InvocationMirror_unpackTypeArguments, 1)                                   \
   V(NoSuchMethodError_existingMethodSignature, 3)                              \
   V(LinkedHashMap_getIndex, 1)                                                 \
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 37eea57..29afb6d 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -1914,12 +1914,6 @@
       continue;
     }
 
-    // [kVectorCid] is excluded because it doesn't have a real class,
-    // corresponding to the class id, in Dart source code.
-    if (type.IsType() && type.type_class_id() == kVectorCid) {
-      continue;
-    }
-
     if (type.InVMHeap()) {
       // The only important types in the vm isolate are "dynamic"/"void", which
       // will get their optimized top-type testing stub installed at creation.
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index 5a6a9d1..b0d94c2 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -1069,18 +1069,12 @@
     const Register crn = ConcreteRegister(rn);
     EmitFPIntCvtOp(SCVTFD, static_cast<Register>(vd), crn, kWord);
   }
-  void fcvtzdsx(Register rd, VRegister vn) {
+  void fcvtzds(Register rd, VRegister vn) {
     ASSERT(rd != R31);
     ASSERT(rd != CSP);
     const Register crd = ConcreteRegister(rd);
     EmitFPIntCvtOp(FCVTZDS, crd, static_cast<Register>(vn));
   }
-  void fcvtzdsw(Register rd, VRegister vn) {
-    ASSERT(rd != R31);
-    ASSERT(rd != CSP);
-    const Register crd = ConcreteRegister(rd);
-    EmitFPIntCvtOp(FCVTZDS, crd, static_cast<Register>(vn), kWord);
-  }
   void fmovdd(VRegister vd, VRegister vn) { EmitFPOneSourceOp(FMOVDD, vd, vn); }
   void fabsd(VRegister vd, VRegister vn) { EmitFPOneSourceOp(FABSD, vd, vn); }
   void fnegd(VRegister vd, VRegister vn) { EmitFPOneSourceOp(FNEGD, vd, vn); }
@@ -1371,17 +1365,9 @@
     LslImmediate(dst, src, kSmiTagSize);
   }
 
-  void BranchIfNotSmi(Register reg, Label* label) {
-    ASSERT(kSmiTagMask == 1);
-    ASSERT(kSmiTag == 0);
-    tbnz(label, reg, 0);
-  }
+  void BranchIfNotSmi(Register reg, Label* label) { tbnz(label, reg, kSmiTag); }
 
-  void BranchIfSmi(Register reg, Label* label) {
-    ASSERT(kSmiTagMask == 1);
-    ASSERT(kSmiTag == 0);
-    tbz(label, reg, 0);
-  }
+  void BranchIfSmi(Register reg, Label* label) { tbz(label, reg, kSmiTag); }
 
   void Branch(const StubEntry& stub_entry,
               Register pp,
@@ -1465,11 +1451,6 @@
     kValueCanBeSmi,
   };
 
-  enum CanBeHeapPointer {
-    kValueIsNotHeapPointer,
-    kValueCanBeHeapPointer,
-  };
-
   // Storing into an object.
   void StoreIntoObject(Register object,
                        const Address& dest,
@@ -1611,22 +1592,6 @@
                       Register tmp,
                       OperandSize sz);
 
-  void AssertSmiInRange(
-      Register object,
-      CanBeHeapPointer can_be_heap_pointer = kValueIsNotHeapPointer) {
-#if defined(DEBUG)
-    Label ok;
-    if (can_be_heap_pointer == kValueCanBeHeapPointer) {
-      BranchIfNotSmi(object, &ok);
-    }
-    cmp(object, Operand(object, SXTW, 0));
-    b(&ok, EQ);
-    Stop("Smi out of range");
-
-    Bind(&ok);
-#endif
-  }
-
  private:
   AssemblerBuffer buffer_;  // Contains position independent code.
   ObjectPoolWrapper object_pool_wrapper_;
diff --git a/runtime/vm/compiler/assembler/assembler_arm64_test.cc b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
index 523688b..a41fad24 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
@@ -2576,73 +2576,17 @@
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
 }
 
-ASSEMBLER_TEST_GENERATE(Fcvtzdsx, assembler) {
+ASSEMBLER_TEST_GENERATE(Fcvtzds, assembler) {
   __ LoadDImmediate(V0, 42.0);
-  __ fcvtzdsx(R0, V0);
+  __ fcvtzds(R0, V0);
   __ ret();
 }
 
-ASSEMBLER_TEST_RUN(Fcvtzdsx, test) {
+ASSEMBLER_TEST_RUN(Fcvtzds, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
 }
 
-ASSEMBLER_TEST_GENERATE(Fcvtzdsw, assembler) {
-  __ LoadDImmediate(V0, 42.0);
-  __ fcvtzdsw(R0, V0);
-  __ ret();
-}
-
-ASSEMBLER_TEST_RUN(Fcvtzdsw, test) {
-  typedef int64_t (*Int64Return)() DART_UNUSED;
-  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
-}
-
-ASSEMBLER_TEST_GENERATE(Fcvtzdsx_overflow, assembler) {
-  __ LoadDImmediate(V0, 1e20);
-  __ fcvtzdsx(R0, V0);
-  __ ret();
-}
-
-ASSEMBLER_TEST_RUN(Fcvtzdsx_overflow, test) {
-  typedef int64_t (*Int64Return)() DART_UNUSED;
-  EXPECT_EQ(kMaxInt64, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
-}
-
-ASSEMBLER_TEST_GENERATE(Fcvtzdsx_overflow_negative, assembler) {
-  __ LoadDImmediate(V0, -1e20);
-  __ fcvtzdsx(R0, V0);
-  __ ret();
-}
-
-ASSEMBLER_TEST_RUN(Fcvtzdsx_overflow_negative, test) {
-  typedef int64_t (*Int64Return)() DART_UNUSED;
-  EXPECT_EQ(kMinInt64, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
-}
-
-ASSEMBLER_TEST_GENERATE(Fcvtzdsw_overflow, assembler) {
-  __ LoadDImmediate(V0, 1e10);
-  __ fcvtzdsw(R0, V0);
-  __ ret();
-}
-
-ASSEMBLER_TEST_RUN(Fcvtzdsw_overflow, test) {
-  typedef int64_t (*Int64Return)() DART_UNUSED;
-  EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
-}
-
-ASSEMBLER_TEST_GENERATE(Fcvtzdsw_overflow_negative, assembler) {
-  __ LoadDImmediate(V0, -1e10);
-  __ fcvtzdsw(R0, V0);
-  __ sxtw(R0, R0);
-  __ ret();
-}
-
-ASSEMBLER_TEST_RUN(Fcvtzdsw_overflow_negative, test) {
-  typedef int64_t (*Int64Return)() DART_UNUSED;
-  EXPECT_EQ(kMinInt32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
-}
-
 ASSEMBLER_TEST_GENERATE(Scvtfdx, assembler) {
   __ LoadImmediate(R0, 42);
   __ scvtfdx(V0, R0);
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 5d9375d3..569a962 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -521,10 +521,7 @@
     return CompareImmediate(reg, Immediate(immediate));
   }
 
-  void testl(Register reg, const Immediate& imm) {
-    Immediate imm2(imm.value() & 0xffffffffll);
-    testq(reg, imm2);
-  }
+  void testl(Register reg, const Immediate& imm) { testq(reg, imm); }
   void testb(const Address& address, const Immediate& imm);
 
   void testq(Register reg, const Immediate& imm);
@@ -713,11 +710,6 @@
     kValueCanBeSmi,
   };
 
-  enum CanBeHeapPointer {
-    kValueIsNotHeapPointer,
-    kValueCanBeHeapPointer,
-  };
-
   // Destroys value.
   void StoreIntoObject(Register object,      // Object we are storing into.
                        const Address& dest,  // Where we are storing into.
@@ -948,26 +940,6 @@
                                            Register array,
                                            Register index);
 
-  void AssertSmiInRange(
-      Register object,
-      CanBeHeapPointer can_be_heap_pointer = kValueIsNotHeapPointer) {
-#if defined(DEBUG)
-    Register tmp = object == TMP ? TMP2 : TMP;
-    Label ok;
-    if (can_be_heap_pointer == kValueCanBeHeapPointer) {
-      testl(object, Immediate(kSmiTagMask));
-      ASSERT(kSmiTag == 0);
-      j(ZERO, &ok);
-    }
-    movsxd(tmp, object);
-    cmpq(tmp, object);
-    j(EQUAL, &ok);
-    Stop("Smi out of range");
-
-    Bind(&ok);
-#endif
-  }
-
   static Address VMTagAddress() {
     return Address(THR, Thread::vm_tag_offset());
   }
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index fa6d94a..c0d51f7 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -1585,10 +1585,10 @@
   return Utils::IsPowerOfTwo(Utils::Abs(int_value));
 }
 
-static intptr_t SignificantRepresentationBits(Representation r) {
+static intptr_t RepresentationBits(Representation r) {
   switch (r) {
     case kTagged:
-      return 31;
+      return kBitsPerWord - 1;
     case kUnboxedInt32:
     case kUnboxedUint32:
       return 32;
@@ -1602,7 +1602,7 @@
 
 static int64_t RepresentationMask(Representation r) {
   return static_cast<int64_t>(static_cast<uint64_t>(-1) >>
-                              (64 - SignificantRepresentationBits(r)));
+                              (64 - RepresentationBits(r)));
 }
 
 static bool ToIntegerConstant(Value* value, int64_t* result) {
@@ -2163,8 +2163,7 @@
       break;
 
     case Token::kSHL: {
-      const intptr_t kMaxShift =
-          SignificantRepresentationBits(representation()) - 1;
+      const intptr_t kMaxShift = RepresentationBits(representation()) - 1;
       if (rhs == 0) {
         return left()->definition();
       } else if ((rhs < 0) || (rhs >= kMaxShift)) {
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 62ebc72..2fee1fc 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -3263,7 +3263,10 @@
   CompileType* result_type() const { return result_type_; }
 
   intptr_t result_cid() const {
-    return (result_type_ != NULL) ? result_type_->ToCid() : kDynamicCid;
+    if (result_type_ == NULL) {
+      return kDynamicCid;
+    }
+    return result_type_->ToCid();
   }
 
   PRINT_OPERANDS_TO_SUPPORT
@@ -3759,7 +3762,10 @@
   CompileType* result_type() const { return result_type_; }
 
   intptr_t result_cid() const {
-    return (result_type_ != NULL) ? result_type_->ToCid() : kDynamicCid;
+    if (result_type_ == NULL) {
+      return kDynamicCid;
+    }
+    return result_type_->ToCid();
   }
 
   bool is_known_list_constructor() const { return is_known_list_constructor_; }
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 4f4a097..9c0a698 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -997,13 +997,9 @@
     case kTwoByteStringCid:
     case kExternalOneByteStringCid:
     case kExternalTwoByteStringCid:
-      return CompileType::FromCid(kSmiCid);
-
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      // TODO(erikcorry): Perhaps this can return a faster type.  See
-      // https://github.com/dart-lang/sdk/issues/32582
-      return CompileType::Int();
+      return CompileType::FromCid(kSmiCid);
 
     default:
       UNIMPLEMENTED();
@@ -1277,6 +1273,7 @@
         default:
           UNREACHABLE();
       }
+      __ SmiTag(result);
       break;
     case kTwoByteStringCid:
     case kExternalTwoByteStringCid:
@@ -1290,15 +1287,12 @@
         default:
           UNREACHABLE();
       }
+      __ SmiTag(result);
       break;
     default:
       UNREACHABLE();
       break;
   }
-  if (representation_ == kTagged) {
-    ASSERT(can_pack_into_smi());
-    __ SmiTag(result);
-  }
 }
 
 Representation StoreIndexedInstr::RequiredInputRepresentation(
@@ -2776,27 +2770,18 @@
   if (locs.in(1).IsConstant()) {
     const Object& constant = locs.in(1).constant();
     ASSERT(constant.IsSmi());
-    // Immediate shift operation takes 5 bits for the count.
-    const intptr_t kCountLimit = 0x1F;
-    // These should be around the same size.
-    COMPILE_ASSERT(kCountLimit + 1 == kSmiBits + 2);
+    // Immediate shift operation takes 6 bits for the count.
+    const intptr_t kCountLimit = 0x3F;
     const intptr_t value = Smi::Cast(constant).Value();
     ASSERT((0 < value) && (value < kCountLimit));
     if (shift_left->can_overflow()) {
       // Check for overflow (preserve left).
-      __ LslImmediate(TMP, left, value, kWord);
-      __ cmpw(left, Operand(TMP, ASR, value));
+      __ LslImmediate(TMP, left, value);
+      __ cmp(left, Operand(TMP, ASR, value));
       __ b(deopt, NE);  // Overflow.
     }
-    // Shift for result now we know there is no overflow.  This writes the full
-    // 64 bits of the output register, but unless we are in truncating mode the
-    // top bits will just be sign extension bits.
+    // Shift for result now we know there is no overflow.
     __ LslImmediate(result, left, value);
-    if (shift_left->is_truncating()) {
-      // This preserves the invariant that Smis only use the low 32 bits of the
-      // register, the high bits being sign extension bits.
-      __ sxtw(result, result);
-    }
     return;
   }
 
@@ -2804,33 +2789,28 @@
   const Register right = locs.in(1).reg();
   Range* right_range = shift_left->right_range();
   if (shift_left->left()->BindsToConstant() && shift_left->can_overflow()) {
+    // TODO(srdjan): Implement code below for is_truncating().
     // If left is constant, we know the maximal allowed size for right.
     const Object& obj = shift_left->left()->BoundConstant();
-    // Even though we have a non-Smi constant on the left, we might still emit
-    // a Smi op here.  In that case the Smi check above will have deopted, so
-    // we can't reach this point. Emit a breakpoint to be sure.
-    if (!obj.IsSmi()) {
-      __ Breakpoint();
-      return;
+    if (obj.IsSmi()) {
+      const intptr_t left_int = Smi::Cast(obj).Value();
+      if (left_int == 0) {
+        __ CompareRegisters(right, ZR);
+        __ b(deopt, MI);
+        __ mov(result, ZR);
+        return;
+      }
+      const intptr_t max_right = kSmiBits - Utils::HighestBit(left_int);
+      const bool right_needs_check =
+          !RangeUtils::IsWithin(right_range, 0, max_right - 1);
+      if (right_needs_check) {
+        __ CompareImmediate(right,
+                            reinterpret_cast<int64_t>(Smi::New(max_right)));
+        __ b(deopt, CS);
+      }
+      __ SmiUntag(TMP, right);
+      __ lslv(result, left, TMP);
     }
-    const intptr_t left_int = Smi::Cast(obj).Value();
-    if (left_int == 0) {
-      __ CompareRegisters(right, ZR);
-      __ b(deopt, MI);
-      __ mov(result, ZR);
-      return;
-    }
-    const intptr_t max_right = kSmiBits - Utils::HighestBit(left_int);
-    const bool right_needs_check =
-        !RangeUtils::IsWithin(right_range, 0, max_right - 1);
-    if (right_needs_check) {
-      __ CompareImmediate(right,
-                          reinterpret_cast<int64_t>(Smi::New(max_right)));
-      __ b(deopt, CS);
-    }
-    __ SmiUntag(TMP, right);
-    __ lslv(result, left, TMP);
-    ASSERT(!shift_left->is_truncating());
     return;
   }
 
@@ -2854,11 +2834,7 @@
       __ SmiUntag(TMP, right);
       __ lslv(result, left, TMP);
     }
-    if (shift_left->is_truncating()) {
-      __ sxtw(result, result);
-    }
   } else {
-    // If we can overflow.
     if (right_needs_check) {
       ASSERT(shift_left->CanDeoptimize());
       __ CompareImmediate(right,
@@ -2866,16 +2842,15 @@
       __ b(deopt, CS);
     }
     // Left is not a constant.
-    // Check if count is too large for handling it inlined.
+    // Check if count too large for handling it inlined.
     __ SmiUntag(TMP, right);
     // Overflow test (preserve left, right, and TMP);
     const Register temp = locs.temp(0).reg();
-    __ lslvw(temp, left, TMP);
-    __ asrvw(TMP2, temp, TMP);
-    __ cmpw(left, Operand(TMP2));
+    __ lslv(temp, left, TMP);
+    __ asrv(TMP2, temp, TMP);
+    __ CompareRegisters(left, TMP2);
     __ b(deopt, NE);  // Overflow.
-    // Shift for result now we know there is no overflow.  This is a 64 bit
-    // operation, so no sign extension is needed.
+    // Shift for result now we know there is no overflow.
     __ lslv(result, left, TMP);
   }
 }
@@ -2956,20 +2931,18 @@
 
   switch (op_kind()) {
     case Token::kADD:
-      __ addsw(result, left, Operand(right));
+      __ adds(result, left, Operand(right));
       __ b(slow_path->entry_label(), VS);
-      __ sxtw(result, result);
       break;
     case Token::kSUB:
-      __ subsw(result, left, Operand(right));
+      __ subs(result, left, Operand(right));
       __ b(slow_path->entry_label(), VS);
-      __ sxtw(result, result);
       break;
     case Token::kMUL:
       __ SmiUntag(TMP, left);
-      __ smull(result, TMP, right);
-      __ AsrImmediate(TMP, result, 31);
-      // TMP: result bits 31-63
+      __ mul(result, TMP, right);
+      __ smulh(TMP, TMP, right);
+      // TMP: result bits 64..127.
       __ cmp(TMP, Operand(result, ASR, 63));
       __ b(slow_path->entry_label(), NE);
       break;
@@ -2994,8 +2967,8 @@
 
       __ SmiUntag(TMP, right);
       __ lslv(result, left, TMP);
-      __ asrvw(TMP2, result, TMP);
-      __ cmp(left, Operand(TMP2, SXTW, 0));
+      __ asrv(TMP2, result, TMP);
+      __ CompareRegisters(left, TMP2);
       __ b(slow_path->entry_label(), NE);  // Overflow.
       break;
     case Token::kSHR:
@@ -3005,8 +2978,6 @@
                           reinterpret_cast<int64_t>(Smi::New(Smi::kBits)));
       __ b(slow_path->entry_label(), CS);
 
-      __ AssertSmiInRange(left);
-      __ AssertSmiInRange(right);
       __ SmiUntag(result, right);
       __ SmiUntag(TMP, left);
       __ asrv(result, TMP, result);
@@ -3016,7 +2987,6 @@
       UNIMPLEMENTED();
   }
   __ Bind(slow_path->exit_label());
-  __ AssertSmiInRange(result, Assembler::kValueCanBeHeapPointer);
 }
 
 class CheckedSmiComparisonSlowPath
@@ -3207,28 +3177,20 @@
       case Token::kADD: {
         if (deopt == NULL) {
           __ AddImmediate(result, left, imm);
-          if (is_truncating()) {
-            __ sxtw(result, result);
-          }
         } else {
-          __ AddImmediateSetFlags(result, left, imm, kWord);
+          __ AddImmediateSetFlags(result, left, imm);
           __ b(deopt, VS);
-          __ sxtw(result, result);
         }
         break;
       }
       case Token::kSUB: {
         if (deopt == NULL) {
           __ AddImmediate(result, left, -imm);
-          if (is_truncating()) {
-            __ sxtw(result, result);
-          }
         } else {
           // Negating imm and using AddImmediateSetFlags would not detect the
-          // overflow when imm == kMinInt32.
-          __ SubImmediateSetFlags(result, left, imm, kWord);
+          // overflow when imm == kMinInt64.
+          __ SubImmediateSetFlags(result, left, imm);
           __ b(deopt, VS);
-          __ sxtw(result, result);
         }
         break;
       }
@@ -3236,14 +3198,12 @@
         // Keep left value tagged and untag right value.
         const intptr_t value = Smi::Cast(constant).Value();
         __ LoadImmediate(TMP, value);
-        __ smull(result, left, TMP);
+        __ mul(result, left, TMP);
         if (deopt != NULL) {
-          __ AsrImmediate(TMP, result, 31);
-          // TMP: result bits 31..63.
+          __ smulh(TMP, left, TMP);
+          // TMP: result bits 64..127.
           __ cmp(TMP, Operand(result, ASR, 63));
           __ b(deopt, NE);
-        } else if (is_truncating()) {
-          __ sxtw(result, result);
         }
         break;
       }
@@ -3254,10 +3214,9 @@
         const intptr_t shift_count =
             Utils::ShiftForPowerOfTwo(Utils::Abs(value)) + kSmiTagSize;
         ASSERT(kSmiTagSize == 1);
-        __ AsrImmediate(TMP, left, 31);  // All 1s or all 0s.
+        __ AsrImmediate(TMP, left, 63);
         ASSERT(shift_count > 1);  // 1, -1 case handled above.
         const Register temp = TMP2;
-        // Adjust so that we round to 0 instead of round down.
         __ add(temp, left, Operand(TMP, LSR, 64 - shift_count));
         ASSERT(shift_count > 0);
         __ AsrImmediate(result, temp, shift_count);
@@ -3292,7 +3251,6 @@
         UNREACHABLE();
         break;
     }
-    __ AssertSmiInRange(result);
     return;
   }
 
@@ -3301,26 +3259,18 @@
     case Token::kADD: {
       if (deopt == NULL) {
         __ add(result, left, Operand(right));
-        if (is_truncating()) {
-          __ sxtw(result, result);
-        }
       } else {
-        __ addsw(result, left, Operand(right));
+        __ adds(result, left, Operand(right));
         __ b(deopt, VS);
-        __ sxtw(result, result);
       }
       break;
     }
     case Token::kSUB: {
       if (deopt == NULL) {
         __ sub(result, left, Operand(right));
-        if (is_truncating()) {
-          __ sxtw(result, result);
-        }
       } else {
-        __ subsw(result, left, Operand(right));
+        __ subs(result, left, Operand(right));
         __ b(deopt, VS);
-        __ sxtw(result, result);
       }
       break;
     }
@@ -3328,13 +3278,10 @@
       __ SmiUntag(TMP, left);
       if (deopt == NULL) {
         __ mul(result, TMP, right);
-        if (is_truncating()) {
-          __ sxtw(result, result);
-        }
       } else {
-        __ smull(result, TMP, right);
-        __ AsrImmediate(TMP, result, 31);
-        // TMP: result bits 31..63.
+        __ mul(result, TMP, right);
+        __ smulh(TMP, TMP, right);
+        // TMP: result bits 64..127.
         __ cmp(TMP, Operand(result, ASR, 63));
         __ b(deopt, NE);
       }
@@ -3369,7 +3316,7 @@
 
       // Check the corner case of dividing the 'MIN_SMI' with -1, in which
       // case we cannot tag the result.
-      __ CompareImmediate(result, 0x40000000LL);
+      __ CompareImmediate(result, 0x4000000000000000LL);
       __ b(deopt, EQ);
       __ SmiTag(result);
       break;
@@ -3414,10 +3361,8 @@
         __ b(deopt, LT);
       }
       __ SmiUntag(TMP, right);
-      // The asrv operation masks the count to 6 bits, but any shift between 31
-      // and 63 gives the same result because 32 bit Smis are stored sign
-      // extended in the registers.
-      const intptr_t kCountLimit = 0x1F;
+      // sarl operation masks the count to 6 bits.
+      const intptr_t kCountLimit = 0x3F;
       if (!RangeUtils::OnlyLessThanOrEqualTo(right_range(), kCountLimit)) {
         __ LoadImmediate(TMP2, kCountLimit);
         __ CompareRegisters(TMP, TMP2);
@@ -3446,7 +3391,6 @@
       UNREACHABLE();
       break;
   }
-  __ AssertSmiInRange(result);
 }
 
 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Zone* zone,
@@ -3599,17 +3543,10 @@
   ASSERT((from_representation() == kUnboxedInt32) ||
          (from_representation() == kUnboxedUint32));
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
+  const intptr_t kNumTemps = 0;
   LocationSummary* summary = new (zone)
-      LocationSummary(zone, kNumInputs, kNumTemps,
-                      ValueFitsSmi() ? LocationSummary::kNoCall
-                                     : LocationSummary::kCallOnSlowPath);
-  // Get two distinct registers for input and output, plus a temp
-  // register for testing for overflow and allocating a Mint.
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  if (!ValueFitsSmi()) {
-    summary->set_temp(0, Location::RequiresRegister());
-  }
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
@@ -3618,51 +3555,16 @@
   Register value = locs()->in(0).reg();
   Register out = locs()->out(0).reg();
   ASSERT(value != out);
-  Label done;
 
+  ASSERT(kSmiTagSize == 1);
+  // TODO(vegorov) implement and use UBFM/SBFM for this.
+  __ LslImmediate(out, value, 32);
   if (from_representation() == kUnboxedInt32) {
-    ASSERT(kSmiTag == 0);
-    // Signed Bitfield Insert in Zero instruction extracts the 31 significant
-    // bits from a Smi.
-    __ sbfiz(out, value, kSmiTagSize, 32 - kSmiTagSize);
-    if (ValueFitsSmi()) {
-      return;
-    }
-    Register temp = locs()->temp(0).reg();
-    __ cmp(out, Operand(value, LSL, 1));
-    __ b(&done, EQ);  // Jump if the sbfiz instruction didn't lose info.
-    BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(), out,
-                                    temp);
-    __ sxtw(temp, value);
+    __ AsrImmediate(out, out, 32 - kSmiTagSize);
   } else {
     ASSERT(from_representation() == kUnboxedUint32);
-    ASSERT(kSmiTag == 0);
-    // A 32 bit positive Smi has one tag bit and one unused sign bit,
-    // leaving only 30 bits for the payload.
-    __ ubfiz(out, value, kSmiTagSize, kSmiBits);
-    if (ValueFitsSmi()) {
-      return;
-    }
-    Register temp = locs()->temp(0).reg();
-    __ TestImmediate(value, 0xc0000000);
-    __ b(&done, EQ);  // Jump if both bits are zero.
-    BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(), out,
-                                    temp);
-    __ ubfiz(temp, value, 0, 32);  // Zero extend word.
+    __ LsrImmediate(out, out, 32 - kSmiTagSize);
   }
-
-  __ StoreToOffset(locs()->temp(0).reg(), out,
-                   Mint::value_offset() - kHeapObjectTag);
-
-#if defined(DEBUG)
-  Label skip_smi_test;
-  __ b(&skip_smi_test);
-  __ Bind(&done);
-  __ AssertSmiInRange(out, Assembler::kValueCanBeHeapPointer);
-  __ Bind(&skip_smi_test);
-#else
-  __ Bind(&done);
-#endif
 }
 
 LocationSummary* BoxInt64Instr::MakeLocationSummary(Zone* zone,
@@ -3690,8 +3592,7 @@
   }
 
   ASSERT(kSmiTag == 0);
-  __ LslImmediate(out, in, kSmiTagSize, kWord);
-  __ sxtw(out, out);
+  __ LslImmediate(out, in, kSmiTagSize);
   Label done;
   __ cmp(in, Operand(out, ASR, kSmiTagSize));
   __ b(&done, EQ);
@@ -4432,9 +4333,8 @@
   switch (op_kind()) {
     case Token::kNEGATE: {
       Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
-      __ subsw(result, ZR, Operand(value));
+      __ subs(result, ZR, Operand(value));
       __ b(deopt, VS);
-      __ sxtw(result, result);
       break;
     }
     case Token::kBIT_NOT:
@@ -4445,7 +4345,6 @@
     default:
       UNREACHABLE();
   }
-  __ AssertSmiInRange(result);
 }
 
 LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Zone* zone,
@@ -4497,7 +4396,7 @@
   const Register value = locs()->in(0).reg();
   const VRegister result = locs()->out(0).fpu_reg();
   __ SmiUntag(TMP, value);
-  __ scvtfdw(result, TMP);
+  __ scvtfdx(result, TMP);
 }
 
 LocationSummary* Int64ToDoubleInstr::MakeLocationSummary(Zone* zone,
@@ -4541,13 +4440,12 @@
   __ fcmpd(VTMP, VTMP);
   __ b(&do_call, VS);
 
-  __ fcvtzdsx(result, VTMP);
+  __ fcvtzds(result, VTMP);
   // Overflow is signaled with minint.
 
   // Check for overflow and that it fits into Smi.
-  __ AsrImmediate(TMP, result, 30);
-  __ cmp(TMP, Operand(result, ASR, 63));
-  __ b(&do_call, NE);
+  __ CompareImmediate(result, 0xC000000000000000);
+  __ b(&do_call, MI);
   __ SmiTag(result);
   __ b(&done);
   __ Bind(&do_call);
@@ -4564,7 +4462,6 @@
                                args_info, locs(), ICData::Handle(),
                                ICData::kStatic);
   __ Bind(&done);
-  __ AssertSmiInRange(result, Assembler::kValueCanBeHeapPointer);
 }
 
 LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Zone* zone,
@@ -4588,13 +4485,11 @@
   __ fcmpd(value, value);
   __ b(deopt, VS);
 
-  __ fcvtzdsx(result, value);
+  __ fcvtzds(result, value);
   // Check for overflow and that it fits into Smi.
-  __ AsrImmediate(TMP, result, 30);
-  __ cmp(TMP, Operand(result, ASR, 63));
-  __ b(deopt, NE);
+  __ CompareImmediate(result, 0xC000000000000000);
+  __ b(deopt, MI);
   __ SmiTag(result);
-  __ AssertSmiInRange(result);
 }
 
 LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Zone* zone,
@@ -4863,7 +4758,7 @@
 
   // Check the corner case of dividing the 'MIN_SMI' with -1, in which
   // case we cannot tag the result.
-  __ CompareImmediate(result_div, 0x40000000);
+  __ CompareImmediate(result_div, 0x4000000000000000);
   __ b(deopt, EQ);
   // result_mod <- left - right * result_div.
   __ msub(result_mod, TMP, result_div, result_mod);
@@ -5392,10 +5287,6 @@
   Register shifter = locs()->in(1).reg();
 
   // TODO(johnmccutchan): Use range information to avoid these checks.
-  // Assert this is a legitimate Smi in debug mode, but does not assert
-  // anything about the range relative to the bit width.
-  __ AssertSmiInRange(shifter);
-
   __ SmiUntag(TMP, shifter);
   __ CompareImmediate(TMP, 0);
   // If shift value is < 0, deoptimize.
@@ -5415,7 +5306,7 @@
 
   __ CompareImmediate(TMP, kShifterLimit);
   // If shift value is > 31, return zero.
-  __ csel(out, ZR, out, GT);
+  __ csel(out, out, ZR, GT);
 }
 
 LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Zone* zone,
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index bf409ff..b44d650 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -1074,13 +1074,11 @@
     case kTwoByteStringCid:
     case kExternalOneByteStringCid:
     case kExternalTwoByteStringCid:
-      return CompileType::FromCid(kSmiCid);
-
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
+      return CompileType::FromCid(kSmiCid);
+
     case kTypedDataInt64ArrayCid:
-      // TODO(erikcorry): Perhaps this can return a faster type.  See
-      // https://github.com/dart-lang/sdk/issues/32582
       return CompileType::Int();
 
     default:
@@ -1263,24 +1261,16 @@
 
 LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
-  const bool might_box = (representation() == kTagged) && !can_pack_into_smi();
   const intptr_t kNumInputs = 2;
-  const intptr_t kNumTemps = might_box ? 2 : 0;
-  LocationSummary* summary = new (zone) LocationSummary(
-      zone, kNumInputs, kNumTemps,
-      might_box ? LocationSummary::kCallOnSlowPath : LocationSummary::kNoCall);
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   // The smi index is either untagged (element size == 1), or it is left smi
   // tagged (for all element sizes > 1).
   summary->set_in(1, index_scale() == 1 ? Location::WritableRegister()
                                         : Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
-
-  if (might_box) {
-    summary->set_temp(0, Location::RequiresRegister());
-    summary->set_temp(1, Location::RequiresRegister());
-  }
-
   return summary;
 }
 
@@ -1312,6 +1302,7 @@
         default:
           UNREACHABLE();
       }
+      __ SmiTag(result);
       break;
     case kTwoByteStringCid:
     case kExternalTwoByteStringCid:
@@ -1325,34 +1316,12 @@
         default:
           UNREACHABLE();
       }
+      __ SmiTag(result);
       break;
     default:
       UNREACHABLE();
       break;
   }
-  if (representation_ == kTagged) {
-    if (can_pack_into_smi()) {
-      __ SmiTag(result);
-    } else {
-      // If the value cannot fit in a smi then allocate a mint box for it.
-      Register temp = locs()->temp(0).reg();
-      Register temp2 = locs()->temp(1).reg();
-      // Temp register needs to be manually preserved on allocation slow-path.
-      locs()->live_registers()->Add(locs()->temp(0), kUnboxedInt32);
-
-      ASSERT(temp != result);
-      __ MoveRegister(temp, result);
-      __ SmiTag(result);
-
-      Label done;
-      __ TestImmediate(temp, Immediate(0xc0000000ll));
-      __ j(ZERO, &done);
-      BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(),
-                                      result, temp2);
-      __ movq(FieldAddress(result, Mint::value_offset()), temp);
-      __ Bind(&done);
-    }
-  }
 }
 
 Representation StoreIndexedInstr::RequiredInputRepresentation(
@@ -2742,32 +2711,27 @@
   if (locs.in(1).IsConstant()) {
     const Object& constant = locs.in(1).constant();
     ASSERT(constant.IsSmi());
-    // shll operation masks the count to 5 bits.
-    const intptr_t kCountLimit = 0x1F;
+    // shlq operation masks the count to 6 bits.
+    const intptr_t kCountLimit = 0x3F;
     const intptr_t value = Smi::Cast(constant).Value();
     ASSERT((0 < value) && (value < kCountLimit));
     if (shift_left->can_overflow()) {
       if (value == 1) {
         // Use overflow flag.
-        __ shll(left, Immediate(1));
+        __ shlq(left, Immediate(1));
         __ j(OVERFLOW, deopt);
-        __ movsxd(left, left);
         return;
       }
       // Check for overflow.
       Register temp = locs.temp(0).reg();
       __ movq(temp, left);
-      __ shll(left, Immediate(value));
-      __ sarl(left, Immediate(value));
-      __ movsxd(left, left);
+      __ shlq(left, Immediate(value));
+      __ sarq(left, Immediate(value));
       __ cmpq(left, temp);
       __ j(NOT_EQUAL, deopt);  // Overflow.
     }
     // Shift for result now we know there is no overflow.
     __ shlq(left, Immediate(value));
-    if (shift_left->is_truncating()) {
-      __ movsxd(left, left);
-    }
     return;
   }
 
@@ -2778,32 +2742,23 @@
     // TODO(srdjan): Implement code below for is_truncating().
     // If left is constant, we know the maximal allowed size for right.
     const Object& obj = shift_left->left()->BoundConstant();
-    // Even though we have a non-Smi constant on the left, we might still emit
-    // a Smi op here.  In that case the Smi check above will have deopted, so
-    // we can't reach this point. Emit a breakpoint to be sure.
-    if (!obj.IsSmi()) {
-      __ int3();
-      return;
-    }
-    const intptr_t left_int = Smi::Cast(obj).Value();
-    if (left_int == 0) {
-      __ CompareImmediate(right, Immediate(0));
-      __ j(NEGATIVE, deopt);
-      return;
-    }
-    const intptr_t max_right = kSmiBits - Utils::HighestBit(left_int);
-    const bool right_needs_check =
-        !RangeUtils::IsWithin(right_range, 0, max_right - 1);
-    if (right_needs_check) {
-      __ CompareImmediate(
-          right, Immediate(reinterpret_cast<int64_t>(Smi::New(max_right))));
-      __ j(ABOVE_EQUAL, deopt);
-    }
-    __ AssertSmiInRange(right);
-    __ SmiUntag(right);
-    __ shlq(left, right);
-    if (shift_left->is_truncating()) {
-      __ movsxd(left, left);
+    if (obj.IsSmi()) {
+      const intptr_t left_int = Smi::Cast(obj).Value();
+      if (left_int == 0) {
+        __ CompareImmediate(right, Immediate(0));
+        __ j(NEGATIVE, deopt);
+        return;
+      }
+      const intptr_t max_right = kSmiBits - Utils::HighestBit(left_int);
+      const bool right_needs_check =
+          !RangeUtils::IsWithin(right_range, 0, max_right - 1);
+      if (right_needs_check) {
+        __ CompareImmediate(
+            right, Immediate(reinterpret_cast<int64_t>(Smi::New(max_right))));
+        __ j(ABOVE_EQUAL, deopt);
+      }
+      __ SmiUntag(right);
+      __ shlq(left, right);
     }
     return;
   }
@@ -2827,18 +2782,13 @@
       __ xorq(left, left);
       __ jmp(&done, Assembler::kNearJump);
       __ Bind(&is_not_zero);
-      __ AssertSmiInRange(right);
       __ SmiUntag(right);
       __ shlq(left, right);
       __ Bind(&done);
     } else {
-      __ AssertSmiInRange(right);
       __ SmiUntag(right);
       __ shlq(left, right);
     }
-    if (shift_left->is_truncating()) {
-      __ movsxd(left, left);
-    }
   } else {
     if (right_needs_check) {
       ASSERT(shift_left->CanDeoptimize());
@@ -2848,18 +2798,16 @@
     }
     // Left is not a constant.
     Register temp = locs.temp(0).reg();
-    // Check if count is too large for handling it inlined.
-    __ movl(temp, left);
-    __ AssertSmiInRange(right);
+    // Check if count too large for handling it inlined.
+    __ movq(temp, left);
     __ SmiUntag(right);
     // Overflow test (preserve temp and right);
-    __ shll(temp, right);
-    __ sarl(temp, right);
-    __ cmpl(temp, left);
+    __ shlq(left, right);
+    __ sarq(left, right);
+    __ cmpq(left, temp);
     __ j(NOT_EQUAL, deopt);  // Overflow.
     // Shift for result now we know there is no overflow.
     __ shlq(left, right);
-    ASSERT(!shift_left->is_truncating());
   }
 }
 
@@ -2959,23 +2907,19 @@
   switch (op_kind()) {
     case Token::kADD:
       __ movq(result, left);
-      __ addl(result, right);
+      __ addq(result, right);
       __ j(OVERFLOW, slow_path->entry_label());
-      __ movsxd(result, result);
       break;
     case Token::kSUB:
       __ movq(result, left);
-      __ subl(result, right);
+      __ subq(result, right);
       __ j(OVERFLOW, slow_path->entry_label());
-      __ movsxd(result, result);
       break;
     case Token::kMUL:
       __ movq(result, left);
-      __ AssertSmiInRange(result);
       __ SmiUntag(result);
-      __ imull(result, right);
+      __ imulq(result, right);
       __ j(OVERFLOW, slow_path->entry_label());
-      __ movsxd(result, result);
       break;
     case Token::kBIT_OR:
       ASSERT(left == result);
@@ -2996,15 +2940,13 @@
       __ j(ABOVE_EQUAL, slow_path->entry_label());
 
       __ movq(RCX, right);
-      __ AssertSmiInRange(RCX);
       __ SmiUntag(RCX);
       __ movq(result, left);
-      __ shll(result, RCX);
+      __ shlq(result, RCX);
       __ movq(TMP, result);
-      __ sarl(TMP, RCX);
-      __ cmpl(TMP, left);
+      __ sarq(TMP, RCX);
+      __ cmpq(TMP, left);
       __ j(NOT_EQUAL, slow_path->entry_label());
-      __ movsxd(result, result);
       break;
     case Token::kSHR: {
       Label shift_count_ok;
@@ -3013,8 +2955,6 @@
       __ cmpq(right, Immediate(Smi::RawValue(Smi::kBits)));
       __ j(ABOVE_EQUAL, slow_path->entry_label());
 
-      __ AssertSmiInRange(left);
-      __ AssertSmiInRange(right);
       __ movq(RCX, right);
       __ SmiUntag(RCX);
       __ movq(result, left);
@@ -3272,41 +3212,20 @@
     const int64_t imm = reinterpret_cast<int64_t>(constant.raw());
     switch (op_kind()) {
       case Token::kADD: {
-        if (deopt != NULL) {
-          __ AddImmediate(left, Immediate(imm), Assembler::k32Bit);
-          __ j(OVERFLOW, deopt);
-        } else {
-          __ AddImmediate(left, Immediate(imm), Assembler::k64Bit);
-        }
-        if (deopt != NULL || is_truncating()) {
-          __ movsxd(left, left);
-        }
+        __ AddImmediate(left, Immediate(imm));
+        if (deopt != NULL) __ j(OVERFLOW, deopt);
         break;
       }
       case Token::kSUB: {
-        if (deopt != NULL) {
-          __ SubImmediate(left, Immediate(imm), Assembler::k32Bit);
-          __ j(OVERFLOW, deopt);
-        } else {
-          __ SubImmediate(left, Immediate(imm), Assembler::k64Bit);
-        }
-        if (deopt != NULL || is_truncating()) {
-          __ movsxd(left, left);
-        }
+        __ SubImmediate(left, Immediate(imm));
+        if (deopt != NULL) __ j(OVERFLOW, deopt);
         break;
       }
       case Token::kMUL: {
         // Keep left value tagged and untag right value.
         const intptr_t value = Smi::Cast(constant).Value();
-        if (deopt != NULL) {
-          __ MulImmediate(left, Immediate(value), Assembler::k32Bit);
-          __ j(OVERFLOW, deopt);
-        } else {
-          __ MulImmediate(left, Immediate(value), Assembler::k64Bit);
-        }
-        if (deopt != NULL || is_truncating()) {
-          __ movsxd(left, left);
-        }
+        __ MulImmediate(left, Immediate(value));
+        if (deopt != NULL) __ j(OVERFLOW, deopt);
         break;
       }
       case Token::kTRUNCDIV: {
@@ -3318,9 +3237,7 @@
         ASSERT(kSmiTagSize == 1);
         Register temp = locs()->temp(0).reg();
         __ movq(temp, left);
-        // Since Smis are sign extended this is enough shift to put all-1s or
-        // all-0s in the temp register.
-        __ sarq(temp, Immediate(31));
+        __ sarq(temp, Immediate(63));
         ASSERT(shift_count > 1);  // 1, -1 case handled above.
         __ shrq(temp, Immediate(64 - shift_count));
         __ addq(left, temp);
@@ -3349,10 +3266,8 @@
       }
 
       case Token::kSHR: {
-        // The sarq operation masks the count to 6 bits, but any shift between
-        // 31 and 63 gives the same result because 32 bit Smis are stored sign
-        // extended in the registers.
-        const intptr_t kCountLimit = 0x1F;
+        // sarq operation masks the count to 6 bits.
+        const intptr_t kCountLimit = 0x3F;
         const intptr_t value = Smi::Cast(constant).Value();
         __ sarq(left,
                 Immediate(Utils::Minimum(value + kSmiTagSize, kCountLimit)));
@@ -3364,7 +3279,6 @@
         UNREACHABLE();
         break;
     }
-    __ AssertSmiInRange(left);
     return;
   }  // locs()->in(1).IsConstant().
 
@@ -3372,40 +3286,19 @@
     const Address& right = locs()->in(1).ToStackSlotAddress();
     switch (op_kind()) {
       case Token::kADD: {
-        if (deopt != NULL) {
-          __ addl(left, right);
-          __ j(OVERFLOW, deopt);
-        } else {
-          __ addq(left, right);
-        }
-        if (deopt != NULL || is_truncating()) {
-          __ movsxd(left, left);
-        }
+        __ addq(left, right);
+        if (deopt != NULL) __ j(OVERFLOW, deopt);
         break;
       }
       case Token::kSUB: {
-        if (deopt != NULL) {
-          __ subl(left, right);
-          __ j(OVERFLOW, deopt);
-        } else {
-          __ subq(left, right);
-        }
-        if (deopt != NULL || is_truncating()) {
-          __ movsxd(left, left);
-        }
+        __ subq(left, right);
+        if (deopt != NULL) __ j(OVERFLOW, deopt);
         break;
       }
       case Token::kMUL: {
         __ SmiUntag(left);
-        if (deopt != NULL) {
-          __ imull(left, right);
-          __ j(OVERFLOW, deopt);
-        } else {
-          __ imulq(left, right);
-        }
-        if (deopt != NULL || is_truncating()) {
-          __ movsxd(left, left);
-        }
+        __ imulq(left, right);
+        if (deopt != NULL) __ j(OVERFLOW, deopt);
         break;
       }
       case Token::kBIT_AND: {
@@ -3434,40 +3327,19 @@
   Register right = locs()->in(1).reg();
   switch (op_kind()) {
     case Token::kADD: {
-      if (deopt != NULL) {
-        __ addl(left, right);
-        __ j(OVERFLOW, deopt);
-      } else {
-        __ addq(left, right);
-      }
-      if (deopt != NULL || is_truncating()) {
-        __ movsxd(left, left);
-      }
+      __ addq(left, right);
+      if (deopt != NULL) __ j(OVERFLOW, deopt);
       break;
     }
     case Token::kSUB: {
-      if (deopt != NULL) {
-        __ subl(left, right);
-        __ j(OVERFLOW, deopt);
-      } else {
-        __ subq(left, right);
-      }
-      if (deopt != NULL || is_truncating()) {
-        __ movsxd(left, left);
-      }
+      __ subq(left, right);
+      if (deopt != NULL) __ j(OVERFLOW, deopt);
       break;
     }
     case Token::kMUL: {
       __ SmiUntag(left);
-      if (deopt != NULL) {
-        __ imull(left, right);
-        __ j(OVERFLOW, deopt);
-      } else {
-        __ imulq(left, right);
-      }
-      if (deopt != NULL || is_truncating()) {
-        __ movsxd(left, left);
-      }
+      __ imulq(left, right);
+      if (deopt != NULL) __ j(OVERFLOW, deopt);
       break;
     }
     case Token::kBIT_AND: {
@@ -3486,6 +3358,8 @@
       break;
     }
     case Token::kTRUNCDIV: {
+      Label not_32bit, done;
+
       Register temp = locs()->temp(0).reg();
       ASSERT(left == RAX);
       ASSERT((right != RDX) && (right != RAX));
@@ -3496,20 +3370,43 @@
         __ testq(right, right);
         __ j(ZERO, deopt);
       }
+      // Check if both operands fit into 32bits as idiv with 64bit operands
+      // requires twice as many cycles and has much higher latency.
+      // We are checking this before untagging them to avoid corner case
+      // dividing INT_MAX by -1 that raises exception because quotient is
+      // too large for 32bit register.
+      __ movsxd(temp, left);
+      __ cmpq(temp, left);
+      __ j(NOT_EQUAL, &not_32bit);
+      __ movsxd(temp, right);
+      __ cmpq(temp, right);
+      __ j(NOT_EQUAL, &not_32bit);
+
       // Both operands are 31bit smis. Divide using 32bit idiv.
       __ SmiUntag(left);
       __ SmiUntag(right);
       __ cdq();
       __ idivl(right);
+      __ movsxd(result, result);
+      __ jmp(&done);
+
+      // Divide using 64bit idiv.
+      __ Bind(&not_32bit);
+      __ SmiUntag(left);
+      __ SmiUntag(right);
+      __ cqo();         // Sign extend RAX -> RDX:RAX.
+      __ idivq(right);  //  RAX: quotient, RDX: remainder.
       // Check the corner case of dividing the 'MIN_SMI' with -1, in which
       // case we cannot tag the result.
-      __ cmpl(result, Immediate(0x40000000));
+      __ CompareImmediate(result, Immediate(0x4000000000000000));
       __ j(EQUAL, deopt);
-      __ movsxd(result, result);
+      __ Bind(&done);
       __ SmiTag(result);
       break;
     }
     case Token::kMOD: {
+      Label not_32bit, div_done;
+
       Register temp = locs()->temp(0).reg();
       ASSERT(left == RDX);
       ASSERT((right != RDX) && (right != RAX));
@@ -3520,6 +3417,17 @@
         __ testq(right, right);
         __ j(ZERO, deopt);
       }
+      // Check if both operands fit into 32bits as idiv with 64bit operands
+      // requires twice as many cycles and has much higher latency.
+      // We are checking this before untagging them to avoid corner case
+      // dividing INT_MAX by -1 that raises exception because quotient is
+      // too large for 32bit register.
+      __ movsxd(temp, left);
+      __ cmpq(temp, left);
+      __ j(NOT_EQUAL, &not_32bit);
+      __ movsxd(temp, right);
+      __ cmpq(temp, right);
+      __ j(NOT_EQUAL, &not_32bit);
       // Both operands are 31bit smis. Divide using 32bit idiv.
       __ SmiUntag(left);
       __ SmiUntag(right);
@@ -3527,7 +3435,16 @@
       __ cdq();
       __ idivl(right);
       __ movsxd(result, result);
+      __ jmp(&div_done);
 
+      // Divide using 64bit idiv.
+      __ Bind(&not_32bit);
+      __ SmiUntag(left);
+      __ SmiUntag(right);
+      __ movq(RAX, RDX);
+      __ cqo();         // Sign extend RAX -> RDX:RAX.
+      __ idivq(right);  //  RAX: quotient, RDX: remainder.
+      __ Bind(&div_done);
       //  res = left % right;
       //  if (res < 0) {
       //    if (right < 0) {
@@ -3565,10 +3482,7 @@
         __ j(LESS, deopt);
       }
       __ SmiUntag(right);
-      // The sarq operation masks the count to 6 bits, but any shift between 31
-      // and 63 gives the same result because 32 bit Smis are stored sign
-      // extended in the registers.  We check for 63 in order to take the branch
-      // more predictably.
+      // sarq operation masks the count to 6 bits.
       const intptr_t kCountLimit = 0x3F;
       if (!RangeUtils::OnlyLessThanOrEqualTo(right_range(), kCountLimit)) {
         __ CompareImmediate(right, Immediate(kCountLimit));
@@ -3781,52 +3695,41 @@
                                        GetDeoptId(), ICData::kDeoptUnboxInteger)
                                  : NULL;
   ASSERT(value == locs()->out(0).reg());
-  Label done_and_no_need_to_check_range;
-
-  ASSERT(locs()->out(0).reg() == value);
 
   if (value_cid == kSmiCid) {
-    __ AssertSmiInRange(value);
     __ SmiUntag(value);
-    return;
   } else if (value_cid == kMintCid) {
     __ movq(value, FieldAddress(value, Mint::value_offset()));
   } else if (!CanDeoptimize()) {
+    // Type information is not conclusive, but range analysis found
+    // the value to be in int64 range. Therefore it must be a smi
+    // or mint value.
+    ASSERT(is_truncating());
     Label done;
     __ SmiUntag(value);
     __ j(NOT_CARRY, &done, Assembler::kNearJump);
-    // Multiply by two in addressing mode because we erroneously
-    // untagged a pointer by dividing it by two.
-    Address value_field(value, TIMES_2, Mint::value_offset());
-    if (is_truncating()) {
-      __ movl(value, value_field);
-      __ movsxd(value, value);
-    } else {
-      __ movq(value, value_field);
-    }
+    __ movq(value, Address(value, TIMES_2, Mint::value_offset()));
     __ Bind(&done);
     return;
   } else {
-    __ SmiUntagOrCheckClass(value, kMintCid, &done_and_no_need_to_check_range);
+    Label done;
+    // Optimistically untag value.
+    __ SmiUntagOrCheckClass(value, kMintCid, &done);
     __ j(NOT_EQUAL, deopt);
-    // Multiply by two in addressing mode because we erroneously
-    // untagged a pointer by dividing it by two.
+    // Undo untagging by multiplying value with 2.
     __ movq(value, Address(value, TIMES_2, Mint::value_offset()));
+    __ Bind(&done);
   }
 
-  // We get here for the Mint cases, which might be out of range for an
-  // unboxed int32 output.
-
-  // TODO(vegorov): Truncating unboxing leaves garbage in the higher word.
-  // Is this the best semantics?
+  // TODO(vegorov): as it is implemented right now truncating unboxing would
+  // leave "garbage" in the higher word.
   if (!is_truncating() && (deopt != NULL)) {
     ASSERT(representation() == kUnboxedInt32);
-    const Register temp = locs()->temp(0).reg();
+    Register temp = locs()->temp(0).reg();
     __ movsxd(temp, value);
     __ cmpq(temp, value);
     __ j(NOT_EQUAL, deopt);
   }
-  __ Bind(&done_and_no_need_to_check_range);
 }
 
 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
@@ -3834,61 +3737,27 @@
   ASSERT((from_representation() == kUnboxedInt32) ||
          (from_representation() == kUnboxedUint32));
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
+  const intptr_t kNumTemps = 0;
   LocationSummary* summary = new (zone)
-      LocationSummary(zone, kNumInputs, kNumTemps,
-                      ValueFitsSmi() ? LocationSummary::kNoCall
-                                     : LocationSummary::kCallOnSlowPath);
-  const bool needs_writable_input =
-      ValueFitsSmi() || (from_representation() == kUnboxedUint32);
-  summary->set_in(0, needs_writable_input ? Location::RequiresRegister()
-                                          : Location::WritableRegister());
-  if (!ValueFitsSmi()) {
-    summary->set_temp(0, Location::RequiresRegister());
-  }
-  summary->set_out(0, ValueFitsSmi() ? Location::SameAsFirstInput()
-                                     : Location::RequiresRegister());
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
 
 void BoxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register value = locs()->in(0).reg();
   const Register out = locs()->out(0).reg();
-  Label done;
+  ASSERT(value != out);
 
+  ASSERT(kSmiTagSize == 1);
   if (from_representation() == kUnboxedInt32) {
-    __ MoveRegister(out, value);
-    ASSERT(kSmiTagMask == 1 && kSmiTag == 0);
-    __ addl(out, out);
-    __ movsxd(out, out);  // Does not affect flags.
+    __ movsxd(out, value);
   } else {
-    // Unsigned.
+    ASSERT(from_representation() == kUnboxedUint32);
     __ movl(out, value);
-    __ SmiTag(out);
   }
-
-  if (!ValueFitsSmi()) {
-    if (from_representation() == kUnboxedInt32) {
-      __ j(NO_OVERFLOW, &done);
-    } else {
-      ASSERT(value != out);
-      __ TestImmediate(value, Immediate(0xc0000000ll));
-      __ j(ZERO, &done);
-    }
-    // Allocate a mint.
-    // Value input is a writable register and we have to inform the compiler of
-    // the type so it can be preserved untagged on the slow path
-    locs()->live_registers()->Add(locs()->in(0), kUnboxedInt32);
-    BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(), out,
-                                    locs()->temp(0).reg());
-    if (from_representation() == kUnboxedInt32) {
-      __ movsxd(value, value);
-    } else {
-      __ movl(value, value);
-    }
-    __ movq(FieldAddress(out, Mint::value_offset()), value);
-    __ Bind(&done);
-  }
+  __ SmiTag(out);
 }
 
 LocationSummary* BoxInt64Instr::MakeLocationSummary(Zone* zone,
@@ -3910,20 +3779,15 @@
 void BoxInt64Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register out = locs()->out(0).reg();
   const Register value = locs()->in(0).reg();
-  __ leaq(out, Address(value, value, TIMES_1, 0));
+  __ MoveRegister(out, value);
+  __ SmiTag(out);
   if (!ValueFitsSmi()) {
     const Register temp = locs()->temp(0).reg();
     Label done;
-    __ movq(temp, value);
-    __ sarq(temp, Immediate(30));
-    __ addq(temp, Immediate(1));
-    __ cmpq(temp, Immediate(2));
-    __ j(BELOW, &done);
-
+    __ j(NO_OVERFLOW, &done);
     BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(), out,
                                     temp);
     __ movq(FieldAddress(out, Mint::value_offset()), value);
-
     __ Bind(&done);
   }
 }
@@ -4485,9 +4349,8 @@
   switch (op_kind()) {
     case Token::kNEGATE: {
       Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
-      __ cmpq(value, Immediate(-0x80000000ll));
-      __ j(EQUAL, deopt);
       __ negq(value);
+      __ j(OVERFLOW, deopt);
       break;
     }
     case Token::kBIT_NOT:
@@ -4636,7 +4499,6 @@
 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register value = locs()->in(0).reg();
   FpuRegister result = locs()->out(0).fpu_reg();
-  __ AssertSmiInRange(value);
   __ SmiUntag(value);
   __ cvtsi2sdq(result, value);
 }
@@ -4666,15 +4528,14 @@
   ASSERT(result != value_obj);
   ASSERT(result != temp);
   __ movsd(value_double, FieldAddress(value_obj, Double::value_offset()));
-  __ cvttsd2sil(result, value_double);
+  __ cvttsd2siq(result, value_double);
   // Overflow is signalled with minint.
   Label do_call, done;
   // Check for overflow and that it fits into Smi.
-  __ movl(temp, result);
-  __ shll(temp, Immediate(1));
+  __ movq(temp, result);
+  __ shlq(temp, Immediate(1));
   __ j(OVERFLOW, &do_call, Assembler::kNearJump);
-  ASSERT(kSmiTagShift == 1 && kSmiTag == 0);
-  __ movsxd(result, temp);
+  __ SmiTag(result);
   __ jmp(&done);
   __ Bind(&do_call);
   __ pushq(value_obj);
@@ -4710,15 +4571,14 @@
   XmmRegister value = locs()->in(0).fpu_reg();
   Register temp = locs()->temp(0).reg();
 
-  __ cvttsd2sil(result, value);
+  __ cvttsd2siq(result, value);
   // Overflow is signalled with minint.
   Label do_call, done;
   // Check for overflow and that it fits into Smi.
-  __ movl(temp, result);
-  __ shll(temp, Immediate(1));
+  __ movq(temp, result);
+  __ shlq(temp, Immediate(1));
   __ j(OVERFLOW, deopt);
-  ASSERT(kSmiTagShift == 1 && kSmiTag == 0);
-  __ movsxd(result, temp);
+  __ SmiTag(result);
 }
 
 LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Zone* zone,
@@ -5017,7 +4877,6 @@
   // Both inputs must be writable because they will be untagged.
   summary->set_in(0, Location::RegisterLocation(RAX));
   summary->set_in(1, Location::WritableRegister());
-  // Output is a pair of registers.
   summary->set_out(0, Location::Pair(Location::RegisterLocation(RAX),
                                      Location::RegisterLocation(RDX)));
   return summary;
@@ -5032,26 +4891,50 @@
   PairLocation* pair = locs()->out(0).AsPairLocation();
   Register result1 = pair->At(0).reg();
   Register result2 = pair->At(1).reg();
+  Label not_32bit, done;
+  Register temp = RDX;
+  ASSERT(left == RAX);
+  ASSERT((right != RDX) && (right != RAX));
+  ASSERT(result1 == RAX);
+  ASSERT(result2 == RDX);
   if (RangeUtils::CanBeZero(divisor_range())) {
     // Handle divide by zero in runtime.
     __ testq(right, right);
     __ j(ZERO, deopt);
   }
-  ASSERT(left == RAX);
-  ASSERT((right != RDX) && (right != RAX));
-  ASSERT(result1 == RAX);
-  ASSERT(result2 == RDX);
+  // Check if both operands fit into 32bits as idiv with 64bit operands
+  // requires twice as many cycles and has much higher latency.
+  // We are checking this before untagging them to avoid corner case
+  // dividing INT_MAX by -1 that raises exception because quotient is
+  // too large for 32bit register.
+  __ movsxd(temp, left);
+  __ cmpq(temp, left);
+  __ j(NOT_EQUAL, &not_32bit);
+  __ movsxd(temp, right);
+  __ cmpq(temp, right);
+  __ j(NOT_EQUAL, &not_32bit);
+
   // Both operands are 31bit smis. Divide using 32bit idiv.
   __ SmiUntag(left);
   __ SmiUntag(right);
   __ cdq();
   __ idivl(right);
-  // Check the corner case of dividing the 'MIN_SMI' with -1, in which
-  // case we cannot tag the result.
-  __ cmpl(RAX, Immediate(0x40000000));
-  __ j(EQUAL, deopt);
   __ movsxd(RAX, RAX);
   __ movsxd(RDX, RDX);
+  __ jmp(&done);
+
+  // Divide using 64bit idiv.
+  __ Bind(&not_32bit);
+  __ SmiUntag(left);
+  __ SmiUntag(right);
+  __ cqo();         // Sign extend RAX -> RDX:RAX.
+  __ idivq(right);  //  RAX: quotient, RDX: remainder.
+  // Check the corner case of dividing the 'MIN_SMI' with -1, in which
+  // case we cannot tag the result.
+  __ CompareImmediate(RAX, Immediate(0x4000000000000000));
+  __ j(EQUAL, deopt);
+  __ Bind(&done);
+
   // Modulo correction (RDX).
   //  res = left % right;
   //  if (res < 0) {
@@ -5061,16 +4944,16 @@
   //      res = res + right;
   //    }
   //  }
-  Label done;
+  Label all_done;
   __ cmpq(RDX, Immediate(0));
-  __ j(GREATER_EQUAL, &done, Assembler::kNearJump);
+  __ j(GREATER_EQUAL, &all_done, Assembler::kNearJump);
   // Result is negative, adjust it.
   if ((divisor_range() == NULL) || divisor_range()->Overlaps(-1, 1)) {
     Label subtract;
     __ cmpq(right, Immediate(0));
     __ j(LESS, &subtract, Assembler::kNearJump);
     __ addq(RDX, right);
-    __ jmp(&done, Assembler::kNearJump);
+    __ jmp(&all_done, Assembler::kNearJump);
     __ Bind(&subtract);
     __ subq(RDX, right);
   } else if (divisor_range()->IsPositive()) {
@@ -5080,7 +4963,7 @@
     // Right is negative.
     __ subq(RDX, right);
   }
-  __ Bind(&done);
+  __ Bind(&all_done);
 
   __ SmiTag(RAX);
   __ SmiTag(RDX);
@@ -5422,7 +5305,6 @@
     // Code for a variable shift amount.
     // Deoptimize if shift count is > 63 or negative.
     // Sarq and shlq instructions mask the count to 6 bits.
-    __ AssertSmiInRange(RCX);
     __ SmiUntag(RCX);
     if (!IsShiftCountInRange()) {
       __ cmpq(RCX, Immediate(kMintShiftCountLimit));
@@ -5455,15 +5337,15 @@
 }
 
 CompileType BinaryUint32OpInstr::ComputeType() const {
-  return CompileType::Int();
+  return CompileType::FromCid(kSmiCid);
 }
 
 CompileType ShiftUint32OpInstr::ComputeType() const {
-  return CompileType::Int();
+  return CompileType::FromCid(kSmiCid);
 }
 
 CompileType UnaryUint32OpInstr::ComputeType() const {
-  return CompileType::Int();
+  return CompileType::FromCid(kSmiCid);
 }
 
 LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Zone* zone,
@@ -5578,7 +5460,6 @@
   Label zero;
 
   // TODO(johnmccutchan): Use range information to avoid these checks.
-  __ AssertSmiInRange(shifter);
   __ SmiUntag(shifter);
   __ cmpq(shifter, Immediate(0));
   // If shift value is < 0, deoptimize.
@@ -5603,7 +5484,7 @@
 
   __ Bind(&zero);
   // Shift was greater than 31 bits, just return zero.
-  __ xorl(left, left);
+  __ xorq(left, left);
 
   // Exit path.
   __ Bind(&done);
@@ -5644,8 +5525,8 @@
     const Register out = locs()->out(0).reg();
     // Representations are bitwise equivalent but we want to normalize
     // upperbits for safety reasons.
-    // TODO(vegorov) if we ensure that we never leave garbage in the upper bits
-    // we could avoid this.
+    // TODO(vegorov) if we ensure that we never use upperbits we could
+    // avoid this.
     __ movl(out, value);
   } else if (from() == kUnboxedUint32 && to() == kUnboxedInt32) {
     // Representations are bitwise equivalent.
diff --git a/runtime/vm/compiler/backend/range_analysis_test.cc b/runtime/vm/compiler/backend/range_analysis_test.cc
index 175b42b..081c7e8 100644
--- a/runtime/vm/compiler/backend/range_analysis_test.cc
+++ b/runtime/vm/compiler/backend/range_analysis_test.cc
@@ -66,10 +66,17 @@
                 RangeBoundary::PositiveInfinity());
   TEST_RANGE_OP(Range::Shl, -1, 1, 63, 63, RangeBoundary(kMinInt64),
                 RangeBoundary::PositiveInfinity());
-  TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 30, 30, RangeBoundary(kSmiMin),
-                    RangeBoundary(kSmiMax));
-  TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 62, 62, RangeBoundary(kSmiMin),
-                    RangeBoundary(kSmiMax));
+  if (kBitsPerWord == 64) {
+    TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 62, 62, RangeBoundary(kSmiMin),
+                      RangeBoundary(kSmiMax));
+    TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 30, 30, RangeBoundary(-(1 << 30)),
+                      RangeBoundary(1 << 30));
+  } else {
+    TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 30, 30, RangeBoundary(kSmiMin),
+                      RangeBoundary(kSmiMax));
+    TEST_RANGE_OP_SMI(Range::Shl, -1, 1, 62, 62, RangeBoundary(kSmiMin),
+                      RangeBoundary(kSmiMax));
+  }
   TEST_RANGE_OP(Range::Shl, 0, 100, 0, 64, RangeBoundary(0),
                 RangeBoundary::PositiveInfinity());
   TEST_RANGE_OP(Range::Shl, -100, 0, 0, 64, RangeBoundary::NegativeInfinity(),
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index 870884e..adfdeb3 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -1560,10 +1560,10 @@
 }
 
 void CallSpecializer::VisitLoadCodeUnits(LoadCodeUnitsInstr* instr) {
-  // Note that on ARM64 the result can always be packed into a Smi, so this
-  // is never triggered.
-  // TODO(zerny): Use kUnboxedUint32 once it is fully supported/optimized.
+// TODO(zerny): Use kUnboxedUint32 once it is fully supported/optimized.
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM)
   if (!instr->can_pack_into_smi()) instr->set_representation(kUnboxedInt64);
+#endif
 }
 
 static bool CidTestResultsContains(const ZoneGrowableArray<intptr_t>& results,
diff --git a/runtime/vm/compiler/frontend/flow_graph_builder.cc b/runtime/vm/compiler/frontend/flow_graph_builder.cc
index 5c82158..c26f4a6 100644
--- a/runtime/vm/compiler/frontend/flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/flow_graph_builder.cc
@@ -3797,15 +3797,18 @@
         ASSERT(parent_type_args_var->owner() != scope);
         // Call the runtime to concatenate both vectors.
         ZoneGrowableArray<PushArgumentInstr*>* arguments =
-            new (Z) ZoneGrowableArray<PushArgumentInstr*>(3);
+            new (Z) ZoneGrowableArray<PushArgumentInstr*>(4);
         arguments->Add(PushArgument(type_args_val));
         Value* parent_type_args_val =
             Bind(BuildLoadLocal(*parent_type_args_var, node->token_pos()));
         arguments->Add(PushArgument(parent_type_args_val));
-        Value* len_const = Bind(new (Z) ConstantInstr(
+        Value* parent_len = Bind(new (Z) ConstantInstr(
+            Smi::ZoneHandle(Z, Smi::New(function.NumParentTypeParameters()))));
+        arguments->Add(PushArgument(parent_len));
+        Value* total_len = Bind(new (Z) ConstantInstr(
             Smi::ZoneHandle(Z, Smi::New(function.NumTypeParameters() +
                                         function.NumParentTypeParameters()))));
-        arguments->Add(PushArgument(len_const));
+        arguments->Add(PushArgument(total_len));
         const Library& dart_internal =
             Library::Handle(Z, Library::InternalLibrary());
         const Function& prepend_function =
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 943119a..5d5b373 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -38,43 +38,55 @@
       ASSERT(tag == kFunctionNode);
       if (++next_read_ == field) return;
     }
+    /* Falls through */
     case kPosition:
       position_ = helper_->ReadPosition();  // read position.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kEndPosition:
       end_position_ = helper_->ReadPosition();  // read end position.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kAsyncMarker:
       async_marker_ = static_cast<AsyncMarker>(helper_->ReadByte());
       if (++next_read_ == field) return;
+      /* Falls through */
     case kDartAsyncMarker:
       dart_async_marker_ = static_cast<AsyncMarker>(
           helper_->ReadByte());  // read dart async marker.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kTypeParameters:
       helper_->SkipTypeParametersList();  // read type parameters.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kTotalParameterCount:
       total_parameter_count_ =
           helper_->ReadUInt();  // read total parameter count.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kRequiredParameterCount:
       required_parameter_count_ =
           helper_->ReadUInt();  // read required parameter count.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kPositionalParameters:
       helper_->SkipListOfVariableDeclarations();  // read positionals.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kNamedParameters:
       helper_->SkipListOfVariableDeclarations();  // read named.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kReturnType:
       helper_->SkipDartType();  // read return type.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kBody:
       if (helper_->ReadTag() == kSomething)
         helper_->SkipStatement();  // read body.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kEnd:
       return;
   }
@@ -114,25 +126,32 @@
     case kPosition:
       position_ = helper_->ReadPosition();  // read position.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kEqualPosition:
       equals_position_ = helper_->ReadPosition();  // read equals position.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kAnnotations:
       helper_->SkipListOfExpressions();  // read annotations.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kFlags:
       flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
+      /* Falls through */
     case kNameIndex:
       name_index_ = helper_->ReadStringReference();  // read name index.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kType:
       helper_->SkipDartType();  // read type.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kInitializer:
       if (helper_->ReadTag() == kSomething)
         helper_->SkipExpression();  // read initializer.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kEnd:
       return;
   }
@@ -156,28 +175,35 @@
       ASSERT(tag == kField);
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kCanonicalName:
       canonical_name_ =
           helper_->ReadCanonicalNameReference();  // read canonical_name.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kSourceUriIndex:
       source_uri_index_ = helper_->ReadUInt();  // read source_uri_index.
       helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
+      /* Falls through */
     case kPosition:
       position_ = helper_->ReadPosition(false);  // read position.
       helper_->RecordTokenPosition(position_);
       if (++next_read_ == field) return;
+      /* Falls through */
     case kEndPosition:
       end_position_ = helper_->ReadPosition(false);  // read end position.
       helper_->RecordTokenPosition(end_position_);
       if (++next_read_ == field) return;
+      /* Falls through */
     case kFlags:
       flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
+      /* Falls through */
     case kName:
       helper_->SkipName();  // read name.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kAnnotations: {
       annotation_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < annotation_count_; ++i) {
@@ -185,9 +211,11 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kType:
       helper_->SkipDartType();  // read type.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kInitializer:
       if (helper_->ReadTag() == kSomething) {
         if (detect_function_literal_initializer &&
@@ -207,6 +235,7 @@
         helper_->SkipExpression();  // read initializer.
       }
       if (++next_read_ == field) return;
+      /* Falls through */
     case kEnd:
       return;
   }
@@ -222,31 +251,39 @@
       ASSERT(tag == kProcedure);
       if (++next_read_ == field) return;
     }
+    /* Falls through */
     case kCanonicalName:
       canonical_name_ =
           helper_->ReadCanonicalNameReference();  // read canonical_name.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kSourceUriIndex:
       source_uri_index_ = helper_->ReadUInt();  // read source_uri_index.
       helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
+      /* Falls through */
     case kPosition:
       position_ = helper_->ReadPosition(false);  // read position.
       helper_->RecordTokenPosition(position_);
       if (++next_read_ == field) return;
+      /* Falls through */
     case kEndPosition:
       end_position_ = helper_->ReadPosition(false);  // read end position.
       helper_->RecordTokenPosition(end_position_);
       if (++next_read_ == field) return;
+      /* Falls through */
     case kKind:
       kind_ = static_cast<Kind>(helper_->ReadByte());
       if (++next_read_ == field) return;
+      /* Falls through */
     case kFlags:
       flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
+      /* Falls through */
     case kName:
       helper_->SkipName();  // read name.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kAnnotations: {
       annotation_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < annotation_count_; ++i) {
@@ -254,20 +291,24 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kForwardingStubSuperTarget:
       if (helper_->ReadTag() == kSomething) {
         forwarding_stub_super_target_ = helper_->ReadCanonicalNameReference();
       }
       if (++next_read_ == field) return;
+      /* Falls through */
     case kForwardingStubInterfaceTarget:
       if (helper_->ReadTag() == kSomething) {
         helper_->ReadCanonicalNameReference();
       }
       if (++next_read_ == field) return;
+      /* Falls through */
     case kFunction:
       if (helper_->ReadTag() == kSomething)
         helper_->SkipFunctionNode();  // read function node.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kEnd:
       return;
   }
@@ -283,28 +324,35 @@
       ASSERT(tag == kConstructor);
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kCanonicalName:
       canonical_name_ =
           helper_->ReadCanonicalNameReference();  // read canonical_name.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kSourceUriIndex:
       source_uri_index_ = helper_->ReadUInt();  // read source_uri_index.
       helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
+      /* Falls through */
     case kPosition:
       position_ = helper_->ReadPosition();  // read position.
       helper_->RecordTokenPosition(position_);
       if (++next_read_ == field) return;
+      /* Falls through */
     case kEndPosition:
       end_position_ = helper_->ReadPosition();  // read end position.
       helper_->RecordTokenPosition(end_position_);
       if (++next_read_ == field) return;
+      /* Falls through */
     case kFlags:
       flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
+      /* Falls through */
     case kName:
       helper_->SkipName();  // read name.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kAnnotations: {
       annotation_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < annotation_count_; ++i) {
@@ -312,9 +360,11 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kFunction:
       helper_->SkipFunctionNode();  // read function.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kInitializers: {
       intptr_t list_length =
           helper_->ReadListLength();  // read initializers list length.
@@ -323,6 +373,7 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kEnd:
       return;
   }
@@ -338,28 +389,35 @@
       ASSERT(tag == kClass);
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kCanonicalName:
       canonical_name_ =
           helper_->ReadCanonicalNameReference();  // read canonical_name.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kSourceUriIndex:
       source_uri_index_ = helper_->ReadUInt();  // read source_uri_index.
       helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
+      /* Falls through */
     case kPosition:
       position_ = helper_->ReadPosition(false);  // read position.
       helper_->RecordTokenPosition(position_);
       if (++next_read_ == field) return;
+      /* Falls through */
     case kEndPosition:
       end_position_ = helper_->ReadPosition();  // read end position.
       helper_->RecordTokenPosition(end_position_);
       if (++next_read_ == field) return;
+      /* Falls through */
     case kFlags:
       flags_ = helper_->ReadFlags();  // read flags.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kNameIndex:
       name_index_ = helper_->ReadStringReference();  // read name index.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kAnnotations: {
       annotation_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < annotation_count_; ++i) {
@@ -367,9 +425,11 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kTypeParameters:
       helper_->SkipTypeParametersList();  // read type parameters.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kSuperClass: {
       Tag type_tag = helper_->ReadTag();  // read super class type (part 1).
       if (type_tag == kSomething) {
@@ -377,6 +437,7 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kMixinType: {
       Tag type_tag = helper_->ReadTag();  // read mixin type (part 1).
       if (type_tag == kSomething) {
@@ -384,9 +445,11 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kImplementedClasses:
       helper_->SkipListOfDartTypes();  // read implemented_classes.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kFields: {
       intptr_t list_length =
           helper_->ReadListLength();  // read fields list length.
@@ -396,6 +459,7 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kConstructors: {
       intptr_t list_length =
           helper_->ReadListLength();  // read constructors list length.
@@ -406,6 +470,7 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kProcedures: {
       procedure_count_ = helper_->ReadListLength();  // read procedures #.
       for (intptr_t i = 0; i < procedure_count_; i++) {
@@ -415,6 +480,7 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kClassIndex:
       // Read class index.
       for (intptr_t i = 0; i < procedure_count_; ++i) {
@@ -423,6 +489,7 @@
       helper_->reader_.ReadUInt32();
       helper_->reader_.ReadUInt32();
       if (++next_read_ == field) return;
+      /* Falls through */
     case kEnd:
       return;
   }
@@ -437,20 +504,25 @@
       flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kCanonicalName:
       canonical_name_ =
           helper_->ReadCanonicalNameReference();  // read canonical_name.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kName:
       name_index_ = helper_->ReadStringReference();  // read name index.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kSourceUriIndex:
       source_uri_index_ = helper_->ReadUInt();  // read source_uri_index.
       helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
+      /* Falls through */
     case kAnnotations:
       helper_->SkipListOfExpressions();  // read annotations.
       if (++next_read_ == field) return;
+      /* Falls through */
     case kDependencies: {
       intptr_t dependency_count = helper_->ReadUInt();  // read list length.
       for (intptr_t i = 0; i < dependency_count; ++i) {
@@ -458,6 +530,7 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kAdditionalExports: {
       intptr_t name_count = helper_->ReadUInt();
       for (intptr_t i = 0; i < name_count; ++i) {
@@ -465,6 +538,7 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kParts: {
       intptr_t part_count = helper_->ReadUInt();  // read list length.
       for (intptr_t i = 0; i < part_count; ++i) {
@@ -472,6 +546,7 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kTypedefs: {
       intptr_t typedef_count = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < typedef_count; i++) {
@@ -479,6 +554,7 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kClasses: {
       class_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < class_count_; ++i) {
@@ -487,6 +563,7 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kToplevelField: {
       intptr_t field_count = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < field_count; ++i) {
@@ -495,6 +572,7 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kToplevelProcedures: {
       procedure_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < procedure_count_; ++i) {
@@ -503,6 +581,7 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kLibraryIndex:
       // Read library index.
       for (intptr_t i = 0; i < class_count_; ++i) {
@@ -516,6 +595,7 @@
       helper_->reader_.ReadUInt32();
       helper_->reader_.ReadUInt32();
       if (++next_read_ == field) return;
+      /* Falls through */
     case kEnd:
       return;
   }
@@ -530,22 +610,27 @@
       helper_->ReadPosition();
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kFlags: {
       flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kAnnotations: {
       helper_->SkipListOfExpressions();
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kTargetLibrary: {
       target_library_canonical_name_ = helper_->ReadCanonicalNameReference();
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kName: {
       name_index_ = helper_->ReadStringReference();
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kCombinators: {
       intptr_t count = helper_->ReadListLength();
       for (intptr_t i = 0; i < count; ++i) {
@@ -556,6 +641,7 @@
       }
       if (++next_read_ == field) return;
     }
+      /* Falls through */
     case kEnd:
       return;
   }
@@ -921,7 +1007,6 @@
   switch (function.kind()) {
     case RawFunction::kClosureFunction:
     case RawFunction::kImplicitClosureFunction:
-    case RawFunction::kConvertedClosureFunction:
     case RawFunction::kRegularFunction:
     case RawFunction::kGetterFunction:
     case RawFunction::kSetterFunction:
@@ -1548,7 +1633,7 @@
       builder_->ReadUInt();  // read value.
       return;
     case kDoubleLiteral:
-      builder_->SkipStringReference();  // read index into string table.
+      builder_->ReadDouble();  // read value.
       return;
     case kTrueLiteral:
       return;
@@ -1556,27 +1641,6 @@
       return;
     case kNullLiteral:
       return;
-    case kVectorCreation:
-      builder_->ReadUInt();  // read size.
-      return;
-    case kVectorGet:
-      VisitExpression();     // read expression.
-      builder_->ReadUInt();  // read index.
-      return;
-    case kVectorSet:
-      VisitExpression();     // read vector expression.
-      builder_->ReadUInt();  // read index.
-      VisitExpression();     // read value.
-      return;
-    case kVectorCopy:
-      VisitExpression();  // read vector expression.
-      return;
-    case kClosureCreation:
-      builder_->SkipCanonicalNameReference();  // read function reference.
-      VisitExpression();                       // read context vector.
-      VisitDartType();                  // read function type of the closure.
-      builder_->SkipListOfDartTypes();  // read type arguments.
-      return;
     case kConstantExpression: {
       builder_->SkipConstantReference();
       return;
@@ -1959,7 +2023,6 @@
     case kDynamicType:
     case kVoidType:
     case kBottomType:
-    case kVectorType:
       // those contain nothing.
       return;
     case kInterfaceType:
@@ -2449,9 +2512,6 @@
     case kVoidType:
       result_ = Object::void_type().raw();
       break;
-    case kVectorType:
-      result_ = Object::vector_type().raw();
-      break;
     case kBottomType:
       result_ =
           Class::Handle(Z, I->object_store()->null_class()).CanonicalType();
@@ -3542,8 +3602,7 @@
 }
 
 void StreamingConstantEvaluator::EvaluateDoubleLiteral() {
-  result_ = Double::New(H.DartString(builder_->ReadStringReference()),
-                        Heap::kOld);  // read string reference.
+  result_ = Double::New(builder_->ReadDouble(), Heap::kOld);  // read value.
   result_ = H.Canonicalize(result_);
 }
 
@@ -3929,9 +3988,9 @@
     case kDynamicType:
     case kVoidType:
     case kBottomType:
-    case kVectorType:
       // those contain nothing.
       break;
+      UNIMPLEMENTED();
     case kInterfaceType:
       CalculateInterfaceTypeFingerprint(false);
       break;
@@ -4202,28 +4261,6 @@
       CalculateExpressionFingerprint();       // read expression.
       CalculateListOfDartTypesFingerprint();  // read type arguments.
       return;
-    case kVectorCreation:
-      BuildHash(ReadUInt());  // read value.
-      return;
-    case kVectorGet:
-      CalculateExpressionFingerprint();  // read vector expression.
-      BuildHash(ReadUInt());             // read index.
-      return;
-    case kVectorSet:
-      CalculateExpressionFingerprint();  // read vector expression.
-      BuildHash(ReadUInt());             // read index.
-      CalculateExpressionFingerprint();  // read value.
-      return;
-    case kVectorCopy:
-      CalculateExpressionFingerprint();  // read vector expression.
-      return;
-    case kClosureCreation:
-      // read top-level function reference.
-      CalculateCanonicalNameFingerprint();
-      CalculateExpressionFingerprint();       // read context vector.
-      CalculateDartTypeFingerprint();         // read function type.
-      CalculateListOfDartTypesFingerprint();  // read type arguments.
-      return;
     case kBigIntLiteral:
       CalculateStringReferenceFingerprint();  // read string reference.
       return;
@@ -4238,9 +4275,13 @@
     case kPositiveIntLiteral:
       BuildHash(ReadUInt());  // read value.
       return;
-    case kDoubleLiteral:
-      CalculateStringReferenceFingerprint();  // read index into string table.
+    case kDoubleLiteral: {
+      double value = ReadDouble();  // read value.
+      uint64_t data = bit_cast<uint64_t>(value);
+      BuildHash(static_cast<uint32_t>(data >> 32));
+      BuildHash(static_cast<uint32_t>(data));
       return;
+    }
     case kTrueLiteral:
       return;
     case kFalseLiteral:
@@ -5411,61 +5452,12 @@
   LocalVariable* closure = NULL;
   if (dart_function.IsClosureFunction()) {
     closure = parsed_function()->node_sequence()->scope()->VariableAt(0);
-  } else if (dart_function.IsConvertedClosureFunction()) {
-    closure = new (Z) LocalVariable(
-        TokenPosition::kNoSource, TokenPosition::kNoSource,
-        Symbols::TempParam(), AbstractType::ZoneHandle(Z, Type::DynamicType()));
-    closure->set_index(parsed_function()->first_parameter_index());
-    closure->set_is_captured_parameter(true);
   }
 
-  if ((dart_function.IsClosureFunction() ||
-       dart_function.IsConvertedClosureFunction()) &&
-      dart_function.NumParentTypeParameters() > 0 &&
-      I->reify_generic_functions()) {
-    LocalVariable* fn_type_args = parsed_function()->function_type_arguments();
-    ASSERT(fn_type_args != NULL && closure != NULL);
-
-    if (dart_function.IsGeneric()) {
-      body += LoadLocal(fn_type_args);
-      body += PushArgument();
-      body += LoadLocal(closure);
-      body += LoadField(Closure::function_type_arguments_offset());
-      body += PushArgument();
-      body += IntConstant(dart_function.NumTypeParameters() +
-                          dart_function.NumParentTypeParameters());
-      body += PushArgument();
-
-      const Library& dart_internal =
-          Library::Handle(Z, Library::InternalLibrary());
-      const Function& prepend_function =
-          Function::ZoneHandle(Z, dart_internal.LookupFunctionAllowPrivate(
-                                      Symbols::PrependTypeArguments()));
-      ASSERT(!prepend_function.IsNull());
-
-      body += StaticCall(TokenPosition::kNoSource, prepend_function, 3,
-                         ICData::kStatic);
-      body += StoreLocal(TokenPosition::kNoSource, fn_type_args);
-      body += Drop();
-    } else {
-      body += LoadLocal(closure);
-      body += LoadField(Closure::function_type_arguments_offset());
-      body += StoreLocal(TokenPosition::kNoSource, fn_type_args);
-      body += Drop();
-    }
-  }
-
-  if (dart_function.IsConvertedClosureFunction()) {
-    body += LoadLocal(closure);
-    body += LoadField(Closure::context_offset());
-    LocalVariable* context = closure;
-    body += StoreLocal(TokenPosition::kNoSource, context);
-    body += Drop();
-  }
-
-  if (!dart_function.is_native())
+  if (!dart_function.is_native()) {
     body += flow_graph_builder_->CheckStackOverflowInPrologue(
         dart_function.token_pos());
+  }
   intptr_t context_size =
       parsed_function()->node_sequence()->scope()->num_context_variables();
   if (context_size > 0) {
@@ -5654,6 +5646,53 @@
     flow_graph_builder_->context_depth_ = current_context_depth;
   }
 
+  // :function_type_arguments_var handling is built here and prepended to the
+  // body because it needs to be executed everytime we enter the function -
+  // even if we are resuming from the yield.
+  Fragment prologue;
+  if (dart_function.IsClosureFunction() &&
+      dart_function.NumParentTypeParameters() > 0 &&
+      I->reify_generic_functions()) {
+    // Function with yield points can not be generic itself but the outer
+    // function can be.
+    ASSERT(yield_continuations().is_empty() || !dart_function.IsGeneric());
+
+    LocalVariable* fn_type_args = parsed_function()->function_type_arguments();
+    ASSERT(fn_type_args != NULL && closure != NULL);
+
+    if (dart_function.IsGeneric()) {
+      prologue += LoadLocal(fn_type_args);
+      prologue += PushArgument();
+      prologue += LoadLocal(closure);
+      prologue += LoadField(Closure::function_type_arguments_offset());
+      prologue += PushArgument();
+      prologue += IntConstant(dart_function.NumParentTypeParameters());
+      prologue += PushArgument();
+      prologue += IntConstant(dart_function.NumTypeParameters() +
+                              dart_function.NumParentTypeParameters());
+      prologue += PushArgument();
+
+      const Library& dart_internal =
+          Library::Handle(Z, Library::InternalLibrary());
+      const Function& prepend_function =
+          Function::ZoneHandle(Z, dart_internal.LookupFunctionAllowPrivate(
+                                      Symbols::PrependTypeArguments()));
+      ASSERT(!prepend_function.IsNull());
+
+      prologue += StaticCall(TokenPosition::kNoSource, prepend_function, 4,
+                             ICData::kStatic);
+      prologue += StoreLocal(TokenPosition::kNoSource, fn_type_args);
+      prologue += Drop();
+    } else {
+      prologue += LoadLocal(closure);
+      prologue += LoadField(Closure::function_type_arguments_offset());
+      prologue += StoreLocal(TokenPosition::kNoSource, fn_type_args);
+      prologue += Drop();
+    }
+  }
+
+  body = prologue + body;
+
   if (FLAG_causal_async_stacks &&
       (dart_function.IsAsyncClosure() || dart_function.IsAsyncGenClosure())) {
     // The code we are building will be executed right after we enter
@@ -5779,9 +5818,8 @@
         return BuildGraphOfImplicitClosureFunction(function);
       }
     }
-    // fallthrough intended
-    case RawFunction::kClosureFunction:
-    case RawFunction::kConvertedClosureFunction: {
+    /* Falls through */
+    case RawFunction::kClosureFunction: {
       ReadUntilFunctionNode(parsed_function());  // read until function node.
       return BuildGraphOfFunction(false);
     }
@@ -5911,16 +5949,6 @@
       return BuildBoolLiteral(false, position);
     case kNullLiteral:
       return BuildNullLiteral(position);
-    case kVectorCreation:
-      return BuildVectorCreation(position);
-    case kVectorGet:
-      return BuildVectorGet(position);
-    case kVectorSet:
-      return BuildVectorSet(position);
-    case kVectorCopy:
-      return BuildVectorCopy(position);
-    case kClosureCreation:
-      return BuildClosureCreation(position);
     case kConstantExpression:
       return BuildConstantExpression(position);
     case kInstantiation:
@@ -6022,6 +6050,10 @@
   return reader_.ReadUInt();
 }
 
+double KernelReaderHelper::ReadDouble() {
+  return reader_.ReadDouble();
+}
+
 uint32_t KernelReaderHelper::PeekListLength() {
   AlternativeReadingScope alt(&reader_);
   return reader_.ReadListLength();
@@ -6132,7 +6164,6 @@
     case kDynamicType:
     case kVoidType:
     case kBottomType:
-    case kVectorType:
       // those contain nothing.
       return;
     case kInterfaceType:
@@ -6453,27 +6484,6 @@
       SkipExpression();       // read expression.
       SkipListOfDartTypes();  // read type arguments.
       return;
-    case kVectorCreation:
-      ReadUInt();  // read value.
-      return;
-    case kVectorGet:
-      SkipExpression();  // read vector expression.
-      ReadUInt();        // read index.
-      return;
-    case kVectorSet:
-      SkipExpression();  // read vector expression.
-      ReadUInt();        // read index.
-      SkipExpression();  // read value.
-      return;
-    case kVectorCopy:
-      SkipExpression();  // read vector expression.
-      return;
-    case kClosureCreation:
-      SkipCanonicalNameReference();  // read top-level function reference.
-      SkipExpression();              // read context vector.
-      SkipDartType();                // read function type.
-      SkipListOfDartTypes();         // read type arguments.
-      return;
     case kBigIntLiteral:
       SkipStringReference();  // read string reference.
       return;
@@ -6489,7 +6499,7 @@
       ReadUInt();  // read value.
       return;
     case kDoubleLiteral:
-      SkipStringReference();  // read index into string table.
+      ReadDouble();  // read value.
       return;
     case kTrueLiteral:
       return;
@@ -8983,8 +8993,7 @@
   if (position != NULL) *position = TokenPosition::kNoSource;
 
   Double& constant = Double::ZoneHandle(
-      Z, Double::NewCanonical(
-             H.DartString(ReadStringReference())));  // read string reference.
+      Z, Double::NewCanonical(ReadDouble()));  // read double.
   return Constant(constant);
 }
 
@@ -9018,117 +9027,6 @@
   return instructions;
 }
 
-Fragment StreamingFlowGraphBuilder::BuildVectorCreation(
-    TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
-
-  intptr_t size = ReadUInt();  // read size.
-  return AllocateContext(size);
-}
-
-Fragment StreamingFlowGraphBuilder::BuildVectorGet(TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
-
-  Fragment instructions = BuildExpression();  // read expression.
-  intptr_t index = ReadUInt();                // read index.
-  instructions += LoadField(Context::variable_offset(index));
-  return instructions;
-}
-
-Fragment StreamingFlowGraphBuilder::BuildVectorSet(TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
-
-  Fragment instructions = NullConstant();
-  LocalVariable* result = MakeTemporary();
-
-  instructions += BuildExpression();  // read vector expression.
-  intptr_t index = ReadUInt();        // read index.
-  instructions += BuildExpression();  // read value expression.
-  instructions += StoreLocal(TokenPosition::kNoSource, result);
-
-  instructions += StoreInstanceField(TokenPosition::kNoSource,
-                                     Context::variable_offset(index));
-
-  return instructions;
-}
-
-Fragment StreamingFlowGraphBuilder::BuildVectorCopy(TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
-
-  Fragment instructions = BuildExpression();  // read vector expression.
-  Value* context_to_copy = Pop();
-  // TODO(dartbug.com/31218) VectorCopy should contain size of the context
-  // as a constant.
-  CloneContextInstr* clone_instruction =
-      new (Z) CloneContextInstr(TokenPosition::kNoSource, context_to_copy,
-                                CloneContextInstr::kUnknownContextSize,
-                                Thread::Current()->GetNextDeoptId());
-  instructions <<= clone_instruction;
-  Push(clone_instruction);
-
-  return instructions;
-}
-
-Fragment StreamingFlowGraphBuilder::BuildClosureCreation(
-    TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
-
-  NameIndex function_reference =
-      ReadCanonicalNameReference();  // read function reference.
-  Function& function = Function::ZoneHandle(
-      Z, H.LookupStaticMethodByKernelProcedure(function_reference));
-
-  intptr_t num_type_parameters;
-  {
-    AlternativeReadingScope _(&reader_);
-    SkipExpression();  // context vector
-    SkipDartType();    // skip function type
-    num_type_parameters = ReadListLength();
-  }
-  function = function.ConvertedClosureFunction(num_type_parameters);
-  ASSERT(!function.IsNull());
-
-  const Class& closure_class =
-      Class::ZoneHandle(Z, I->object_store()->closure_class());
-  Fragment instructions = AllocateObject(closure_class, function);
-  LocalVariable* closure = MakeTemporary();
-
-  instructions += BuildExpression();  // read context vector.
-  LocalVariable* context = MakeTemporary();
-
-  instructions += LoadLocal(closure);
-  instructions += Constant(function);
-  instructions +=
-      StoreInstanceField(TokenPosition::kNoSource, Closure::function_offset());
-
-  instructions += LoadLocal(closure);
-  instructions += LoadLocal(context);
-  instructions +=
-      StoreInstanceField(TokenPosition::kNoSource, Closure::context_offset());
-
-  // Skip the function type of the closure (it's predicable from the
-  // target and the supplied type arguments).
-  SkipDartType();
-
-  ReadListLength();  // type parameter count
-  if (num_type_parameters > 0) {
-    instructions += LoadLocal(closure);
-    const TypeArguments& type_args = T.BuildTypeArguments(
-        num_type_parameters);  // read list of type arguments.
-    instructions += TranslateInstantiatedTypeArguments(type_args);
-    instructions += StoreInstanceField(
-        TokenPosition::kNoSource, Closure::function_type_arguments_offset());
-  }
-
-  instructions += LoadLocal(closure);
-  instructions += Constant(Object::empty_type_arguments());
-  instructions += StoreInstanceField(TokenPosition::kNoSource,
-                                     Closure::delayed_type_arguments_offset());
-
-  instructions += Drop();  // context
-  return instructions;
-}
-
 Fragment StreamingFlowGraphBuilder::BuildConstantExpression(
     TokenPosition* position) {
   if (position != NULL) *position = TokenPosition::kNoSource;
@@ -10826,8 +10724,7 @@
         break;
       }
       case kDoubleConstant: {
-        temp_instance_ = Double::New(
-            H.DartString(builder_.ReadStringReference()), Heap::kOld);
+        temp_instance_ = Double::New(builder_.ReadDouble(), Heap::kOld);
         temp_instance_ = H.Canonicalize(temp_instance_);
         break;
       }
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 82ebe8a..87ef12b 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -769,7 +769,6 @@
   void VisitInterfaceType(bool simple);
   void VisitFunctionType(bool simple);
   void VisitTypeParameterType();
-  void VisitVectorType();
   void HandleLocalFunction(intptr_t parent_kernel_offset);
 
   AbstractType& BuildAndVisitVariableType();
@@ -1043,6 +1042,7 @@
   uint32_t ReadUInt();
   uint32_t ReadUInt32();
   uint32_t PeekUInt();
+  double ReadDouble();
   uint32_t PeekListLength();
   StringIndex ReadStringReference();
   NameIndex ReadCanonicalNameReference();
@@ -1510,11 +1510,6 @@
   Fragment BuildBoolLiteral(bool value, TokenPosition* position);
   Fragment BuildNullLiteral(TokenPosition* position);
   Fragment BuildFutureNullValue(TokenPosition* position);
-  Fragment BuildVectorCreation(TokenPosition* position);
-  Fragment BuildVectorGet(TokenPosition* position);
-  Fragment BuildVectorSet(TokenPosition* position);
-  Fragment BuildVectorCopy(TokenPosition* position);
-  Fragment BuildClosureCreation(TokenPosition* position);
   Fragment BuildConstantExpression(TokenPosition* position);
   Fragment BuildPartialTearoffInstantiation(TokenPosition* position);
 
diff --git a/runtime/vm/compiler/frontend/prologue_builder.cc b/runtime/vm/compiler/frontend/prologue_builder.cc
index 902b5b0..3e32dbc 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.cc
+++ b/runtime/vm/compiler/frontend/prologue_builder.cc
@@ -34,8 +34,7 @@
   const bool load_optional_arguments = function_.HasOptionalParameters();
   const bool expect_type_args =
       function_.IsGeneric() && isolate->reify_generic_functions();
-  const bool check_arguments =
-      (function_.IsClosureFunction() || function_.IsConvertedClosureFunction());
+  const bool check_arguments = function_.IsClosureFunction();
 
   Fragment prologue = Fragment(entry);
   JoinEntryInstr* nsm = NULL;
diff --git a/runtime/vm/compiler/intrinsifier.cc b/runtime/vm/compiler/intrinsifier.cc
index 654d33c..d7ffab5 100644
--- a/runtime/vm/compiler/intrinsifier.cc
+++ b/runtime/vm/compiler/intrinsifier.cc
@@ -61,6 +61,45 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
+struct IntrinsicDesc {
+  const char* class_name;
+  const char* function_name;
+};
+
+struct LibraryInstrinsicsDesc {
+  Library& library;
+  IntrinsicDesc* intrinsics;
+};
+
+#define DEFINE_INTRINSIC(class_name, function_name, destination, type, fp)     \
+  {#class_name, #function_name},
+
+// clang-format off
+static IntrinsicDesc core_intrinsics[] = {
+  CORE_LIB_INTRINSIC_LIST(DEFINE_INTRINSIC)
+  CORE_INTEGER_LIB_INTRINSIC_LIST(DEFINE_INTRINSIC)
+  GRAPH_CORE_INTRINSICS_LIST(DEFINE_INTRINSIC)
+  {nullptr, nullptr},
+};
+
+static IntrinsicDesc math_intrinsics[] = {
+  MATH_LIB_INTRINSIC_LIST(DEFINE_INTRINSIC)
+  GRAPH_MATH_LIB_INTRINSIC_LIST(DEFINE_INTRINSIC)
+  {nullptr, nullptr},
+};
+
+static IntrinsicDesc typed_data_intrinsics[] = {
+  TYPED_DATA_LIB_INTRINSIC_LIST(DEFINE_INTRINSIC)
+  GRAPH_TYPED_DATA_INTRINSICS_LIST(DEFINE_INTRINSIC)
+  {nullptr, nullptr},
+};
+
+static IntrinsicDesc developer_intrinsics[] = {
+  DEVELOPER_LIB_INTRINSIC_LIST(DEFINE_INTRINSIC)
+  {nullptr, nullptr},
+};
+// clang-format on
+
 void Intrinsifier::InitializeState() {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
@@ -68,62 +107,53 @@
   Class& cls = Class::Handle(zone);
   Function& func = Function::Handle(zone);
   String& str = String::Handle(zone);
+  String& str2 = String::Handle(zone);
   Error& error = Error::Handle(zone);
 
-#define SETUP_FUNCTION(class_name, function_name, destination, type, fp)       \
-  func = Function::null();                                                     \
-  if (strcmp(#class_name, "::") == 0) {                                        \
-    str = String::New(#function_name);                                         \
-    func = lib.LookupFunctionAllowPrivate(str);                                \
-  } else {                                                                     \
-    str = String::New(#class_name);                                            \
-    cls = lib.LookupClassAllowPrivate(str);                                    \
-    ASSERT(FLAG_precompiled_mode || !cls.IsNull());                            \
-    if (!cls.IsNull()) {                                                       \
-      error = cls.EnsureIsFinalized(thread);                                   \
-      if (!error.IsNull()) {                                                   \
-        OS::PrintErr("%s\n", error.ToErrorCString());                          \
-      }                                                                        \
-      ASSERT(error.IsNull());                                                  \
-      if (#function_name[0] == '.') {                                          \
-        str = String::New(#class_name #function_name);                         \
-      } else {                                                                 \
-        str = String::New(#function_name);                                     \
-      }                                                                        \
-      func = cls.LookupFunctionAllowPrivate(str);                              \
-    }                                                                          \
-  }                                                                            \
-  if (!func.IsNull()) {                                                        \
-    func.set_is_intrinsic(true);                                               \
-  } else if (!FLAG_precompiled_mode) {                                         \
-    FATAL2("Intrinsifier failed to find method %s in class %s\n",              \
-           #function_name, #class_name);                                       \
+  static const intptr_t kNumLibs = 4;
+  LibraryInstrinsicsDesc intrinsics[kNumLibs] = {
+      {Library::Handle(zone, Library::CoreLibrary()), core_intrinsics},
+      {Library::Handle(zone, Library::MathLibrary()), math_intrinsics},
+      {Library::Handle(zone, Library::TypedDataLibrary()),
+       typed_data_intrinsics},
+      {Library::Handle(zone, Library::DeveloperLibrary()),
+       developer_intrinsics},
+  };
+
+  for (intptr_t i = 0; i < kNumLibs; i++) {
+    lib = intrinsics[i].library.raw();
+    for (IntrinsicDesc* intrinsic = intrinsics[i].intrinsics;
+         intrinsic->class_name != nullptr; intrinsic++) {
+      func = Function::null();
+      if (strcmp(intrinsic->class_name, "::") == 0) {
+        str = String::New(intrinsic->function_name);
+        func = lib.LookupFunctionAllowPrivate(str);
+      } else {
+        str = String::New(intrinsic->class_name);
+        cls = lib.LookupClassAllowPrivate(str);
+        ASSERT(FLAG_precompiled_mode || !cls.IsNull());
+        if (!cls.IsNull()) {
+          error = cls.EnsureIsFinalized(thread);
+          if (!error.IsNull()) {
+            OS::PrintErr("%s\n", error.ToErrorCString());
+          }
+          ASSERT(error.IsNull());
+          str = String::New(intrinsic->function_name);
+          if (intrinsic->function_name[0] == '.') {
+            str2 = String::New(intrinsic->class_name);
+            str = String::Concat(str2, str);
+          }
+          func = cls.LookupFunctionAllowPrivate(str);
+        }
+      }
+      if (!func.IsNull()) {
+        func.set_is_intrinsic(true);
+      } else if (!FLAG_precompiled_mode) {
+        FATAL2("Intrinsifier failed to find method %s in class %s\n",
+               intrinsic->function_name, intrinsic->class_name);
+      }
+    }
   }
-
-  // Set up all core lib functions that can be intrinsified.
-  lib = Library::CoreLibrary();
-  ASSERT(!lib.IsNull());
-  CORE_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
-  CORE_INTEGER_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
-  GRAPH_CORE_INTRINSICS_LIST(SETUP_FUNCTION);
-
-  // Set up all math lib functions that can be intrinsified.
-  lib = Library::MathLibrary();
-  ASSERT(!lib.IsNull());
-  MATH_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
-  GRAPH_MATH_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
-
-  // Set up all dart:typed_data lib functions that can be intrinsified.
-  lib = Library::TypedDataLibrary();
-  ASSERT(!lib.IsNull());
-  TYPED_DATA_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
-  GRAPH_TYPED_DATA_INTRINSICS_LIST(SETUP_FUNCTION);
-
-  // Setup all dart:developer lib functions that can be intrinsified.
-  lib = Library::DeveloperLibrary();
-  ASSERT(!lib.IsNull());
-  DEVELOPER_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
-
 #undef SETUP_FUNCTION
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/intrinsifier_arm64.cc b/runtime/vm/compiler/intrinsifier_arm64.cc
index 2102c93..4598536 100644
--- a/runtime/vm/compiler/intrinsifier_arm64.cc
+++ b/runtime/vm/compiler/intrinsifier_arm64.cc
@@ -265,9 +265,8 @@
 void Intrinsifier::Integer_addFromInteger(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);  // Checks two smis.
-  __ addsw(R0, R0, Operand(R1));                    // Adds.
+  __ adds(R0, R0, Operand(R1));                     // Adds.
   __ b(&fall_through, VS);                          // Fall-through on overflow.
-  __ sxtw(R0, R0);  // Sign extend - flags not affected.
   __ ret();
   __ Bind(&fall_through);
 }
@@ -279,9 +278,8 @@
 void Intrinsifier::Integer_subFromInteger(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ subsw(R0, R0, Operand(R1));  // Subtract.
-  __ b(&fall_through, VS);        // Fall-through on overflow.
-  __ sxtw(R0, R0);                // Sign extend - flags not affected.
+  __ subs(R0, R0, Operand(R1));  // Subtract.
+  __ b(&fall_through, VS);       // Fall-through on overflow.
   __ ret();
   __ Bind(&fall_through);
 }
@@ -289,9 +287,8 @@
 void Intrinsifier::Integer_sub(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ subsw(R0, R1, Operand(R0));  // Subtract.
-  __ b(&fall_through, VS);        // Fall-through on overflow.
-  __ sxtw(R0, R0);                // Sign extend - flags not affected.
+  __ subs(R0, R1, Operand(R0));  // Subtract.
+  __ b(&fall_through, VS);       // Fall-through on overflow.
   __ ret();
   __ Bind(&fall_through);
 }
@@ -302,9 +299,9 @@
   TestBothArgumentsSmis(assembler, &fall_through);  // checks two smis
   __ SmiUntag(R0);  // Untags R6. We only want result shifted by one.
 
-  __ smull(TMP, R0, R1);
-  __ AsrImmediate(TMP2, TMP, 31);
-  // TMP: result bits 31..63.
+  __ mul(TMP, R0, R1);
+  __ smulh(TMP2, R0, R1);
+  // TMP: result bits 64..127.
   __ cmp(TMP2, Operand(TMP, ASR, 63));
   __ b(&fall_through, NE);
   __ mov(R0, TMP);
@@ -420,7 +417,7 @@
 
   // Check the corner case of dividing the 'MIN_SMI' with -1, in which case we
   // cannot tag the result.
-  __ CompareImmediate(R0, 0x40000000);
+  __ CompareImmediate(R0, 0x4000000000000000);
   __ b(&fall_through, EQ);
   __ SmiTag(R0);  // Not equal. Okay to tag and return.
   __ ret();       // Return.
@@ -431,9 +428,8 @@
   Label fall_through;
   __ ldr(R0, Address(SP, +0 * kWordSize));  // Grab first argument.
   __ BranchIfNotSmi(R0, &fall_through);
-  __ negsw(R0, R0);
+  __ negs(R0, R0);
   __ b(&fall_through, VS);
-  __ sxtw(R0, R0);  // Sign extend - flags not affected.
   __ ret();
   __ Bind(&fall_through);
 }
@@ -492,9 +488,9 @@
   // Check if count too large for handling it inlined.
   __ SmiUntag(TMP, right);  // SmiUntag right into TMP.
   // Overflow test (preserve left, right, and TMP);
-  __ lslvw(temp, left, TMP);
-  __ asrvw(TMP2, temp, TMP);
-  __ cmpw(left, Operand(TMP2));
+  __ lslv(temp, left, TMP);
+  __ asrv(TMP2, temp, TMP);
+  __ CompareRegisters(left, TMP2);
   __ b(&fall_through, NE);  // Overflow.
   // Shift for result now we know there is no overflow.
   __ lslv(result, left, TMP);
@@ -567,7 +563,6 @@
 
   __ CompareClassId(R0, kDoubleCid);
   __ b(&fall_through, EQ);
-  __ AssertSmiInRange(R1);
   __ LoadObject(R0, Bool::False());  // Smi == Mint -> false.
   __ ret();
 
@@ -578,7 +573,6 @@
   __ b(&fall_through, NE);
   // Receiver is Mint, return false if right is Smi.
   __ BranchIfNotSmi(R0, &fall_through);
-  __ AssertSmiInRange(R0);
   __ LoadObject(R0, Bool::False());
   __ ret();
   // TODO(srdjan): Implement Mint == Mint comparison.
@@ -1501,12 +1495,11 @@
   __ fcmpd(V0, V0);
   __ b(&fall_through, VS);
 
-  __ fcvtzdsx(R0, V0);
+  __ fcvtzds(R0, V0);
   // Overflow is signaled with minint.
   // Check for overflow and that it fits into Smi.
-  __ AsrImmediate(TMP, R0, 30);
-  __ cmp(TMP, Operand(R0, ASR, 63));
-  __ b(&fall_through, NE);
+  __ CompareImmediate(R0, 0xC000000000000000);
+  __ b(&fall_through, MI);
   __ SmiTag(R0);
   __ ret();
   __ Bind(&fall_through);
@@ -1523,10 +1516,10 @@
   __ fcmpd(V0, V0);
   __ b(&double_hash, VS);
 
-  // Convert double value to signed 32-bit int in R0 and back to a
+  // Convert double value to signed 64-bit int in R0 and back to a
   // double value in V1.
-  __ fcvtzdsw(R0, V0);
-  __ scvtfdw(V1, R0);
+  __ fcvtzds(R0, V0);
+  __ scvtfdx(V1, R0);
 
   // Tag the int as a Smi, making sure that it fits; this checks for
   // overflow in the conversion from double to int. Conversion
@@ -1534,9 +1527,8 @@
   // INT64_MAX or INT64_MIN (saturation).
   Label fall_through;
   ASSERT(kSmiTag == 0 && kSmiTagShift == 1);
-  __ addsw(R0, R0, Operand(R0));
+  __ adds(R0, R0, Operand(R0));
   __ b(&fall_through, VS);
-  __ sxtw(R0, R0);  // Sign extend - flags not affected.
 
   // Compare the two double values. If they are equal, we return the
   // Smi tagged result immediately as the hash code.
diff --git a/runtime/vm/compiler/intrinsifier_x64.cc b/runtime/vm/compiler/intrinsifier_x64.cc
index c8ddf76..1e2574c 100644
--- a/runtime/vm/compiler/intrinsifier_x64.cc
+++ b/runtime/vm/compiler/intrinsifier_x64.cc
@@ -269,10 +269,8 @@
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   // RAX contains right argument.
-  __ AssertSmiInRange(RAX);
-  __ addl(RAX, Address(RSP, +2 * kWordSize));
+  __ addq(RAX, Address(RSP, +2 * kWordSize));
   __ j(OVERFLOW, &fall_through, Assembler::kNearJump);
-  __ movsxd(RAX, RAX);
   // Result is in RAX.
   __ ret();
   __ Bind(&fall_through);
@@ -286,10 +284,8 @@
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   // RAX contains right argument, which is the actual minuend of subtraction.
-  __ AssertSmiInRange(RAX);
-  __ subl(RAX, Address(RSP, +2 * kWordSize));
+  __ subq(RAX, Address(RSP, +2 * kWordSize));
   __ j(OVERFLOW, &fall_through, Assembler::kNearJump);
-  __ movsxd(RAX, RAX);
   // Result is in RAX.
   __ ret();
   __ Bind(&fall_through);
@@ -299,13 +295,10 @@
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   // RAX contains right argument, which is the actual subtrahend of subtraction.
-  __ AssertSmiInRange(RAX);
   __ movq(RCX, RAX);
   __ movq(RAX, Address(RSP, +2 * kWordSize));
-  __ AssertSmiInRange(RAX);
-  __ subl(RAX, RCX);
+  __ subq(RAX, RCX);
   __ j(OVERFLOW, &fall_through, Assembler::kNearJump);
-  __ movsxd(RAX, RAX);
   // Result is in RAX.
   __ ret();
   __ Bind(&fall_through);
@@ -315,12 +308,10 @@
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   // RAX is the right argument.
-  __ AssertSmiInRange(RAX);
   ASSERT(kSmiTag == 0);  // Adjust code below if not the case.
   __ SmiUntag(RAX);
-  __ imull(RAX, Address(RSP, +2 * kWordSize));
+  __ imulq(RAX, Address(RSP, +2 * kWordSize));
   __ j(OVERFLOW, &fall_through, Assembler::kNearJump);
-  __ movsxd(RAX, RAX);
   // Result is in RAX.
   __ ret();
   __ Bind(&fall_through);
@@ -342,9 +333,7 @@
 //   RAX: Untagged fallthrough result (remainder to be adjusted), or
 //   RAX: Tagged return result (remainder).
 static void EmitRemainderOperation(Assembler* assembler) {
-  Label return_zero, try_modulo, not_32bit;
-  __ AssertSmiInRange(RAX);
-  __ AssertSmiInRange(RCX);
+  Label return_zero, try_modulo, not_32bit, done;
   // Check for quick zero results.
   __ cmpq(RAX, Immediate(0));
   __ j(EQUAL, &return_zero, Assembler::kNearJump);
@@ -366,12 +355,33 @@
 
   __ Bind(&try_modulo);
 
+  // Check if both operands fit into 32bits as idiv with 64bit operands
+  // requires twice as many cycles and has much higher latency. We are checking
+  // this before untagging them to avoid corner case dividing INT_MAX by -1 that
+  // raises exception because quotient is too large for 32bit register.
+  __ movsxd(RBX, RAX);
+  __ cmpq(RBX, RAX);
+  __ j(NOT_EQUAL, &not_32bit, Assembler::kNearJump);
+  __ movsxd(RBX, RCX);
+  __ cmpq(RBX, RCX);
+  __ j(NOT_EQUAL, &not_32bit, Assembler::kNearJump);
+
   // Both operands are 31bit smis. Divide using 32bit idiv.
   __ SmiUntag(RAX);
   __ SmiUntag(RCX);
   __ cdq();
   __ idivl(RCX);
   __ movsxd(RAX, RDX);
+  __ jmp(&done, Assembler::kNearJump);
+
+  // Divide using 64bit idiv.
+  __ Bind(&not_32bit);
+  __ SmiUntag(RAX);
+  __ SmiUntag(RCX);
+  __ cqo();
+  __ idivq(RCX);
+  __ movq(RAX, RDX);
+  __ Bind(&done);
 }
 
 // Implementation:
@@ -386,9 +396,7 @@
 void Intrinsifier::Integer_moduloFromInteger(Assembler* assembler) {
   Label fall_through, negative_result;
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ AssertSmiInRange(RAX);
   __ movq(RCX, Address(RSP, +2 * kWordSize));
-  __ AssertSmiInRange(RCX);
   // RAX: Tagged left (dividend).
   // RCX: Tagged right (divisor).
   __ cmpq(RCX, Immediate(0));
@@ -422,17 +430,21 @@
   Label fall_through, not_32bit;
   TestBothArgumentsSmis(assembler, &fall_through);
   // RAX: right argument (divisor)
-  __ AssertSmiInRange(RAX);
   __ cmpq(RAX, Immediate(0));
   __ j(EQUAL, &fall_through, Assembler::kNearJump);
   __ movq(RCX, RAX);
   __ movq(RAX, Address(RSP, +2 * kWordSize));  // Left argument (dividend).
-  __ AssertSmiInRange(RAX);
 
-  // Check the corner case of dividing the 'MIN_SMI' with -1, in which case we
-  // cannot tag the result.
-  __ cmpq(RAX, Immediate(-0x80000000ll));
-  __ j(EQUAL, &fall_through);
+  // Check if both operands fit into 32bits as idiv with 64bit operands
+  // requires twice as many cycles and has much higher latency. We are checking
+  // this before untagging them to avoid corner case dividing INT_MAX by -1 that
+  // raises exception because quotient is too large for 32bit register.
+  __ movsxd(RBX, RAX);
+  __ cmpq(RBX, RAX);
+  __ j(NOT_EQUAL, &not_32bit);
+  __ movsxd(RBX, RCX);
+  __ cmpq(RBX, RCX);
+  __ j(NOT_EQUAL, &not_32bit);
 
   // Both operands are 31bit smis. Divide using 32bit idiv.
   __ SmiUntag(RAX);
@@ -442,6 +454,21 @@
   __ movsxd(RAX, RAX);
   __ SmiTag(RAX);  // Result is guaranteed to fit into a smi.
   __ ret();
+
+  // Divide using 64bit idiv.
+  __ Bind(&not_32bit);
+  __ SmiUntag(RAX);
+  __ SmiUntag(RCX);
+  __ pushq(RDX);  // Preserve RDX in case of 'fall_through'.
+  __ cqo();
+  __ idivq(RCX);
+  __ popq(RDX);
+  // Check the corner case of dividing the 'MIN_SMI' with -1, in which case we
+  // cannot tag the result.
+  __ cmpq(RAX, Immediate(0x4000000000000000));
+  __ j(EQUAL, &fall_through);
+  __ SmiTag(RAX);
+  __ ret();
   __ Bind(&fall_through);
 }
 
@@ -450,10 +477,8 @@
   __ movq(RAX, Address(RSP, +1 * kWordSize));
   __ testq(RAX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi value.
-  __ AssertSmiInRange(RAX);
-  __ cmpq(RAX, Immediate(-0x80000000ll));
-  __ j(EQUAL, &fall_through, Assembler::kNearJump);
   __ negq(RAX);
+  __ j(OVERFLOW, &fall_through, Assembler::kNearJump);
   // Result is in RAX.
   __ ret();
   __ Bind(&fall_through);
@@ -462,7 +487,6 @@
 void Intrinsifier::Integer_bitAndFromInteger(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ AssertSmiInRange(RAX);
   // RAX is the right argument.
   __ andq(RAX, Address(RSP, +2 * kWordSize));
   // Result is in RAX.
@@ -478,7 +502,6 @@
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
   // RAX is the right argument.
-  __ AssertSmiInRange(RAX);
   __ orq(RAX, Address(RSP, +2 * kWordSize));
   // Result is in RAX.
   __ ret();
@@ -494,7 +517,6 @@
   TestBothArgumentsSmis(assembler, &fall_through);
   // RAX is the right argument.
   __ xorq(RAX, Address(RSP, +2 * kWordSize));
-  __ AssertSmiInRange(RAX);
   // Result is in RAX.
   __ ret();
   __ Bind(&fall_through);
@@ -510,32 +532,28 @@
   Label fall_through, overflow;
   TestBothArgumentsSmis(assembler, &fall_through);
   // Shift value is in RAX. Compare with tagged Smi.
-  __ AssertSmiInRange(RAX);
   __ cmpq(RAX, Immediate(Smi::RawValue(Smi::kBits)));
   __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump);
 
   __ SmiUntag(RAX);
   __ movq(RCX, RAX);                           // Shift amount must be in RCX.
   __ movq(RAX, Address(RSP, +2 * kWordSize));  // Value.
-  __ AssertSmiInRange(RAX);
 
   // Overflow test - all the shifted-out bits must be same as the sign bit.
   __ movq(RDI, RAX);
-  __ shll(RAX, RCX);
-  __ sarl(RAX, RCX);
-  __ movsxd(RAX, RAX);
+  __ shlq(RAX, RCX);
+  __ sarq(RAX, RCX);
   __ cmpq(RAX, RDI);
   __ j(NOT_EQUAL, &overflow, Assembler::kNearJump);
 
-  __ shlq(RDI, RCX);  // Shift for result now we know there is no overflow.
-  __ movq(RAX, RDI);
+  __ shlq(RAX, RCX);  // Shift for result now we know there is no overflow.
 
   // RAX is a correctly tagged Smi.
   __ ret();
 
   __ Bind(&overflow);
-  // Mint is used on x64 for integers requiring 64 bit instead of 31 bits as
-  // represented by Smi.
+  // Mint is rarely used on x64 (only for integers requiring 64 bit instead of
+  // 63 bits as represented by Smi).
   __ Bind(&fall_through);
 }
 
@@ -543,7 +561,6 @@
   Label fall_through, true_label;
   TestBothArgumentsSmis(assembler, &fall_through);
   // RAX contains the right argument.
-  __ AssertSmiInRange(RAX);
   __ cmpq(Address(RSP, +2 * kWordSize), RAX);
   __ j(true_condition, &true_label, Assembler::kNearJump);
   __ LoadObject(RAX, Bool::False());
@@ -589,9 +606,6 @@
   __ orq(RAX, RCX);
   __ testq(RAX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &check_for_mint, Assembler::kNearJump);
-  // Or-ing them together should still leave them both as compressible smis.
-  __ AssertSmiInRange(RAX);
-  __ AssertSmiInRange(RCX);
   // Both arguments are smi, '===' is good enough.
   __ LoadObject(RAX, Bool::False());
   __ ret();
@@ -609,21 +623,9 @@
   // Left (receiver) is Smi, return false if right is not Double.
   // Note that an instance of Mint or Bigint never contains a value that can be
   // represented by Smi.
-  __ AssertSmiInRange(RAX);
   __ movq(RAX, Address(RSP, +kArgumentOffset * kWordSize));
   __ CompareClassId(RAX, kDoubleCid);
   __ j(EQUAL, &fall_through);
-#if defined(DEBUG)
-  Label ok;
-  __ CompareClassId(RAX, kMintCid);
-  __ j(NOT_EQUAL, &ok);
-  __ movq(RAX, FieldAddress(RAX, Mint::value_offset()));
-  __ sarq(RCX, Immediate(1));
-  __ cmpq(RAX, RCX);
-  __ j(NOT_EQUAL, &ok);
-  __ Stop("Smi wrapped in a Mint");
-  __ Bind(&ok);
-#endif
   __ LoadObject(RAX, Bool::False());
   __ ret();
 
@@ -635,7 +637,6 @@
   __ movq(RAX, Address(RSP, +kArgumentOffset * kWordSize));
   __ testq(RAX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through);
-  __ AssertSmiInRange(RAX);
   // Smi == Mint -> false.
   __ LoadObject(RAX, Bool::False());
   __ ret();
@@ -665,7 +666,6 @@
   __ Bind(&shift_count_ok);
   __ movq(RCX, RAX);                           // Shift amount must be in RCX.
   __ movq(RAX, Address(RSP, +2 * kWordSize));  // Value.
-  __ AssertSmiInRange(RAX);
   __ SmiUntag(RAX);                            // Value.
   __ sarq(RAX, RCX);
   __ SmiTag(RAX);
@@ -676,7 +676,6 @@
 // Argument is Smi (receiver).
 void Intrinsifier::Smi_bitNegate(Assembler* assembler) {
   __ movq(RAX, Address(RSP, +1 * kWordSize));  // Index.
-  __ AssertSmiInRange(RAX);
   __ notq(RAX);
   __ andq(RAX, Immediate(~kSmiTagMask));  // Remove inverted smi-tag.
   __ ret();
@@ -685,7 +684,6 @@
 void Intrinsifier::Smi_bitLength(Assembler* assembler) {
   ASSERT(kSmiTagShift == 1);
   __ movq(RAX, Address(RSP, +1 * kWordSize));  // Index.
-  __ AssertSmiInRange(RAX);
   // XOR with sign bit to complement bits if value is negative.
   __ movq(RCX, RAX);
   __ sarq(RCX, Immediate(63));  // All 0 or all 1.
@@ -711,7 +709,6 @@
   __ subq(R8, Immediate(2));  // x_used > 0, Smi. R8 = x_used - 1, round up.
   __ sarq(R8, Immediate(2));  // R8 + 1 = number of digit pairs to read.
   __ movq(RCX, Address(RSP, 2 * kWordSize));  // n is Smi
-  __ AssertSmiInRange(RCX);
   __ SmiUntag(RCX);
   __ movq(RBX, Address(RSP, 1 * kWordSize));  // r_digits
   __ movq(RSI, RCX);
@@ -747,7 +744,6 @@
 
   __ movq(RDI, Address(RSP, 4 * kWordSize));  // x_digits
   __ movq(RCX, Address(RSP, 2 * kWordSize));  // n is Smi
-  __ AssertSmiInRange(RCX);
   __ SmiUntag(RCX);
   __ movq(RBX, Address(RSP, 1 * kWordSize));  // r_digits
   __ movq(RDX, RCX);
@@ -1235,7 +1231,6 @@
   __ LoadObject(RAX, Bool::True());
   __ ret();
   __ Bind(&is_smi);
-  __ AssertSmiInRange(RAX);
   __ SmiUntag(RAX);
   __ cvtsi2sdq(XMM1, RAX);
   __ jmp(&double_op);
@@ -1296,7 +1291,6 @@
   __ movsd(FieldAddress(RAX, Double::value_offset()), XMM0);
   __ ret();
   __ Bind(&is_smi);
-  __ AssertSmiInRange(RAX);
   __ SmiUntag(RAX);
   __ cvtsi2sdq(XMM1, RAX);
   __ jmp(&double_op);
@@ -1326,7 +1320,6 @@
   __ testq(RAX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through);
   // Is Smi.
-  __ AssertSmiInRange(RAX);
   __ SmiUntag(RAX);
   __ cvtsi2sdq(XMM1, RAX);
   __ movq(RAX, Address(RSP, +2 * kWordSize));
@@ -1349,7 +1342,6 @@
   __ testq(RAX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through);
   // Is Smi.
-  __ AssertSmiInRange(RAX);
   __ SmiUntag(RAX);
   __ cvtsi2sdq(XMM0, RAX);
   const Class& double_class =
@@ -1420,15 +1412,14 @@
 void Intrinsifier::DoubleToInteger(Assembler* assembler) {
   __ movq(RAX, Address(RSP, +1 * kWordSize));
   __ movsd(XMM0, FieldAddress(RAX, Double::value_offset()));
-  __ cvttsd2sil(RAX, XMM0);
+  __ cvttsd2siq(RAX, XMM0);
   // Overflow is signalled with minint.
   Label fall_through;
   // Check for overflow and that it fits into Smi.
   __ movq(RCX, RAX);
-  __ shll(RCX, Immediate(1));
+  __ shlq(RCX, Immediate(1));
   __ j(OVERFLOW, &fall_through, Assembler::kNearJump);
-  ASSERT(kSmiTagShift == 1 && kSmiTag == 0);
-  __ movsxd(RAX, RCX);
+  __ SmiTag(RAX);
   __ ret();
   __ Bind(&fall_through);
 }
@@ -1440,17 +1431,16 @@
   // back to a double in XMM1.
   __ movq(RCX, Address(RSP, +1 * kWordSize));
   __ movsd(XMM0, FieldAddress(RCX, Double::value_offset()));
-  __ cvttsd2sil(RAX, XMM0);
-  __ cvtsi2sdl(XMM1, RAX);
+  __ cvttsd2siq(RAX, XMM0);
+  __ cvtsi2sdq(XMM1, RAX);
 
   // Tag the int as a Smi, making sure that it fits; this checks for
   // overflow and NaN in the conversion from double to int. Conversion
-  // overflow from cvttsd2sil is signalled with an INT32_MIN value.
+  // overflow from cvttsd2si is signalled with an INT64_MIN value.
   Label fall_through;
   ASSERT(kSmiTag == 0 && kSmiTagShift == 1);
-  __ addl(RAX, RAX);
+  __ addq(RAX, RAX);
   __ j(OVERFLOW, &fall_through, Assembler::kNearJump);
-  __ movsxd(RAX, RAX);
 
   // Compare the two double values. If they are equal, we return the
   // Smi tagged result immediately as the hash code.
@@ -1488,7 +1478,6 @@
   __ movsd(FieldAddress(RAX, Double::value_offset()), XMM0);
   __ ret();
   __ Bind(&is_smi);
-  __ AssertSmiInRange(RAX);
   __ SmiUntag(RAX);
   __ cvtsi2sdq(XMM1, RAX);
   __ jmp(&double_op);
diff --git a/runtime/vm/compiler_stats.h b/runtime/vm/compiler_stats.h
index 412cb61..4a7d49f 100644
--- a/runtime/vm/compiler_stats.h
+++ b/runtime/vm/compiler_stats.h
@@ -78,27 +78,27 @@
   Timer graphcompiler_timer;   // Included in codegen_timer.
   Timer codefinalizer_timer;   // Included in codegen_timer.
 
-  int64_t num_tokens_total;  // Isolate + VM isolate
-  int64_t num_tokens_scanned;
-  int64_t num_tokens_consumed;
-  int64_t num_cached_consts;
-  int64_t num_const_cache_hits;
-  int64_t num_execute_const;
+  ALIGN8 int64_t num_tokens_total;  // Isolate + VM isolate
+  ALIGN8 int64_t num_tokens_scanned;
+  ALIGN8 int64_t num_tokens_consumed;
+  ALIGN8 int64_t num_cached_consts;
+  ALIGN8 int64_t num_const_cache_hits;
+  ALIGN8 int64_t num_execute_const;
 
-  int64_t num_classes_parsed;
-  int64_t num_class_tokens;
-  int64_t num_functions_parsed;     // Num parsed functions.
-  int64_t num_functions_compiled;   // Num unoptimized compilations.
-  int64_t num_functions_optimized;  // Num optimized compilations.
-  int64_t num_func_tokens_compiled;
-  int64_t num_implicit_final_getters;
-  int64_t num_method_extractors;
+  ALIGN8 int64_t num_classes_parsed;
+  ALIGN8 int64_t num_class_tokens;
+  ALIGN8 int64_t num_functions_parsed;     // Num parsed functions.
+  ALIGN8 int64_t num_functions_compiled;   // Num unoptimized compilations.
+  ALIGN8 int64_t num_functions_optimized;  // Num optimized compilations.
+  ALIGN8 int64_t num_func_tokens_compiled;
+  ALIGN8 int64_t num_implicit_final_getters;
+  ALIGN8 int64_t num_method_extractors;
 
-  int64_t src_length;        // Total number of characters in source.
-  int64_t total_code_size;   // Bytes allocated for code and meta info.
-  int64_t total_instr_size;  // Total size of generated code in bytes.
-  int64_t pc_desc_size;
-  int64_t vardesc_size;
+  ALIGN8 int64_t src_length;        // Total number of characters in source.
+  ALIGN8 int64_t total_code_size;   // Bytes allocated for code and meta info.
+  ALIGN8 int64_t total_instr_size;  // Total size of generated code in bytes.
+  ALIGN8 int64_t pc_desc_size;
+  ALIGN8 int64_t vardesc_size;
   char* text;
   bool use_benchmark_output;
 
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index cbf0db4..95b3f87 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -708,14 +708,14 @@
 
 enum Extend {
   kNoExtend = -1,
-  UXTB = 0,  // Zero extend byte.
-  UXTH = 1,  // Zero extend halfword (16 bits).
-  UXTW = 2,  // Zero extend word (32 bits).
-  UXTX = 3,  // Zero extend doubleword (64 bits).
-  SXTB = 4,  // Sign extend byte.
-  SXTH = 5,  // Sign extend halfword (16 bits).
-  SXTW = 6,  // Sign extend word (32 bits).
-  SXTX = 7,  // Sign extend doubleword (64 bits).
+  UXTB = 0,
+  UXTH = 1,
+  UXTW = 2,
+  UXTX = 3,
+  SXTB = 4,
+  SXTH = 5,
+  SXTW = 6,
+  SXTX = 7,
   kMaxExtend = 8,
 };
 
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 6cc86f0..5370e37 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -6579,6 +6579,12 @@
     int sourcefiles_count = sizeof(sourcefiles) / sizeof(Dart_SourceFile);
     lib = TestCase::LoadTestScriptWithDFE(sourcefiles_count, sourcefiles, NULL,
                                           true);
+    if (TestCase::UsingStrongMode()) {
+      EXPECT_ERROR(lib,
+                   "Compilation failed file:///test-lib:4:10:"
+                   " Error: Setter not found: 'foo'");
+      return;
+    }
     EXPECT_VALID(lib);
   } else {
     Dart_Handle url = NewString(TestCase::url());
diff --git a/runtime/vm/globals.h b/runtime/vm/globals.h
index c15516d..4fa43f2 100644
--- a/runtime/vm/globals.h
+++ b/runtime/vm/globals.h
@@ -21,8 +21,9 @@
 #undef OVERFLOW  // From math.h conflicts in constants_ia32.h
 
 namespace dart {
-// Smi value range is from -(2^N) to (2^N)-1.  N=30
-const intptr_t kSmiBits = 30;
+// Smi value range is from -(2^N) to (2^N)-1.
+// N=30 (32-bit build) or N=62 (64-bit build).
+const intptr_t kSmiBits = kBitsPerWord - 2;
 const intptr_t kSmiMax = (static_cast<intptr_t>(1) << kSmiBits) - 1;
 const intptr_t kSmiMin = -(static_cast<intptr_t>(1) << kSmiBits);
 
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
index d8e1d5d..1362438 100644
--- a/runtime/vm/isolate_reload_test.cc
+++ b/runtime/vm/isolate_reload_test.cc
@@ -2782,6 +2782,39 @@
   EXPECT_STREQ("Instance of 'A' Instance of 'B'", SimpleInvokeStr(lib, "main"));
 }
 
+// Tests reload fails when type arguments change.
+// Change: Baz extends Foo<String> -> Baz extends Bar<String, double>
+// Validate: the right error message is returned.
+TEST_CASE(IsolateReload_ChangeInstanceFormat9) {
+  const char* kScript =
+      "class Foo<A> {\n"
+      "  var a;\n"
+      "}\n"
+      "class Bar<B, C> extends Foo<B> {}\n"
+      "class Baz extends Foo<String> {}"
+      "main() {\n"
+      "  new Baz();\n"
+      "  return 43;\n"
+      "}\n";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  EXPECT_EQ(43, SimpleInvoke(lib, "main"));
+
+  const char* kReloadScript =
+      "class Foo<A> {\n"
+      "  var a;\n"
+      "}\n"
+      "class Bar<B, C> extends Foo<B> {}\n"
+      "class Baz extends Bar<String, double> {}"
+      "main() {\n"
+      "  new Baz();\n"
+      "  return 43;\n"
+      "}\n";
+  lib = TestCase::ReloadTestScript(kReloadScript);
+  EXPECT_ERROR(lib, "type parameters have changed");
+}
+
 TEST_CASE(IsolateReload_ShapeChangeRetainsHash) {
   const char* kScript =
       "class A{\n"
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 1106d45..daee540 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -213,6 +213,14 @@
     return value;
   }
 
+  double ReadDouble() {
+    ASSERT((size_ >= 8) && (offset_ >= 0) && (offset_ <= size_ - 8));
+    double value = ReadUnaligned(
+        reinterpret_cast<const double*>(&this->buffer()[offset_]));
+    offset_ += 8;
+    return value;
+  }
+
   uint32_t ReadUInt() {
     ASSERT((size_ >= 1) && (offset_ >= 0) && (offset_ <= size_ - 1));
 
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 4b83212..6a3358c 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -82,8 +82,7 @@
         return true;
       case kDoubleLiteral:
         simple_value_ = &Double::ZoneHandle(
-            Z, Double::New(H.DartString(builder_->ReadStringReference()),
-                           Heap::kOld));  // read string reference.
+            Z, Double::New(builder_->ReadDouble(), Heap::kOld));  // read value.
         *simple_value_ = H.Canonicalize(*simple_value_);
         return true;
       case kTrueLiteral:
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 7c31cf4..1e84c31 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -135,12 +135,10 @@
 Array* Object::vm_isolate_snapshot_object_table_ = NULL;
 Type* Object::dynamic_type_ = NULL;
 Type* Object::void_type_ = NULL;
-Type* Object::vector_type_ = NULL;
 
 RawObject* Object::null_ = reinterpret_cast<RawObject*>(RAW_NULL);
 RawClass* Object::class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 RawClass* Object::dynamic_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::vector_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 RawClass* Object::void_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 RawClass* Object::unresolved_class_class_ =
     reinterpret_cast<RawClass*>(RAW_NULL);
@@ -531,7 +529,6 @@
   vm_isolate_snapshot_object_table_ = Array::ReadOnlyHandle();
   dynamic_type_ = Type::ReadOnlyHandle();
   void_type_ = Type::ReadOnlyHandle();
-  vector_type_ = Type::ReadOnlyHandle();
 
   *null_object_ = Object::null();
   *null_array_ = Array::null();
@@ -884,14 +881,6 @@
   cls.set_is_cycle_free();
   void_class_ = cls.raw();
 
-  cls = Class::New<Instance>(kVectorCid);
-  cls.set_num_type_arguments(0);
-  cls.set_num_own_type_arguments(0);
-  cls.set_is_finalized();
-  cls.set_is_type_finalized();
-  cls.set_is_cycle_free();
-  vector_class_ = cls.raw();
-
   cls = Class::New<Type>();
   cls.set_is_finalized();
   cls.set_is_type_finalized();
@@ -903,9 +892,6 @@
   cls = void_class_;
   *void_type_ = Type::NewNonParameterizedType(cls);
 
-  cls = vector_class_;
-  *vector_type_ = Type::NewNonParameterizedType(cls);
-
   // Since TypeArguments objects are passed as function arguments, make them
   // behave as Dart instances, although they are just VM objects.
   // Note that we cannot set the super type to ObjectType, which does not live
@@ -1007,7 +993,7 @@
 
 void Object::FinishInitOnce(Isolate* isolate) {
   // The type testing stubs we initialize in AbstractType objects for the
-  // canonical type of kDynamicCid/kVoidCid/kVectorCid need to be set in this
+  // canonical type of kDynamicCid/kVoidCid need to be set in this
   // method, which is called after StubCode::InitOnce().
   Instructions& instr = Instructions::Handle();
 
@@ -1016,9 +1002,6 @@
 
   instr = TypeTestingStubGenerator::DefaultCodeForType(*void_type_);
   void_type_->SetTypeTestingStub(instr);
-
-  instr = TypeTestingStubGenerator::DefaultCodeForType(*vector_type_);
-  vector_type_->SetTypeTestingStub(instr);
 }
 
 // An object visitor which will mark all visited objects. This is used to
@@ -4858,21 +4841,20 @@
 
 RawTypeArguments* TypeArguments::Prepend(Zone* zone,
                                          const TypeArguments& other,
+                                         intptr_t other_length,
                                          intptr_t total_length) const {
   if (IsNull() && other.IsNull()) {
-    return Object::null_type_arguments().raw();
+    return TypeArguments::null();
   }
   const TypeArguments& result =
       TypeArguments::Handle(zone, TypeArguments::New(total_length, Heap::kNew));
   AbstractType& type = AbstractType::Handle(zone);
-  const intptr_t split =
-      other.IsNull() ? total_length - Length() : other.Length();
-  for (intptr_t i = 0; i < split; i++) {
+  for (intptr_t i = 0; i < other_length; i++) {
     type = other.IsNull() ? Type::DynamicType() : other.TypeAt(i);
     result.SetTypeAt(i, type);
   }
-  for (intptr_t i = split; i < total_length; i++) {
-    type = IsNull() ? Type::DynamicType() : TypeAt(i - split);
+  for (intptr_t i = other_length; i < total_length; i++) {
+    type = IsNull() ? Type::DynamicType() : TypeAt(i - other_length);
     result.SetTypeAt(i, type);
   }
   return result.Canonicalize();
@@ -5698,7 +5680,7 @@
 }
 
 RawContextScope* Function::context_scope() const {
-  if (IsClosureFunction() || IsConvertedClosureFunction()) {
+  if (IsClosureFunction()) {
     const Object& obj = Object::Handle(raw_ptr()->data_);
     ASSERT(!obj.IsNull());
     return ClosureData::Cast(obj).context_scope();
@@ -5707,7 +5689,7 @@
 }
 
 void Function::set_context_scope(const ContextScope& value) const {
-  if (IsClosureFunction() || IsConvertedClosureFunction()) {
+  if (IsClosureFunction()) {
     const Object& obj = Object::Handle(raw_ptr()->data_);
     ASSERT(!obj.IsNull());
     ClosureData::Cast(obj).set_context_scope(value);
@@ -5799,11 +5781,10 @@
 }
 
 RawFunction* Function::parent_function() const {
-  if (IsClosureFunction() || IsConvertedClosureFunction() ||
-      IsSignatureFunction()) {
+  if (IsClosureFunction() || IsSignatureFunction()) {
     const Object& obj = Object::Handle(raw_ptr()->data_);
     ASSERT(!obj.IsNull());
-    if (IsClosureFunction() || IsConvertedClosureFunction()) {
+    if (IsClosureFunction()) {
       return ClosureData::Cast(obj).parent_function();
     } else {
       return SignatureData::Cast(obj).parent_function();
@@ -5815,7 +5796,7 @@
 void Function::set_parent_function(const Function& value) const {
   const Object& obj = Object::Handle(raw_ptr()->data_);
   ASSERT(!obj.IsNull());
-  if (IsClosureFunction() || IsConvertedClosureFunction()) {
+  if (IsClosureFunction()) {
     ClosureData::Cast(obj).set_parent_function(value);
   } else {
     ASSERT(IsSignatureFunction());
@@ -5828,8 +5809,6 @@
     // The parent function of an implicit closure function is not the enclosing
     // function we are asking about here.
     return false;
-  } else if (IsConvertedClosureFunction()) {
-    return NumParentTypeParameters() > 0;
   }
   Function& parent = Function::Handle(parent_function());
   while (!parent.IsNull()) {
@@ -5842,8 +5821,7 @@
 }
 
 RawFunction* Function::implicit_closure_function() const {
-  if (IsClosureFunction() || IsConvertedClosureFunction() ||
-      IsSignatureFunction() || IsFactory()) {
+  if (IsClosureFunction() || IsSignatureFunction() || IsFactory()) {
     return Function::null();
   }
   const Object& obj = Object::Handle(raw_ptr()->data_);
@@ -5861,8 +5839,7 @@
 }
 
 void Function::set_implicit_closure_function(const Function& value) const {
-  ASSERT(!IsClosureFunction() && !IsSignatureFunction() &&
-         !IsConvertedClosureFunction());
+  ASSERT(!IsClosureFunction() && !IsSignatureFunction());
   const Object& old_data = Object::Handle(raw_ptr()->data_);
   if (is_native()) {
     ASSERT(old_data.IsArray());
@@ -5880,31 +5857,13 @@
   }
 }
 
-RawFunction* Function::converted_closure_function() const {
-  if (IsClosureFunction() || IsSignatureFunction() || IsFactory()) {
-    return Function::null();
-  }
-  const Object& obj = Object::Handle(raw_ptr()->data_);
-  ASSERT(obj.IsNull() || obj.IsFunction());
-  if (obj.IsFunction()) {
-    return Function::Cast(obj).raw();
-  }
-  return Function::null();
-}
-
-void Function::set_converted_closure_function(const Function& value) const {
-  ASSERT(!IsClosureFunction() && !IsSignatureFunction() && !is_native());
-  ASSERT((raw_ptr()->data_ == Object::null()) || value.IsNull());
-  set_data(value);
-}
-
 RawType* Function::ExistingSignatureType() const {
   const Object& obj = Object::Handle(raw_ptr()->data_);
   ASSERT(!obj.IsNull());
   if (IsSignatureFunction()) {
     return SignatureData::Cast(obj).signature_type();
   } else {
-    ASSERT(IsClosureFunction() || IsConvertedClosureFunction());
+    ASSERT(IsClosureFunction());
     return ClosureData::Cast(obj).signature_type();
   }
 }
@@ -5957,7 +5916,7 @@
     SignatureData::Cast(obj).set_signature_type(value);
     ASSERT(!value.IsCanonical() || (value.signature() == this->raw()));
   } else {
-    ASSERT(IsClosureFunction() || IsConvertedClosureFunction());
+    ASSERT(IsClosureFunction());
     ClosureData::Cast(obj).set_signature_type(value);
   }
 }
@@ -5989,9 +5948,6 @@
     case RawFunction::kImplicitClosureFunction:
       return "ImplicitClosureFunction";
       break;
-    case RawFunction::kConvertedClosureFunction:
-      return "ConvertedClosureFunction";
-      break;
     case RawFunction::kSignatureFunction:
       return "SignatureFunction";
       break;
@@ -6237,8 +6193,6 @@
 intptr_t Function::NumParentTypeParameters() const {
   if (IsImplicitClosureFunction()) {
     return 0;
-  } else if (IsConvertedClosureFunction()) {
-    return num_parent_type_parameters();
   }
   Thread* thread = Thread::Current();
   Function& parent = Function::Handle(parent_function());
@@ -6411,8 +6365,7 @@
   }
   if ((k == RawFunction::kClosureFunction) ||
       (k == RawFunction::kImplicitClosureFunction) ||
-      (k == RawFunction::kSignatureFunction) ||
-      (k == RawFunction::kConvertedClosureFunction)) {
+      (k == RawFunction::kSignatureFunction)) {
     return 1;  // Closure object.
   }
   if (!is_static()) {
@@ -7076,8 +7029,7 @@
   result.SetInstructionsSafe(
       Code::Handle(StubCode::LazyCompile_entry()->code()));
   if (kind == RawFunction::kClosureFunction ||
-      kind == RawFunction::kImplicitClosureFunction ||
-      kind == RawFunction::kConvertedClosureFunction) {
+      kind == RawFunction::kImplicitClosureFunction) {
     ASSERT(space == Heap::kOld);
     const ClosureData& data = ClosureData::Handle(ClosureData::New());
     result.set_data(data);
@@ -7149,12 +7101,8 @@
                                                   const Function& parent,
                                                   TokenPosition token_pos) {
   ASSERT((kind == RawFunction::kClosureFunction) ||
-         (kind == RawFunction::kImplicitClosureFunction) ||
-         (kind == RawFunction::kConvertedClosureFunction));
+         (kind == RawFunction::kImplicitClosureFunction));
   ASSERT(!parent.IsNull());
-  // Only static top-level functions are allowed to be converted right now.
-  ASSERT((kind != RawFunction::kConvertedClosureFunction) ||
-         parent.is_static());
   // Use the owner defining the parent function and not the class containing it.
   const Object& parent_owner = Object::Handle(parent.raw_ptr()->owner_);
   ASSERT(!parent_owner.IsNull());
@@ -7183,13 +7131,6 @@
                                     parent, token_pos);
 }
 
-RawFunction* Function::NewConvertedClosureFunction(const String& name,
-                                                   const Function& parent,
-                                                   TokenPosition token_pos) {
-  return NewClosureFunctionWithKind(RawFunction::kConvertedClosureFunction,
-                                    name, parent, token_pos);
-}
-
 RawFunction* Function::NewSignatureFunction(const Object& owner,
                                             const Function& parent,
                                             TokenPosition token_pos,
@@ -7368,202 +7309,6 @@
   }
 }
 
-// Converted closure functions represent a pair of a top-level function and a
-// vector of captured variables.  When being invoked, converted closure
-// functions get the vector as the first argument, and the arguments supplied at
-// the invocation are passed as the remaining arguments to that function.
-//
-// Consider the following example in Kernel:
-//
-//   static method foo(core::int start) → core::Function {
-//     core::int i = 0;
-//     return () → dynamic => start.+(
-//       let final dynamic #t1 = i in
-//         let final dynamic #t2 = i = #t1.+(1) in
-//          #t1
-//     );
-//   }
-//
-// The method [foo] above produces a closure as a result.  The closure captures
-// two variables: function parameter [start] and local variable [i].  Here is
-// how this code would look like after closure conversion:
-//
-//   static method foo(core::int start) → core::Function {
-//     final Vector #context = MakeVector(3);
-//     #context[1] = start;
-//     #context[2] = 0;
-//     return MakeClosure<() → dynamic>(com::closure#foo#function, #context);
-//   }
-//   static method closure#foo#function(Vector #contextParameter) → dynamic {
-//     return (#contextParameter[1]).+(
-//       let final dynamic #t1 = #contextParameter[2] in
-//         let final dynamic #t2 = #contextParameter[2] = #t1.+(1) in
-//           #t1
-//     );
-//   }
-//
-// Converted closure functions are used in VM Closure instances that represent
-// the results of evaluation of [MakeClosure] primitive operations.
-//
-// Internally, converted closure functions are represented with the same Closure
-// class as implicit closure functions (that are used for dealing with
-// tear-offs).  The Closure class instances have two fields, one for the
-// function, and one for the captured context.  Implicit closure functions have
-// pre-defined shape of the context: it's a single variable that is used as
-// 'this'.  Converted closure functions use the context field to store the
-// vector of captured variables that will be supplied as the first argument
-// during invocation.
-//
-// The top-level functions used in converted closure functions are generated
-// during a front-end transformation in Kernel.  Those functions have some
-// common properties:
-//   * they expect the captured context to be passed as the first argument,
-//   * the first argument should be of [Vector] type (index-based storage),
-//   * they retrieve the captured variables from [Vector] explicitly, so they
-//   don't need the variables from the context to be put into their current
-//   scope.
-//
-// During closure-conversion pass in Kernel, the contexts are generated
-// explicitly and are represented as [Vector]s.  Then they are paired together
-// with the top-level functions to form a closure.  When the closure, created
-// this way, is invoked, it should receive the [Vector] as the first argument,
-// and take the rest of the arguments from the invocation.
-//
-// Converted closure functions in VM follow same discipline as implicit closure
-// functions, because they are similar in many ways. For further details, please
-// refer to the following methods:
-//   -> Function::ConvertedClosureFunction
-//   -> StreamingFlowGraphBuilder::BuildGraphOfConvertedClosureFunction
-//   -> StreamingFlowGraphBuilder::BuildGraph (small change that calls
-//      BuildGraphOfConvertedClosureFunction)
-//   -> StreamingFlowGraphBuilder::BuildClosureCreation (converted closure
-//      functions are created here)
-//
-// Function::ConvertedClosureFunction method follows the logic of
-// Function::ImplicitClosureFunction method.
-RawFunction* Function::ConvertedClosureFunction(
-    intptr_t num_parent_type_parameters) const {
-  // Return the existing converted closure function if any.
-  if (converted_closure_function() != Function::null()) {
-    return converted_closure_function();
-  }
-  ASSERT(!IsSignatureFunction() && !IsClosureFunction());
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  // Create closure function.
-  const String& closure_name = String::Handle(zone, name());
-  const Function& closure_function = Function::Handle(
-      zone, NewConvertedClosureFunction(closure_name, *this, token_pos()));
-
-  // Currently only static top-level functions are allowed to be converted.
-  ASSERT(is_static());
-  closure_function.set_context_scope(Object::empty_context_scope());
-
-  // Set closure function's type parameters.
-  {
-    TypeArguments& total_type_parameters =
-        TypeArguments::Handle(type_parameters());
-
-    intptr_t num_type_parameters =
-        total_type_parameters.Length() - num_parent_type_parameters;
-    if (num_type_parameters == 0) {
-      closure_function.set_type_parameters(Object::null_type_arguments());
-    } else {
-      ASSERT(num_type_parameters > 0);
-      TypeArguments& new_type_parameters =
-          TypeArguments::Handle(TypeArguments::New(num_type_parameters));
-
-      for (intptr_t i = 0; i < num_type_parameters; ++i) {
-        new_type_parameters.SetTypeAt(
-            i, AbstractType::Handle(total_type_parameters.TypeAt(
-                   i + num_parent_type_parameters)));
-      }
-      closure_function.set_type_parameters(new_type_parameters);
-    }
-    closure_function.set_num_parent_type_parameters(num_parent_type_parameters);
-  }
-
-  // Set closure function's result type to this result type.
-  closure_function.set_result_type(AbstractType::Handle(zone, result_type()));
-
-  // Set closure function's end token to this end token.
-  closure_function.set_end_token_pos(end_token_pos());
-
-  // Set closure function's formal parameters to this formal parameters,
-  // removing the first parameter over which the currying is done, and adding
-  // the closure class instance as the first parameter.  So, the overall number
-  // of fixed parameters doesn't change.
-  const int num_fixed_params = num_fixed_parameters();
-  const int num_opt_params = NumOptionalParameters();
-  const bool has_opt_pos_params = HasOptionalPositionalParameters();
-  const int num_params = num_fixed_params + num_opt_params;
-
-  closure_function.set_num_fixed_parameters(num_fixed_params);
-  closure_function.SetNumOptionalParameters(num_opt_params, has_opt_pos_params);
-  closure_function.set_parameter_types(
-      Array::Handle(zone, Array::New(num_params, Heap::kOld)));
-  closure_function.set_parameter_names(
-      Array::Handle(zone, Array::New(num_params, Heap::kOld)));
-
-  AbstractType& param_type = AbstractType::Handle(zone);
-  String& param_name = String::Handle(zone);
-
-  // Add implicit closure object as the first parameter.
-  param_type = Type::DynamicType();
-  closure_function.SetParameterTypeAt(0, param_type);
-  closure_function.SetParameterNameAt(0, Symbols::ClosureParameter());
-
-  // All the parameters, but the first one, are the same for the top-level
-  // function being converted, and the method of the closure class that is being
-  // generated.
-  for (int i = 1; i < num_params; i++) {
-    param_type = ParameterTypeAt(i);
-    closure_function.SetParameterTypeAt(i, param_type);
-    param_name = ParameterNameAt(i);
-    closure_function.SetParameterNameAt(i, param_name);
-  }
-  closure_function.set_kernel_offset(kernel_offset());
-
-  const Type& signature_type =
-      Type::Handle(zone, closure_function.SignatureType());
-  if (!signature_type.IsFinalized()) {
-    ClassFinalizer::FinalizeType(Class::Handle(zone, Owner()), signature_type);
-  }
-
-  set_converted_closure_function(closure_function);
-
-  return closure_function.raw();
-}
-
-void Function::DropUncompiledConvertedClosureFunction() const {
-  if (converted_closure_function() != Function::null()) {
-    const Function& func = Function::Handle(converted_closure_function());
-    if (!func.HasCode()) {
-      set_converted_closure_function(Function::Handle());
-    }
-  }
-}
-
-void Function::set_num_parent_type_parameters(intptr_t num) const {
-  if (IsConvertedClosureFunction()) {
-    const Object& obj = Object::Handle(raw_ptr()->data_);
-    ASSERT(!obj.IsNull());
-    ClosureData::Cast(obj).set_num_parent_type_parameters(num);
-    return;
-  }
-  UNREACHABLE();
-}
-
-intptr_t Function::num_parent_type_parameters() const {
-  if (IsConvertedClosureFunction()) {
-    const Object& obj = Object::Handle(raw_ptr()->data_);
-    ASSERT(!obj.IsNull());
-    return ClosureData::Cast(obj).num_parent_type_parameters();
-  }
-  UNREACHABLE();
-  return 0;
-}
-
 void Function::BuildSignatureParameters(
     Thread* thread,
     Zone* zone,
@@ -7771,7 +7516,7 @@
       return script.raw();
     }
   }
-  if (IsClosureFunction() || IsConvertedClosureFunction()) {
+  if (IsClosureFunction()) {
     return Function::Handle(parent_function()).script();
   }
   const Object& obj = Object::Handle(raw_ptr()->owner_);
@@ -8068,7 +7813,6 @@
     case RawFunction::kRegularFunction:
     case RawFunction::kClosureFunction:
     case RawFunction::kImplicitClosureFunction:
-    case RawFunction::kConvertedClosureFunction:
     case RawFunction::kGetterFunction:
     case RawFunction::kSetterFunction:
       kind_str = "";
@@ -8109,14 +7853,6 @@
                      const_str);
 }
 
-intptr_t ClosureData::num_parent_type_parameters() const {
-  return Smi::Value(raw_ptr()->num_parent_type_parameters_);
-}
-
-void ClosureData::set_num_parent_type_parameters(intptr_t value) const {
-  StorePointer(&raw_ptr()->num_parent_type_parameters_, Smi::New(value));
-}
-
 void ClosureData::set_context_scope(const ContextScope& value) const {
   StorePointer(&raw_ptr()->context_scope_, value.raw());
 }
@@ -17073,8 +16809,7 @@
   if (instr.IsNull()) {
     // This only happens during bootstrapping when creating Type objects before
     // we have the instructions.
-    ASSERT(type_class_id() == kDynamicCid || type_class_id() == kVoidCid ||
-           type_class_id() == kVectorCid);
+    ASSERT(type_class_id() == kDynamicCid || type_class_id() == kVoidCid);
     StoreNonPointer(&raw_ptr()->type_test_stub_entry_point_, 0);
   } else {
     StoreNonPointer(&raw_ptr()->type_test_stub_entry_point_,
@@ -17749,10 +17484,6 @@
     ASSERT(Object::dynamic_type().IsCanonical());
     return Object::dynamic_type().raw();
   }
-  if ((type_class_id() == kVectorCid) && (isolate != Dart::vm_isolate())) {
-    ASSERT(Object::vector_type().IsCanonical());
-    return Object::vector_type().raw();
-  }
 
   const Class& cls = Class::Handle(zone, type_class());
 
@@ -22804,7 +22535,7 @@
   if (delayed_type_args.raw() != Object::empty_type_arguments().raw()) {
     num_free_params = kCurrentAndEnclosingFree;
     fn_type_args = delayed_type_args.Prepend(
-        zone, fn_type_args,
+        zone, fn_type_args, sig_fun.NumParentTypeParameters(),
         sig_fun.NumTypeParameters() + sig_fun.NumParentTypeParameters());
   } else {
     num_free_params = kAllFree;
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 60e0288..6a99622 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -498,10 +498,6 @@
     ASSERT(void_type_ != NULL);
     return *void_type_;
   }
-  static const Type& vector_type() {
-    ASSERT(vector_type_ != NULL);
-    return *vector_type_;
-  }
 
   static void set_vm_isolate_snapshot_object_table(const Array& table);
 
@@ -771,7 +767,6 @@
   static RawClass* class_class_;             // Class of the Class vm object.
   static RawClass* dynamic_class_;           // Class of the 'dynamic' type.
   static RawClass* void_class_;              // Class of the 'void' type.
-  static RawClass* vector_class_;            // Class of the 'vector' type.
   static RawClass* unresolved_class_class_;  // Class of UnresolvedClass.
   static RawClass* type_arguments_class_;  // Class of TypeArguments vm object.
   static RawClass* patch_class_class_;     // Class of the PatchClass vm object.
@@ -840,7 +835,6 @@
   static Array* vm_isolate_snapshot_object_table_;
   static Type* dynamic_type_;
   static Type* void_type_;
-  static Type* vector_type_;
 
   friend void ClassTable::Register(const Class& cls);
   friend void RawObject::Validate(Isolate* isolate) const;
@@ -2165,11 +2159,6 @@
   RawArray* parameter_names() const { return raw_ptr()->parameter_names_; }
   void set_parameter_names(const Array& value) const;
 
-  // For converted closure functions: indicate how many type parameters on the
-  // target are actually captured.
-  void set_num_parent_type_parameters(intptr_t num) const;
-  intptr_t num_parent_type_parameters() const;
-
   // The type parameters (and their bounds) are specified as an array of
   // TypeParameter.
   RawTypeArguments* type_parameters() const {
@@ -2291,26 +2280,12 @@
     return implicit_closure_function() != null();
   }
 
-  // Returns true iff a converted closure function has been created
-  // for this function.
-  bool HasConvertedClosureFunction() const {
-    return converted_closure_function() != null();
-  }
-
   // Returns the closure function implicitly created for this function.  If none
   // exists yet, create one and remember it.  Implicit closure functions are
   // used in VM Closure instances that represent results of tear-off operations.
   RawFunction* ImplicitClosureFunction() const;
   void DropUncompiledImplicitClosureFunction() const;
 
-  // Returns the converted closure function created for this function.
-  // If none exists yet, create one and remember it.  See the comment on
-  // ConvertedClosureFunction definition in runtime/vm/object.cc for elaborate
-  // explanation.
-  RawFunction* ConvertedClosureFunction(
-      intptr_t num_parent_type_parameters) const;
-  void DropUncompiledConvertedClosureFunction() const;
-
   // Return the closure implicitly created for this function.
   // If none exists yet, create one and remember it.
   RawInstance* ImplicitStaticClosure() const;
@@ -2640,11 +2615,6 @@
     return kind() == RawFunction::kImplicitClosureFunction;
   }
 
-  // Returns true if this function represents a converted closure function.
-  bool IsConvertedClosureFunction() const {
-    return kind() == RawFunction::kConvertedClosureFunction;
-  }
-
   // Returns true if this function represents a non implicit closure function.
   bool IsNonImplicitClosureFunction() const {
     return IsClosureFunction() && !IsImplicitClosureFunction();
@@ -2731,8 +2701,7 @@
                           Heap::Space space = Heap::kOld);
 
   // Allocates a new Function object representing a closure function
-  // with given kind - kClosureFunction, kImplicitClosureFunction or
-  // kConvertedClosureFunction.
+  // with given kind - kClosureFunction or kImplicitClosureFunction.
   static RawFunction* NewClosureFunctionWithKind(RawFunction::Kind kind,
                                                  const String& name,
                                                  const Function& parent,
@@ -2748,11 +2717,6 @@
                                                  const Function& parent,
                                                  TokenPosition token_pos);
 
-  // Allocates a new Function object representing a converted closure function.
-  static RawFunction* NewConvertedClosureFunction(const String& name,
-                                                  const Function& parent,
-                                                  TokenPosition token_pos);
-
   // Allocates a new Function object representing a signature function.
   // The owner is the scope class of the function type.
   // The parent is the enclosing function or null if none.
@@ -2927,8 +2891,6 @@
   void set_owner(const Object& value) const;
   RawFunction* implicit_closure_function() const;
   void set_implicit_closure_function(const Function& value) const;
-  RawFunction* converted_closure_function() const;
-  void set_converted_closure_function(const Function& value) const;
   RawInstance* implicit_static_closure() const;
   void set_implicit_static_closure(const Instance& closure) const;
   RawScript* eval_script() const;
@@ -2991,9 +2953,6 @@
   RawInstance* implicit_static_closure() const { return raw_ptr()->closure_; }
   void set_implicit_static_closure(const Instance& closure) const;
 
-  intptr_t num_parent_type_parameters() const;
-  void set_num_parent_type_parameters(intptr_t value) const;
-
   static RawClosureData* New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(ClosureData, Object);
@@ -5757,6 +5716,7 @@
 
   RawTypeArguments* Prepend(Zone* zone,
                             const TypeArguments& other,
+                            intptr_t other_length,
                             intptr_t total_length) const;
 
   // Check if the subvector of length 'len' starting at 'from_index' of this
@@ -7913,16 +7873,7 @@
   virtual uword ComputeCanonicalTableHash() const;
 
   static const intptr_t kBytesPerElement = kWordSize;
-  // The length field is a Smi so that sets one limit on the max Array length.
-  // But we also need to be able to represent the length in bytes in an
-  // intptr_t, which is a different limit.  Either may be smaller.  We can't
-  // use Utils::Minimum here because it is not a const expression.
-  static const intptr_t kElementLimitDueToIntptrMax = static_cast<intptr_t>(
-      (kIntptrMax - sizeof(RawArray) - kObjectAlignment + kBytesPerElement) /
-      kBytesPerElement);
-  static const intptr_t kMaxElements = kSmiMax < kElementLimitDueToIntptrMax
-                                           ? kSmiMax
-                                           : kElementLimitDueToIntptrMax;
+  static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
   static const intptr_t kMaxNewSpaceElements =
       (Heap::kNewAllocatableSize - sizeof(RawArray)) / kBytesPerElement;
 
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 17eadb0..4890d04 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -308,10 +308,16 @@
   EXPECT(Smi::IsValid(-15));
   EXPECT(Smi::IsValid(0xFFu));
 // Upper two bits must be either 00 or 11.
+#if defined(ARCH_IS_64_BIT)
+  EXPECT(!Smi::IsValid(kMaxInt64));
+  EXPECT(Smi::IsValid(0x3FFFFFFFFFFFFFFF));
+  EXPECT(Smi::IsValid(-1));
+#else
   EXPECT(!Smi::IsValid(kMaxInt32));
   EXPECT(Smi::IsValid(0x3FFFFFFF));
   EXPECT(Smi::IsValid(-1));
   EXPECT(!Smi::IsValid(0xFFFFFFFFu));
+#endif
 
   EXPECT_EQ(5, smi.AsInt64Value());
   EXPECT_EQ(5.0, smi.AsDoubleValue());
@@ -439,6 +445,9 @@
 }
 
 ISOLATE_UNIT_TEST_CASE(Mint) {
+// On 64-bit architectures a Smi is stored in a 64 bit word. A Midint cannot
+// be allocated if it does fit into a Smi.
+#if !defined(ARCH_IS_64_BIT)
   {
     Mint& med = Mint::Handle();
     EXPECT(med.IsNull());
@@ -508,6 +517,7 @@
   EXPECT_EQ(mint1.value(), mint_value);
   EXPECT_EQ(mint2.value(), mint_value);
   EXPECT_EQ(mint1.raw(), mint2.raw());
+#endif
 }
 
 ISOLATE_UNIT_TEST_CASE(Double) {
@@ -2737,6 +2747,22 @@
   EXPECT(Smi::Cast(result).Value() == kSmiTestValue);
 }
 
+#if defined(ARCH_IS_64_BIT)
+// Test for Embedded Smi object in the instructions.
+ISOLATE_UNIT_TEST_CASE(EmbedSmiIn64BitCode) {
+  extern void GenerateEmbedSmiInCode(Assembler * assembler, intptr_t value);
+  const intptr_t kSmiTestValue = DART_INT64_C(5) << 32;
+  Assembler _assembler_;
+  GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
+  const Function& function =
+      Function::Handle(CreateFunction("Test_EmbedSmiIn64BitCode"));
+  const Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_));
+  function.AttachCode(code);
+  const Object& result =
+      Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array()));
+  EXPECT(Smi::Cast(result).Value() == kSmiTestValue);
+}
+#endif  // ARCH_IS_64_BIT
 
 ISOLATE_UNIT_TEST_CASE(ExceptionHandlers) {
   const int kNumEntries = 4;
@@ -3268,9 +3294,9 @@
 
   const char* lib_url =
       isolate->use_dart_frontend() ? "file:///test-lib" : "test-lib";
-  const size_t kExpectedLen = 512;
-  char expected[kExpectedLen];
-  snprintf(expected, kExpectedLen,
+  const size_t kBufferSize = 1024;
+  char expected[kBufferSize];
+  snprintf(expected, kBufferSize,
            "Unhandled exception:\n"
            "MyException\n"
            "#0      baz (%1$s:2:3)\n"
diff --git a/runtime/vm/os.h b/runtime/vm/os.h
index 1fde4da..94bb98d 100644
--- a/runtime/vm/os.h
+++ b/runtime/vm/os.h
@@ -120,9 +120,9 @@
   // Shut down the OS class.
   static void Shutdown();
 
-  static void Abort();
+  static DART_NORETURN void Abort();
 
-  static void Exit(int code);
+  static DART_NORETURN void Exit(int code);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 129152f..29fb803 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -200,8 +200,7 @@
 
   const bool load_optional_arguments = function.HasOptionalParameters();
 
-  const bool check_arguments =
-      (function_.IsClosureFunction() || function_.IsConvertedClosureFunction());
+  const bool check_arguments = function_.IsClosureFunction();
 
   const bool need_argument_descriptor =
       load_optional_arguments || check_arguments || reify_generic_argument;
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index 79d0c68..b657c8d 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -32,20 +32,20 @@
 
 struct ProfilerCounters {
   // Count of bail out reasons:
-  int64_t bail_out_unknown_task;
-  int64_t bail_out_jump_to_exception_handler;
-  int64_t bail_out_check_isolate;
+  ALIGN8 int64_t bail_out_unknown_task;
+  ALIGN8 int64_t bail_out_jump_to_exception_handler;
+  ALIGN8 int64_t bail_out_check_isolate;
   // Count of single frame sampling reasons:
-  int64_t single_frame_sample_deoptimizing;
-  int64_t single_frame_sample_register_check;
-  int64_t single_frame_sample_get_and_validate_stack_bounds;
+  ALIGN8 int64_t single_frame_sample_deoptimizing;
+  ALIGN8 int64_t single_frame_sample_register_check;
+  ALIGN8 int64_t single_frame_sample_get_and_validate_stack_bounds;
   // Count of stack walkers used:
-  int64_t stack_walker_native;
-  int64_t stack_walker_dart_exit;
-  int64_t stack_walker_dart;
-  int64_t stack_walker_none;
+  ALIGN8 int64_t stack_walker_native;
+  ALIGN8 int64_t stack_walker_dart_exit;
+  ALIGN8 int64_t stack_walker_dart;
+  ALIGN8 int64_t stack_walker_none;
   // Count of failed checks:
-  int64_t failure_native_allocation_sample;
+  ALIGN8 int64_t failure_native_allocation_sample;
 };
 
 class Profiler : public AllStatic {
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 89875ca..e0128b1 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -188,12 +188,10 @@
       kByteBufferCid,
 
   // The following entries do not describe a predefined class, but instead
-  // are class indexes for pre-allocated instances (Null, dynamic, Void and
-  // Vector).
+  // are class indexes for pre-allocated instances (Null, dynamic and Void).
   kNullCid,
   kDynamicCid,
   kVoidCid,
-  kVectorCid,
 
   kNumPredefinedCids,
 };
@@ -399,7 +397,7 @@
     UpdateTagBit<MarkBit>(false);
   }
   // Returns false if the bit was already set.
-  // TODO(koda): Add "must use result" annotation here, after we add support.
+  DART_WARN_UNUSED_RESULT
   bool TryAcquireMarkBit() { return TryAcquireTagBit<MarkBit>(); }
 
   // Support for object tags.
@@ -426,7 +424,7 @@
     ptr()->tags_ = RememberedBit::update(false, tags);
   }
   // Returns false if the bit was already set.
-  // TODO(koda): Add "must use result" annotation here, after we add support.
+  DART_WARN_UNUSED_RESULT
   bool TryAcquireRememberedBit() { return TryAcquireTagBit<RememberedBit>(); }
 
 #define DEFINE_IS_CID(clazz)                                                   \
@@ -862,7 +860,6 @@
     kRegularFunction,
     kClosureFunction,
     kImplicitClosureFunction,
-    kConvertedClosureFunction,
     kSignatureFunction,  // represents a signature only without actual code.
     kGetterFunction,     // represents getter functions e.g: get foo() { .. }.
     kSetterFunction,     // represents setter functions e.g: set foo(..) { .. }.
@@ -987,8 +984,7 @@
   RawFunction* parent_function_;  // Enclosing function of this local function.
   RawType* signature_type_;
   RawInstance* closure_;  // Closure object for static implicit closures.
-  RawSmi* num_parent_type_parameters_;  // For converted closures only
-  VISIT_TO(RawObject*, num_parent_type_parameters_);
+  VISIT_TO(RawObject*, closure_);
 
   friend class Function;
 };
diff --git a/runtime/vm/regexp.cc b/runtime/vm/regexp.cc
index 3d23411..4d99e0f 100644
--- a/runtime/vm/regexp.cc
+++ b/runtime/vm/regexp.cc
@@ -3023,19 +3023,10 @@
                               Trace* current_trace,
                               PreloadState* state) {
   if (state->eats_at_least_ == PreloadState::kEatsAtLeastNotYetInitialized) {
-    // On ARM64, only read 16 bits ahead for now.  This ensures that boxing is
-    // trivial even with the new smaller Smis.  See
-    // https://github.com/dart-lang/sdk/issues/29951 and
-    // LoadCodeUnitsInstr::EmitNativeCode.
-#if defined(TARGET_ARCH_ARM64)
-    const int kMaxBytesLoaded = 2;
-#else
-    const int kMaxBytesLoaded = 4;
-#endif
-    const int kMaxTwoByteCharactersLoaded = kMaxBytesLoaded / 2;
-    state->eats_at_least_ = EatsAtLeast(
-        compiler->one_byte() ? kMaxBytesLoaded : kMaxTwoByteCharactersLoaded,
-        kRecursionBudget, current_trace->at_start() == Trace::FALSE_VALUE);
+    // Save some time by looking at most one machine word ahead.
+    state->eats_at_least_ =
+        EatsAtLeast(compiler->one_byte() ? 4 : 2, kRecursionBudget,
+                    current_trace->at_start() == Trace::FALSE_VALUE);
   }
   state->preload_characters_ =
       CalculatePreloadCharacters(compiler, state->eats_at_least_);
diff --git a/runtime/vm/regexp_parser.cc b/runtime/vm/regexp_parser.cc
index 5d10d08..bd6b1e3 100644
--- a/runtime/vm/regexp_parser.cc
+++ b/runtime/vm/regexp_parser.cc
@@ -557,8 +557,8 @@
           ReportError("Nothing to repeat");
           UNREACHABLE();
         }
-        // fallthrough
       }
+      /* Falls through */
       default:
         builder->AddCharacter(current());
         Advance();
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 926b75e..3db2d65 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -3199,21 +3199,13 @@
       set_vregisterd(vd, 1, 0);
     } else if (instr->Bits(16, 5) == 24) {
       // Format(instr, "fcvtzds'sf 'rd, 'vn");
-      const intptr_t max = instr->Bit(31) == 1 ? INT64_MAX : INT32_MAX;
-      const intptr_t min = instr->Bit(31) == 1 ? INT64_MIN : INT32_MIN;
       const double vn_val = bit_cast<double, int64_t>(get_vregisterd(vn, 0));
-      int64_t result;
-      if (vn_val >= static_cast<double>(max)) {
-        result = max;
-      } else if (vn_val <= static_cast<double>(min)) {
-        result = min;
+      if (vn_val >= static_cast<double>(INT64_MAX)) {
+        set_register(instr, rd, INT64_MAX, instr->RdMode());
+      } else if (vn_val <= static_cast<double>(INT64_MIN)) {
+        set_register(instr, rd, INT64_MIN, instr->RdMode());
       } else {
-        result = static_cast<int64_t>(vn_val);
-      }
-      if (instr->Bit(31) == 1) {
-        set_register(instr, rd, result, instr->RdMode());
-      } else {
-        set_register(instr, rd, result & 0xffffffffll, instr->RdMode());
+        set_register(instr, rd, static_cast<int64_t>(vn_val), instr->RdMode());
       }
     } else {
       UnimplementedInstruction(instr);
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index c9906c3..487143f 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -636,11 +636,11 @@
 // __builtin_s{add,sub,mul}_overflow() intrinsics here and below.
 // Note that they may clobber the output location even when there is overflow:
 // https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html
-DART_FORCE_INLINE static bool SignedAddWithOverflow(int32_t lhs,
-                                                    int32_t rhs,
+DART_FORCE_INLINE static bool SignedAddWithOverflow(intptr_t lhs,
+                                                    intptr_t rhs,
                                                     intptr_t* out) {
   intptr_t res = 1;
-#if defined(HOST_ARCH_IA32)
+#if defined(HOST_ARCH_IA32) || defined(HOST_ARCH_X64)
   asm volatile(
       "add %2, %1\n"
       "jo 1f;\n"
@@ -650,19 +650,7 @@
       : "+r"(res), "+r"(lhs)
       : "r"(rhs), "r"(out)
       : "cc");
-#elif defined(HOST_ARCH_X64)
-  int64_t tmp;
-  asm volatile(
-      "addl %[rhs], %[lhs]\n"
-      "jo 1f;\n"
-      "xor %[res], %[res]\n"
-      "movslq %[lhs], %[tmp]\n"
-      "mov %[tmp], 0(%[out])\n"
-      "1: "
-      : [res] "+r"(res), [lhs] "+r"(lhs), [tmp] "=&r"(tmp)
-      : [rhs] "r"(rhs), [out] "r"(out)
-      : "cc");
-#elif defined(HOST_ARCH_ARM)
+#elif defined(HOST_ARCH_ARM) || defined(HOST_ARCH_ARM64)
   asm volatile(
       "adds %1, %1, %2;\n"
       "bvs 1f;\n"
@@ -672,28 +660,17 @@
       : "+r"(res), "+r"(lhs)
       : "r"(rhs), "r"(out)
       : "cc");
-#elif defined(HOST_ARCH_ARM64)
-  asm volatile(
-      "adds %w1, %w1, %w2;\n"
-      "bvs 1f;\n"
-      "sxtw %x1, %w1;\n"
-      "mov %0, #0;\n"
-      "str %x1, [%3, #0]\n"
-      "1:"
-      : "+r"(res), "+r"(lhs)
-      : "r"(rhs), "r"(out)
-      : "cc");
 #else
 #error "Unsupported platform"
 #endif
   return (res != 0);
 }
 
-DART_FORCE_INLINE static bool SignedSubWithOverflow(int32_t lhs,
-                                                    int32_t rhs,
+DART_FORCE_INLINE static bool SignedSubWithOverflow(intptr_t lhs,
+                                                    intptr_t rhs,
                                                     intptr_t* out) {
   intptr_t res = 1;
-#if defined(HOST_ARCH_IA32)
+#if defined(HOST_ARCH_IA32) || defined(HOST_ARCH_X64)
   asm volatile(
       "sub %2, %1\n"
       "jo 1f;\n"
@@ -703,19 +680,7 @@
       : "+r"(res), "+r"(lhs)
       : "r"(rhs), "r"(out)
       : "cc");
-#elif defined(HOST_ARCH_X64)
-  int64_t tmp;
-  asm volatile(
-      "subl %[rhs], %[lhs]\n"
-      "jo 1f;\n"
-      "xor %[res], %[res]\n"
-      "movslq %[lhs], %[tmp]\n"
-      "mov %[tmp], 0(%[out])\n"
-      "1: "
-      : [res] "+r"(res), [lhs] "+r"(lhs), [tmp] "=&r"(tmp)
-      : [rhs] "r"(rhs), [out] "r"(out)
-      : "cc");
-#elif defined(HOST_ARCH_ARM)
+#elif defined(HOST_ARCH_ARM) || defined(HOST_ARCH_ARM64)
   asm volatile(
       "subs %1, %1, %2;\n"
       "bvs 1f;\n"
@@ -725,28 +690,17 @@
       : "+r"(res), "+r"(lhs)
       : "r"(rhs), "r"(out)
       : "cc");
-#elif defined(HOST_ARCH_ARM64)
-  asm volatile(
-      "subs %w1, %w1, %w2;\n"
-      "bvs 1f;\n"
-      "sxtw %x1, %w1;\n"
-      "mov %0, #0;\n"
-      "str %x1, [%3, #0]\n"
-      "1:"
-      : "+r"(res), "+r"(lhs)
-      : "r"(rhs), "r"(out)
-      : "cc");
 #else
 #error "Unsupported platform"
 #endif
   return (res != 0);
 }
 
-DART_FORCE_INLINE static bool SignedMulWithOverflow(int32_t lhs,
-                                                    int32_t rhs,
+DART_FORCE_INLINE static bool SignedMulWithOverflow(intptr_t lhs,
+                                                    intptr_t rhs,
                                                     intptr_t* out) {
   intptr_t res = 1;
-#if defined(HOST_ARCH_IA32)
+#if defined(HOST_ARCH_IA32) || defined(HOST_ARCH_X64)
   asm volatile(
       "imul %2, %1\n"
       "jo 1f;\n"
@@ -756,18 +710,6 @@
       : "+r"(res), "+r"(lhs)
       : "r"(rhs), "r"(out)
       : "cc");
-#elif defined(HOST_ARCH_X64)
-  int64_t tmp;
-  asm volatile(
-      "imull %[rhs], %[lhs]\n"
-      "jo 1f;\n"
-      "xor %[res], %[res]\n"
-      "movslq %[lhs], %[tmp]\n"
-      "mov %[tmp], 0(%[out])\n"
-      "1: "
-      : [res] "+r"(res), [lhs] "+r"(lhs), [tmp] "=&r"(tmp)
-      : [rhs] "r"(rhs), [out] "r"(out)
-      : "cc");
 #elif defined(HOST_ARCH_ARM)
   asm volatile(
       "smull %1, ip, %1, %2;\n"
@@ -782,12 +724,12 @@
 #elif defined(HOST_ARCH_ARM64)
   int64_t prod_lo = 0;
   asm volatile(
-      "smull %x1, %w2, %w3\n"
-      "asr %x2, %x1, #63\n"
-      "cmp %x2, %x1, ASR #31;\n"
+      "mul %1, %2, %3\n"
+      "smulh %2, %2, %3\n"
+      "cmp %2, %1, ASR #63;\n"
       "bne 1f;\n"
       "mov %0, #0;\n"
-      "str %x1, [%4, #0]\n"
+      "str %1, [%4, #0]\n"
       "1:"
       : "=r"(res), "+r"(prod_lo), "+r"(lhs)
       : "r"(rhs), "r"(out)
@@ -2029,7 +1971,11 @@
     if (rhs != 0) {
       const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rB]);
       const intptr_t res = (lhs >> kSmiTagSize) / (rhs >> kSmiTagSize);
+#if defined(ARCH_IS_64_BIT)
+      const intptr_t untaggable = 0x4000000000000000LL;
+#else
       const intptr_t untaggable = 0x40000000L;
+#endif  // defined(ARCH_IS_64_BIT)
       if (res != untaggable) {
         *reinterpret_cast<intptr_t*>(&FP[rA]) = res << kSmiTagSize;
         pc++;
@@ -2055,12 +2001,11 @@
   {
     BYTECODE(Shl, A_B_C);
     const intptr_t rhs = reinterpret_cast<intptr_t>(FP[rC]) >> kSmiTagSize;
-    const int kBitsPerInt32 = 32;
-    if (static_cast<uintptr_t>(rhs) < kBitsPerInt32) {
-      const int32_t lhs = reinterpret_cast<intptr_t>(FP[rB]);
-      const int32_t res = lhs << rhs;
+    if (static_cast<uintptr_t>(rhs) < kBitsPerWord) {
+      const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rB]);
+      const intptr_t res = lhs << rhs;
       if (lhs == (res >> rhs)) {
-        *reinterpret_cast<intptr_t*>(&FP[rA]) = static_cast<intptr_t>(res);
+        *reinterpret_cast<intptr_t*>(&FP[rA]) = res;
         pc++;
       }
     }
@@ -2071,7 +2016,8 @@
     BYTECODE(Shr, A_B_C);
     const intptr_t rhs = reinterpret_cast<intptr_t>(FP[rC]) >> kSmiTagSize;
     if (rhs >= 0) {
-      const intptr_t shift_amount = (rhs >= 32) ? (32 - 1) : rhs;
+      const intptr_t shift_amount =
+          (rhs >= kBitsPerWord) ? (kBitsPerWord - 1) : rhs;
       const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rB]) >> kSmiTagSize;
       *reinterpret_cast<intptr_t*>(&FP[rA]) = (lhs >> shift_amount)
                                               << kSmiTagSize;
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 22067a5..dc70397 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -253,6 +253,10 @@
 // here covers most of the 64-bit range. On 32-bit platforms the smi
 // range covers most of the 32-bit range and values outside that
 // range are also represented as mints.
+#if defined(ARCH_IS_64_BIT)
+  EXPECT_EQ(Dart_CObject_kInt64, mint_cobject->type);
+  EXPECT_EQ(value, mint_cobject->value.as_int64);
+#else
   if (kMinInt32 < value && value < kMaxInt32) {
     EXPECT_EQ(Dart_CObject_kInt32, mint_cobject->type);
     EXPECT_EQ(value, mint_cobject->value.as_int32);
@@ -260,6 +264,7 @@
     EXPECT_EQ(Dart_CObject_kInt64, mint_cobject->type);
     EXPECT_EQ(value, mint_cobject->value.as_int64);
   }
+#endif
 }
 
 TEST_CASE(SerializeMints) {
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 401a611..f0354a8 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -1334,18 +1334,14 @@
   __ ldr(R1, Address(SP, +1 * kWordSize));  // Left.
   __ orr(TMP, R0, Operand(R1));
   __ BranchIfNotSmi(TMP, not_smi_or_overflow);
-  __ AssertSmiInRange(R0);
-  __ AssertSmiInRange(R1);
   switch (kind) {
     case Token::kADD: {
-      __ addsw(R0, R1, Operand(R0));  // Adds.
-      __ sxtw(R0, R0);
+      __ adds(R0, R1, Operand(R0));   // Adds.
       __ b(not_smi_or_overflow, VS);  // Branch if overflow.
       break;
     }
     case Token::kSUB: {
-      __ subsw(R0, R1, Operand(R0));  // Subtract.
-      __ sxtw(R0, R0);
+      __ subs(R0, R1, Operand(R0));   // Subtract.
       __ b(not_smi_or_overflow, VS);  // Branch if overflow.
       break;
     }
@@ -1387,8 +1383,6 @@
     __ StoreToOffset(R1, R6, count_offset);
   }
 
-  __ AssertSmiInRange(R0, Assembler::kValueCanBeHeapPointer);
-
   __ ret();
 }
 
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index b21d9db..fc8e781 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -1274,15 +1274,13 @@
   __ j(NOT_ZERO, not_smi_or_overflow);
   switch (kind) {
     case Token::kADD: {
-      __ addl(RAX, RCX);
+      __ addq(RAX, RCX);
       __ j(OVERFLOW, not_smi_or_overflow);
-      __ movsxd(RAX, RAX);
       break;
     }
     case Token::kSUB: {
-      __ subl(RAX, RCX);
+      __ subq(RAX, RCX);
       __ j(OVERFLOW, not_smi_or_overflow);
-      __ movsxd(RAX, RAX);
       break;
     }
     case Token::kEQ: {
diff --git a/runtime/vm/timer.h b/runtime/vm/timer.h
index 7d0efcb..c9e4a19 100644
--- a/runtime/vm/timer.h
+++ b/runtime/vm/timer.h
@@ -87,10 +87,10 @@
     return stop_ - start_;
   }
 
-  int64_t start_;
-  int64_t stop_;
-  int64_t total_;
-  int64_t max_contiguous_;
+  ALIGN8 int64_t start_;
+  ALIGN8 int64_t stop_;
+  ALIGN8 int64_t total_;
+  ALIGN8 int64_t max_contiguous_;
   bool report_;
   bool running_;
   const char* message_;
diff --git a/runtime/vm/token_position.h b/runtime/vm/token_position.h
index eadb562..c28f9a4 100644
--- a/runtime/vm/token_position.h
+++ b/runtime/vm/token_position.h
@@ -18,7 +18,7 @@
 // ClassifyingTokenPositions N -> -1 - N
 //
 // Synthetically created AstNodes are given real source positions but encoded
-// as negative numbers from [kSmiMin, -1 - N]. For example:
+// as negative numbers from [kSmiMin32, -1 - N]. For example:
 //
 // A source position of 0 in a synthetic AstNode would be encoded as -2 - N.
 // A source position of 1 in a synthetic AstNode would be encoded as -3 - N.
@@ -86,7 +86,7 @@
 #undef DECLARE_VALUES
   static const intptr_t kMinSourcePos = 0;
   static const TokenPosition kMinSource;
-  static const intptr_t kMaxSourcePos = kSmiMax - kMaxSentinelDescriptors - 2;
+  static const intptr_t kMaxSourcePos = kSmiMax32 - kMaxSentinelDescriptors - 2;
   static const TokenPosition kMaxSource;
 
   // Decode from a snapshot.
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index 70c1e2c..2a3b85c 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -98,7 +98,7 @@
   if (!StubCode::HasBeenInitialized()) {
     ASSERT(type.IsType());
     const intptr_t cid = Type::Cast(type).type_class_id();
-    ASSERT(cid == kDynamicCid || cid == kVoidCid || cid == kVectorCid);
+    ASSERT(cid == kDynamicCid || cid == kVoidCid);
     return Instructions::null();
   }
 
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 40dfafb..5a3cf37 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -13,7 +13,7 @@
 # or ":copy_libraries" may delete/overwrite your addition, and the build will
 # fail.
 
-import("../build/copy_tree.gni")
+import("copy_tree.gni")
 
 declare_args() {
   # Build a SDK with less stuff. It excludes dart2js, ddc, and web libraries.
diff --git a/build/copy_tree.gni b/sdk/copy_tree.gni
similarity index 100%
rename from build/copy_tree.gni
rename to sdk/copy_tree.gni
diff --git a/sdk/lib/_internal/js_runtime/lib/io_patch.dart b/sdk/lib/_internal/js_runtime/lib/io_patch.dart
index e850ad6..7c88473 100644
--- a/sdk/lib/_internal/js_runtime/lib/io_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/io_patch.dart
@@ -348,7 +348,7 @@
       Map<String, String> environment,
       bool includeParentEnvironment: true,
       bool runInShell: false,
-      ProcessStartMode mode: ProcessStartMode.NORMAL}) {
+      ProcessStartMode mode: ProcessStartMode.normal}) {
     throw new UnsupportedError("Process.start");
   }
 
@@ -358,8 +358,8 @@
       Map<String, String> environment,
       bool includeParentEnvironment: true,
       bool runInShell: false,
-      Encoding stdoutEncoding: SYSTEM_ENCODING,
-      Encoding stderrEncoding: SYSTEM_ENCODING}) {
+      Encoding stdoutEncoding: systemEncoding,
+      Encoding stderrEncoding: systemEncoding}) {
     throw new UnsupportedError("Process.run");
   }
 
@@ -369,13 +369,13 @@
       Map<String, String> environment,
       bool includeParentEnvironment: true,
       bool runInShell: false,
-      Encoding stdoutEncoding: SYSTEM_ENCODING,
-      Encoding stderrEncoding: SYSTEM_ENCODING}) {
+      Encoding stdoutEncoding: systemEncoding,
+      Encoding stderrEncoding: systemEncoding}) {
     throw new UnsupportedError("Process.runSync");
   }
 
   @patch
-  static bool killPid(int pid, [ProcessSignal signal = ProcessSignal.SIGTERM]) {
+  static bool killPid(int pid, [ProcessSignal signal = ProcessSignal.sigterm]) {
     throw new UnsupportedError("Process.killPid");
   }
 }
@@ -408,7 +408,7 @@
   }
   @patch
   static Future<List<InternetAddress>> lookup(String host,
-      {InternetAddressType type: InternetAddressType.ANY}) {
+      {InternetAddressType type: InternetAddressType.any}) {
     throw new UnsupportedError("InternetAddress.lookup");
   }
 
@@ -430,7 +430,7 @@
   static Future<List<NetworkInterface>> list(
       {bool includeLoopback: false,
       bool includeLinkLocal: false,
-      InternetAddressType type: InternetAddressType.ANY}) {
+      InternetAddressType type: InternetAddressType.any}) {
     throw new UnsupportedError("NetworkInterface.list");
   }
 }
diff --git a/sdk/lib/_internal/js_runtime/lib/preambles/jsshell.js b/sdk/lib/_internal/js_runtime/lib/preambles/jsshell.js
index 9f136c2..a6b41c4 100644
--- a/sdk/lib/_internal/js_runtime/lib/preambles/jsshell.js
+++ b/sdk/lib/_internal/js_runtime/lib/preambles/jsshell.js
@@ -18,7 +18,262 @@
 
   self.location = { href: "file://" + workingDirectory + "/" };
 
-   function computeCurrentScript() {
+  // Event loop.
+
+  // Task queue as cyclic list queue.
+  var taskQueue = new Array(8);  // Length is power of 2.
+  var head = 0;
+  var tail = 0;
+  var mask = taskQueue.length - 1;
+  function addTask(elem) {
+    taskQueue[head] = elem;
+    head = (head + 1) & mask;
+    if (head == tail) _growTaskQueue();
+  }
+  function removeTask() {
+    if (head == tail) return;
+    var result = taskQueue[tail];
+    taskQueue[tail] = undefined;
+    tail = (tail + 1) & mask;
+    return result;
+  }
+  function _growTaskQueue() {
+    // head == tail.
+    var length = taskQueue.length;
+    var split = head;
+    taskQueue.length = length * 2;
+    if (split * 2 < length) {  // split < length / 2
+      for (var i = 0; i < split; i++) {
+        taskQueue[length + i] = taskQueue[i];
+        taskQueue[i] = undefined;
+      }
+      head += length;
+    } else {
+      for (var i = split; i < length; i++) {
+        taskQueue[length + i] = taskQueue[i];
+        taskQueue[i] = undefined;
+      }
+      tail += length;
+    }
+    mask = taskQueue.length - 1;
+  }
+
+  // Mapping from timer id to timer function.
+  // The timer id is written on the function as .$timerId.
+  // That field is cleared when the timer is cancelled, but it is not returned
+  // from the queue until its time comes.
+  var timerIds = {};
+  var timerIdCounter = 1;  // Counter used to assign ids.
+
+  // Zero-timer queue as simple array queue using push/shift.
+  var zeroTimerQueue = [];
+
+  function addTimer(f, ms) {
+    var id = timerIdCounter++;
+    f.$timerId = id;
+    timerIds[id] = f;
+    if (ms == 0 && !isNextTimerDue()) {
+      zeroTimerQueue.push(f);
+    } else {
+      addDelayedTimer(f, ms);
+    }
+    return id;
+  }
+
+  function nextZeroTimer() {
+    while (zeroTimerQueue.length > 0) {
+      var action = zeroTimerQueue.shift();
+      if (action.$timerId !== undefined) return action;
+    }
+  }
+
+  function nextEvent() {
+    var action = removeTask();
+    if (action) {
+      return action;
+    }
+    do {
+      action = nextZeroTimer();
+      if (action) break;
+      var nextList = nextDelayedTimerQueue();
+      if (!nextList) {
+        return;
+      }
+      var newTime = nextList.shift();
+      advanceTimeTo(newTime);
+      zeroTimerQueue = nextList;
+    } while (true)
+    var id = action.$timerId;
+    clearTimerId(action, id);
+    return action;
+  }
+
+  // Mocking time.
+  var timeOffset = 0;
+  var now = function() {
+    // Install the mock Date object only once.
+    // Following calls to "now" will just use the new (mocked) Date.now
+    // method directly.
+    installMockDate();
+    now = Date.now;
+    return Date.now();
+  };
+  var originalDate = Date;
+  var originalNow = originalDate.now;
+  function advanceTimeTo(time) {
+    var now = originalNow();
+    if (timeOffset < time - now) {
+      timeOffset = time - now;
+    }
+  }
+  function installMockDate() {
+    var NewDate = function Date(Y, M, D, h, m, s, ms) {
+      if (this instanceof Date) {
+        // Assume a construct call.
+        switch (arguments.length) {
+          case 0:  return new originalDate(originalNow() + timeOffset);
+          case 1:  return new originalDate(Y);
+          case 2:  return new originalDate(Y, M);
+          case 3:  return new originalDate(Y, M, D);
+          case 4:  return new originalDate(Y, M, D, h);
+          case 5:  return new originalDate(Y, M, D, h, m);
+          case 6:  return new originalDate(Y, M, D, h, m, s);
+          default: return new originalDate(Y, M, D, h, m, s, ms);
+        }
+      }
+      return new originalDate(originalNow() + timeOffset).toString();
+    };
+    NewDate.UTC = originalDate.UTC;
+    NewDate.parse = originalDate.parse;
+    NewDate.now = function now() { return originalNow() + timeOffset; };
+    NewDate.prototype = originalDate.prototype;
+    originalDate.prototype.constructor = NewDate;
+    Date = NewDate;
+  }
+
+  // Heap priority queue with key index.
+  // Each entry is list of [timeout, callback1 ... callbackn].
+  var timerHeap = [];
+  var timerIndex = {};
+  function addDelayedTimer(f, ms) {
+    var timeout = now() + ms;
+    var timerList = timerIndex[timeout];
+    if (timerList == null) {
+      timerList = [timeout, f];
+      timerIndex[timeout] = timerList;
+      var index = timerHeap.length;
+      timerHeap.length += 1;
+      bubbleUp(index, timeout, timerList);
+    } else {
+      timerList.push(f);
+    }
+  }
+
+  function isNextTimerDue() {
+    if (timerHeap.length == 0) return false;
+    var head = timerHeap[0];
+    return head[0] < originalNow() + timeOffset;
+  }
+
+  function nextDelayedTimerQueue() {
+    if (timerHeap.length == 0) return null;
+    var result = timerHeap[0];
+    var last = timerHeap.pop();
+    if (timerHeap.length > 0) {
+      bubbleDown(0, last[0], last);
+    }
+    return result;
+  }
+
+  function bubbleUp(index, key, value) {
+    while (index != 0) {
+      var parentIndex = (index - 1) >> 1;
+      var parent = timerHeap[parentIndex];
+      var parentKey = parent[0];
+      if (key > parentKey) break;
+      timerHeap[index] = parent;
+      index = parentIndex;
+    }
+    timerHeap[index] = value;
+  }
+
+  function bubbleDown(index, key, value) {
+    while (true) {
+      var leftChildIndex = index * 2 + 1;
+      if (leftChildIndex >= timerHeap.length) break;
+      var minChildIndex = leftChildIndex;
+      var minChild = timerHeap[leftChildIndex];
+      var minChildKey = minChild[0];
+      var rightChildIndex = leftChildIndex + 1;
+      if (rightChildIndex < timerHeap.length) {
+        var rightChild = timerHeap[rightChildIndex];
+        var rightKey = rightChild[0];
+        if (rightKey < minChildKey) {
+          minChildIndex = rightChildIndex;
+          minChild = rightChild;
+          minChildKey = rightKey;
+        }
+      }
+      if (minChildKey > key) break;
+      timerHeap[index] = minChild;
+      index = minChildIndex;
+    }
+    timerHeap[index] = value;
+  }
+
+  function addInterval(f, ms) {
+    var id = timerIdCounter++;
+    function repeat() {
+      // Reactivate with the same id.
+      repeat.$timerId = id;
+      timerIds[id] = repeat;
+      addDelayedTimer(repeat, ms);
+      f();
+    }
+    repeat.$timerId = id;
+    timerIds[id] = repeat;
+    addDelayedTimer(repeat, ms);
+    return id;
+  }
+
+  function cancelTimer(id) {
+    var f = timerIds[id];
+    if (f == null) return;
+    clearTimerId(f, id);
+  }
+
+  function clearTimerId(f, id) {
+    f.$timerId = undefined;
+    delete timerIds[id];
+  }
+
+  function eventLoop(action) {
+    while (action) {
+      try {
+        action();
+      } catch (e) {
+        if (typeof onerror == "function") {
+          onerror(e, null, -1);
+        } else {
+          throw e;
+        }
+      }
+      action = nextEvent();
+    }
+  }
+
+  self.dartMainRunner = function(main, args) {
+    // Initialize.
+    var action = function() { main(args); }
+    eventLoop(action);
+  };
+  self.setTimeout = addTimer;
+  self.clearTimeout = cancelTimer;
+  self.setInterval = addInterval;
+  self.clearInterval = cancelTimer;
+  self.scheduleImmediate = addTask;
+
+  function computeCurrentScript() {
     try {
       throw new Error();
     } catch(e) {
diff --git a/sdk/lib/io/bytes_builder.dart b/sdk/lib/io/bytes_builder.dart
index b5745e3..3962037 100644
--- a/sdk/lib/io/bytes_builder.dart
+++ b/sdk/lib/io/bytes_builder.dart
@@ -80,7 +80,7 @@
 
 class _CopyingBytesBuilder implements BytesBuilder {
   // Start with 1024 bytes.
-  static const int _INIT_SIZE = 1024;
+  static const int _initSize = 1024;
 
   static final _emptyList = new Uint8List(0);
 
@@ -125,8 +125,8 @@
     // We will create a list in the range of 2-4 times larger than
     // required.
     int newSize = required * 2;
-    if (newSize < _INIT_SIZE) {
-      newSize = _INIT_SIZE;
+    if (newSize < _initSize) {
+      newSize = _initSize;
     } else {
       newSize = _pow2roundup(newSize);
     }
diff --git a/sdk/lib/io/common.dart b/sdk/lib/io/common.dart
index ae9cd12..852a267 100644
--- a/sdk/lib/io/common.dart
+++ b/sdk/lib/io/common.dart
@@ -6,32 +6,32 @@
 
 // Constants used when working with native ports.
 // These must match the constants in runtime/bin/dartutils.h class CObject.
-const int _SUCCESS_RESPONSE = 0;
-const int _ILLEGAL_ARGUMENT_RESPONSE = 1;
-const int _OSERROR_RESPONSE = 2;
-const int _FILE_CLOSED_RESPONSE = 3;
+const int _successResponse = 0;
+const int _illegalArgumentResponse = 1;
+const int _osErrorResponse = 2;
+const int _fileClosedResponse = 3;
 
-const int _ERROR_RESPONSE_ERROR_TYPE = 0;
-const int _OSERROR_RESPONSE_ERROR_CODE = 1;
-const int _OSERROR_RESPONSE_MESSAGE = 2;
+const int _errorResponseErrorType = 0;
+const int _osErrorResponseErrorCode = 1;
+const int _osErrorResponseMessage = 2;
 
 // Functions used to receive exceptions from native ports.
 bool _isErrorResponse(response) =>
-    response is List && response[0] != _SUCCESS_RESPONSE;
+    response is List && response[0] != _successResponse;
 
 /**
  * Returns an Exception or an Error
  */
 _exceptionFromResponse(response, String message, String path) {
   assert(_isErrorResponse(response));
-  switch (response[_ERROR_RESPONSE_ERROR_TYPE]) {
-    case _ILLEGAL_ARGUMENT_RESPONSE:
+  switch (response[_errorResponseErrorType]) {
+    case _illegalArgumentResponse:
       return new ArgumentError("$message: $path");
-    case _OSERROR_RESPONSE:
-      var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
-          response[_OSERROR_RESPONSE_ERROR_CODE]);
+    case _osErrorResponse:
+      var err = new OSError(response[_osErrorResponseMessage],
+          response[_osErrorResponseErrorCode]);
       return new FileSystemException(message, path, err);
-    case _FILE_CLOSED_RESPONSE:
+    case _fileClosedResponse:
       return new FileSystemException("File closed", path);
     default:
       return new Exception("Unknown error");
diff --git a/sdk/lib/io/data_transformer.dart b/sdk/lib/io/data_transformer.dart
index ae409b9..ab0770b 100644
--- a/sdk/lib/io/data_transformer.dart
+++ b/sdk/lib/io/data_transformer.dart
@@ -12,55 +12,85 @@
 abstract class ZLibOption {
   /// Minimal value for [ZLibCodec.windowBits], [ZLibEncoder.windowBits]
   /// and [ZLibDecoder.windowBits].
+  static const int minWindowBits = 8;
+  @Deprecated("Use minWindowBits instead")
   static const int MIN_WINDOW_BITS = 8;
 
   /// Maximal value for [ZLibCodec.windowBits], [ZLibEncoder.windowBits]
   /// and [ZLibDecoder.windowBits].
+  static const int maxWindowBits = 15;
+  @Deprecated("Use maxWindowBits instead")
   static const int MAX_WINDOW_BITS = 15;
 
   /// Default value for [ZLibCodec.windowBits], [ZLibEncoder.windowBits]
   /// and [ZLibDecoder.windowBits].
+  static const int defaultWindowBits = 15;
+  @Deprecated("Use defaultWindowBits instead")
   static const int DEFAULT_WINDOW_BITS = 15;
 
   /// Minimal value for [ZLibCodec.level] and [ZLibEncoder.level].
+  static const int minLevel = -1;
+  @Deprecated("Use minLevel instead")
   static const int MIN_LEVEL = -1;
 
   /// Maximal value for [ZLibCodec.level] and [ZLibEncoder.level]
+  static const int maxLevel = 9;
+  @Deprecated("Use maxLevel instead")
   static const int MAX_LEVEL = 9;
 
   /// Default value for [ZLibCodec.level] and [ZLibEncoder.level].
+  static const int defaultLevel = 6;
+  @Deprecated("Use defaultLevel instead")
   static const int DEFAULT_LEVEL = 6;
 
   /// Minimal value for [ZLibCodec.memLevel] and [ZLibEncoder.memLevel].
+  static const int minMemLevel = 1;
+  @Deprecated("Use minMemLevel instead")
   static const int MIN_MEM_LEVEL = 1;
 
   /// Maximal value for [ZLibCodec.memLevel] and [ZLibEncoder.memLevel].
+  static const int maxMemLevel = 9;
+  @Deprecated("Use maxMemLevel instead")
   static const int MAX_MEM_LEVEL = 9;
 
   /// Default value for [ZLibCodec.memLevel] and [ZLibEncoder.memLevel].
+  static const int defaultMemLevel = 8;
+  @Deprecated("Use defaultMemLevel instead")
   static const int DEFAULT_MEM_LEVEL = 8;
 
   /// Recommended strategy for data produced by a filter (or predictor)
+  static const int strategyFiltered = 1;
+  @Deprecated("Use strategyFiltered instead")
   static const int STRATEGY_FILTERED = 1;
 
   /// Use this strategy to force Huffman encoding only (no string match)
+  static const int strategyHuffmanOnly = 2;
+  @Deprecated("Use strategyHuffmanOnly instead")
   static const int STRATEGY_HUFFMAN_ONLY = 2;
 
   /// Use this strategy to limit match distances to one (run-length encoding)
+  static const int strategyRle = 3;
+  @Deprecated("Use strategyRle instead")
   static const int STRATEGY_RLE = 3;
 
   /// This strategy prevents the use of dynamic Huffman codes, allowing for a
   /// simpler decoder
+  static const int strategyFixed = 4;
+  @Deprecated("Use strategyFixed instead")
   static const int STRATEGY_FIXED = 4;
 
   /// Recommended strategy for normal data
+  static const int strategyDefault = 0;
+  @Deprecated("Use strategyDefault instead")
   static const int STRATEGY_DEFAULT = 0;
 }
 
 /**
  * An instance of the default implementation of the [ZLibCodec].
  */
-const ZLibCodec ZLIB = const ZLibCodec._default();
+const ZLibCodec zlib = const ZLibCodec._default();
+@Deprecated("Use zlib instead")
+const ZLibCodec ZLIB = zlib;
 
 /**
  * The [ZLibCodec] encodes raw bytes to ZLib compressed bytes and decodes ZLib
@@ -93,10 +123,10 @@
   final int memLevel;
 
   /**
-   * Tunes the compression algorithm. Use the value STRATEGY_DEFAULT for normal
-   * data, STRATEGY_FILTERED for data produced by a filter (or predictor),
-   * STRATEGY_HUFFMAN_ONLY to force Huffman encoding only (no string match), or
-   * STRATEGY_RLE to limit match distances to one (run-length encoding).
+   * Tunes the compression algorithm. Use the value strategyDefault for normal
+   * data, strategyFiltered for data produced by a filter (or predictor),
+   * strategyHuffmanOnly to force Huffman encoding only (no string match), or
+   * strategyRle to limit match distances to one (run-length encoding).
    */
   final int strategy;
 
@@ -126,10 +156,10 @@
   final List<int> dictionary;
 
   ZLibCodec(
-      {this.level: ZLibOption.DEFAULT_LEVEL,
-      this.windowBits: ZLibOption.DEFAULT_WINDOW_BITS,
-      this.memLevel: ZLibOption.DEFAULT_MEM_LEVEL,
-      this.strategy: ZLibOption.STRATEGY_DEFAULT,
+      {this.level: ZLibOption.defaultLevel,
+      this.windowBits: ZLibOption.defaultWindowBits,
+      this.memLevel: ZLibOption.defaultMemLevel,
+      this.strategy: ZLibOption.strategyDefault,
       this.dictionary: null,
       this.raw: false,
       this.gzip: false}) {
@@ -140,10 +170,10 @@
   }
 
   const ZLibCodec._default()
-      : level = ZLibOption.DEFAULT_LEVEL,
-        windowBits = ZLibOption.DEFAULT_WINDOW_BITS,
-        memLevel = ZLibOption.DEFAULT_MEM_LEVEL,
-        strategy = ZLibOption.STRATEGY_DEFAULT,
+      : level = ZLibOption.defaultLevel,
+        windowBits = ZLibOption.defaultWindowBits,
+        memLevel = ZLibOption.defaultMemLevel,
+        strategy = ZLibOption.strategyDefault,
         raw = false,
         gzip = false,
         dictionary = null;
@@ -170,7 +200,9 @@
 /**
  * An instance of the default implementation of the [GZipCodec].
  */
-const GZipCodec GZIP = const GZipCodec._default();
+const GZipCodec gzip = const GZipCodec._default();
+@Deprecated("Use gzip instead")
+const GZipCodec GZIP = gzip;
 
 /**
  * The [GZipCodec] encodes raw bytes to GZip compressed bytes and decodes GZip
@@ -207,10 +239,10 @@
 
   /**
    * Tunes the compression algorithm. Use the value
-   * [ZLibOption.STRATEGY_DEFAULT] for normal data,
-   * [ZLibOption.STRATEGY_FILTERED] for data produced by a filter
-   * (or predictor), [ZLibOption.STRATEGY_HUFFMAN_ONLY] to force Huffman
-   * encoding only (no string match), or [ZLibOption.STRATEGY_RLE] to limit
+   * [ZLibOption.strategyDefault] for normal data,
+   * [ZLibOption.strategyFiltered] for data produced by a filter
+   * (or predictor), [ZLibOption.strategyHuffmanOnly] to force Huffman
+   * encoding only (no string match), or [ZLibOption.strategyRle] to limit
    * match distances to one (run-length encoding).
    */
   final int strategy;
@@ -241,10 +273,10 @@
   final bool raw;
 
   GZipCodec(
-      {this.level: ZLibOption.DEFAULT_LEVEL,
-      this.windowBits: ZLibOption.DEFAULT_WINDOW_BITS,
-      this.memLevel: ZLibOption.DEFAULT_MEM_LEVEL,
-      this.strategy: ZLibOption.STRATEGY_DEFAULT,
+      {this.level: ZLibOption.defaultLevel,
+      this.windowBits: ZLibOption.defaultWindowBits,
+      this.memLevel: ZLibOption.defaultMemLevel,
+      this.strategy: ZLibOption.strategyDefault,
       this.dictionary: null,
       this.raw: false,
       this.gzip: true}) {
@@ -255,10 +287,10 @@
   }
 
   const GZipCodec._default()
-      : level = ZLibOption.DEFAULT_LEVEL,
-        windowBits = ZLibOption.DEFAULT_WINDOW_BITS,
-        memLevel = ZLibOption.DEFAULT_MEM_LEVEL,
-        strategy = ZLibOption.STRATEGY_DEFAULT,
+      : level = ZLibOption.defaultLevel,
+        windowBits = ZLibOption.defaultWindowBits,
+        memLevel = ZLibOption.defaultMemLevel,
+        strategy = ZLibOption.strategyDefault,
         raw = false,
         gzip = true,
         dictionary = null;
@@ -314,10 +346,10 @@
 
   /**
    * Tunes the compression algorithm. Use the value
-   * [ZLibOption.STRATEGY_DEFAULT] for normal data,
-   * [ZLibOption.STRATEGY_FILTERED] for data produced by a filter
-   * (or predictor), [ZLibOption.STRATEGY_HUFFMAN_ONLY] to force Huffman
-   * encoding only (no string match), or [ZLibOption.STRATEGY_RLE] to limit
+   * [ZLibOption.strategyDefault] for normal data,
+   * [ZLibOption.strategyFiltered] for data produced by a filter
+   * (or predictor), [ZLibOption.strategyHuffmanOnly] to force Huffman
+   * encoding only (no string match), or [ZLibOption.strategyRle] to limit
    * match distances to one (run-length encoding).
    */
   final int strategy;
@@ -349,10 +381,10 @@
 
   ZLibEncoder(
       {this.gzip: false,
-      this.level: ZLibOption.DEFAULT_LEVEL,
-      this.windowBits: ZLibOption.DEFAULT_WINDOW_BITS,
-      this.memLevel: ZLibOption.DEFAULT_MEM_LEVEL,
-      this.strategy: ZLibOption.STRATEGY_DEFAULT,
+      this.level: ZLibOption.defaultLevel,
+      this.windowBits: ZLibOption.defaultWindowBits,
+      this.memLevel: ZLibOption.defaultMemLevel,
+      this.strategy: ZLibOption.strategyDefault,
       this.dictionary: null,
       this.raw: false}) {
     _validateZLibeLevel(level);
@@ -417,7 +449,7 @@
   final bool raw;
 
   ZLibDecoder(
-      {this.windowBits: ZLibOption.DEFAULT_WINDOW_BITS,
+      {this.windowBits: ZLibOption.defaultWindowBits,
       this.dictionary: null,
       this.raw: false}) {
     _validateZLibWindowBits(windowBits);
@@ -458,10 +490,10 @@
    */
   factory RawZLibFilter.deflateFilter({
     bool gzip: false,
-    int level: ZLibOption.DEFAULT_LEVEL,
-    int windowBits: ZLibOption.DEFAULT_WINDOW_BITS,
-    int memLevel: ZLibOption.DEFAULT_MEM_LEVEL,
-    int strategy: ZLibOption.STRATEGY_DEFAULT,
+    int level: ZLibOption.defaultLevel,
+    int windowBits: ZLibOption.defaultWindowBits,
+    int memLevel: ZLibOption.defaultMemLevel,
+    int strategy: ZLibOption.strategyDefault,
     List<int> dictionary,
     bool raw: false,
   }) {
@@ -474,7 +506,7 @@
    * decompress data.
    */
   factory RawZLibFilter.inflateFilter({
-    int windowBits: ZLibOption.DEFAULT_WINDOW_BITS,
+    int windowBits: ZLibOption.defaultWindowBits,
     List<int> dictionary,
     bool raw: false,
   }) {
@@ -606,35 +638,33 @@
 }
 
 void _validateZLibWindowBits(int windowBits) {
-  if (ZLibOption.MIN_WINDOW_BITS > windowBits ||
-      ZLibOption.MAX_WINDOW_BITS < windowBits) {
+  if (ZLibOption.minWindowBits > windowBits ||
+      ZLibOption.maxWindowBits < windowBits) {
     throw new RangeError.range(
-        windowBits, ZLibOption.MIN_WINDOW_BITS, ZLibOption.MAX_WINDOW_BITS);
+        windowBits, ZLibOption.minWindowBits, ZLibOption.maxWindowBits);
   }
 }
 
 void _validateZLibeLevel(int level) {
-  if (ZLibOption.MIN_LEVEL > level || ZLibOption.MAX_LEVEL < level) {
-    throw new RangeError.range(
-        level, ZLibOption.MIN_LEVEL, ZLibOption.MAX_LEVEL);
+  if (ZLibOption.minLevel > level || ZLibOption.maxLevel < level) {
+    throw new RangeError.range(level, ZLibOption.minLevel, ZLibOption.maxLevel);
   }
 }
 
 void _validateZLibMemLevel(int memLevel) {
-  if (ZLibOption.MIN_MEM_LEVEL > memLevel ||
-      ZLibOption.MAX_MEM_LEVEL < memLevel) {
+  if (ZLibOption.minMemLevel > memLevel || ZLibOption.maxMemLevel < memLevel) {
     throw new RangeError.range(
-        memLevel, ZLibOption.MIN_MEM_LEVEL, ZLibOption.MAX_MEM_LEVEL);
+        memLevel, ZLibOption.minMemLevel, ZLibOption.maxMemLevel);
   }
 }
 
 void _validateZLibStrategy(int strategy) {
   const strategies = const <int>[
-    ZLibOption.STRATEGY_FILTERED,
-    ZLibOption.STRATEGY_HUFFMAN_ONLY,
-    ZLibOption.STRATEGY_RLE,
-    ZLibOption.STRATEGY_FIXED,
-    ZLibOption.STRATEGY_DEFAULT
+    ZLibOption.strategyFiltered,
+    ZLibOption.strategyHuffmanOnly,
+    ZLibOption.strategyRle,
+    ZLibOption.strategyFixed,
+    ZLibOption.strategyDefault
   ];
   if (strategies.indexOf(strategy) == -1) {
     throw new ArgumentError("Unsupported 'strategy'");
diff --git a/sdk/lib/io/directory_impl.dart b/sdk/lib/io/directory_impl.dart
index f74c0f8..8be9257 100644
--- a/sdk/lib/io/directory_impl.dart
+++ b/sdk/lib/io/directory_impl.dart
@@ -58,8 +58,8 @@
   }
 
   Future<bool> exists() {
-    return _File._dispatchWithNamespace(_DIRECTORY_EXISTS, [null, path]).then(
-        (response) {
+    return _File._dispatchWithNamespace(
+        _IOService.directoryExists, [null, path]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionOrErrorFromResponse(response, "Exists failed");
       }
@@ -90,8 +90,8 @@
         }
       });
     } else {
-      return _File._dispatchWithNamespace(_DIRECTORY_CREATE, [null, path]).then(
-          (response) {
+      return _File._dispatchWithNamespace(
+          _IOService.directoryCreate, [null, path]).then((response) {
         if (_isErrorResponse(response)) {
           throw _exceptionOrErrorFromResponse(response, "Creation failed");
         }
@@ -129,7 +129,7 @@
       fullPrefix = "$path${Platform.pathSeparator}$prefix";
     }
     return _File._dispatchWithNamespace(
-        _DIRECTORY_CREATE_TEMP, [null, fullPrefix]).then((response) {
+        _IOService.directoryCreateTemp, [null, fullPrefix]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionOrErrorFromResponse(
             response, "Creation of temporary directory failed");
@@ -160,7 +160,7 @@
 
   Future<Directory> _delete({bool recursive: false}) {
     return _File._dispatchWithNamespace(
-        _DIRECTORY_DELETE, [null, path, recursive]).then((response) {
+        _IOService.directoryDelete, [null, path, recursive]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionOrErrorFromResponse(response, "Deletion failed");
       }
@@ -177,7 +177,7 @@
 
   Future<Directory> rename(String newPath) {
     return _File._dispatchWithNamespace(
-        _DIRECTORY_RENAME, [null, path, newPath]).then((response) {
+        _IOService.directoryRename, [null, path, newPath]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionOrErrorFromResponse(response, "Rename failed");
       }
@@ -223,16 +223,16 @@
   String toString() => "Directory: '$path'";
 
   bool _isErrorResponse(response) =>
-      response is List && response[0] != _SUCCESS_RESPONSE;
+      response is List && response[0] != _successResponse;
 
   _exceptionOrErrorFromResponse(response, String message) {
     assert(_isErrorResponse(response));
-    switch (response[_ERROR_RESPONSE_ERROR_TYPE]) {
-      case _ILLEGAL_ARGUMENT_RESPONSE:
+    switch (response[_errorResponseErrorType]) {
+      case _illegalArgumentResponse:
         return new ArgumentError();
-      case _OSERROR_RESPONSE:
-        var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
-            response[_OSERROR_RESPONSE_ERROR_CODE]);
+      case _osErrorResponse:
+        var err = new OSError(response[_osErrorResponseMessage],
+            response[_osErrorResponseErrorCode]);
         return new FileSystemException(message, path, err);
       default:
         return new Exception("Unknown error");
@@ -247,16 +247,16 @@
 }
 
 class _AsyncDirectoryLister {
-  static const int LIST_FILE = 0;
-  static const int LIST_DIRECTORY = 1;
-  static const int LIST_LINK = 2;
-  static const int LIST_ERROR = 3;
-  static const int LIST_DONE = 4;
+  static const int listFile = 0;
+  static const int listDirectory = 1;
+  static const int listLink = 2;
+  static const int listError = 3;
+  static const int listDone = 4;
 
-  static const int RESPONSE_TYPE = 0;
-  static const int RESPONSE_PATH = 1;
-  static const int RESPONSE_COMPLETE = 1;
-  static const int RESPONSE_ERROR = 2;
+  static const int responseType = 0;
+  static const int responsePath = 1;
+  static const int responseComplete = 1;
+  static const int responseError = 2;
 
   final String path;
   final bool recursive;
@@ -286,7 +286,7 @@
   Stream<FileSystemEntity> get stream => controller.stream;
 
   void onListen() {
-    _File._dispatchWithNamespace(_DIRECTORY_LIST_START,
+    _File._dispatchWithNamespace(_IOService.directoryListStart,
         [null, path, recursive, followLinks]).then((response) {
       if (response is int) {
         _ops = new _AsyncDirectoryListerOps(response);
@@ -330,7 +330,8 @@
       return;
     }
     nextRunning = true;
-    _IOService._dispatch(_DIRECTORY_LIST_NEXT, [pointer]).then((result) {
+    _IOService
+        ._dispatch(_IOService.directoryListNext, [pointer]).then((result) {
       nextRunning = false;
       if (result is List) {
         next();
@@ -338,19 +339,19 @@
         for (int i = 0; i < result.length; i++) {
           assert(i % 2 == 0);
           switch (result[i++]) {
-            case LIST_FILE:
+            case listFile:
               controller.add(new File(result[i]));
               break;
-            case LIST_DIRECTORY:
+            case listDirectory:
               controller.add(new Directory(result[i]));
               break;
-            case LIST_LINK:
+            case listLink:
               controller.add(new Link(result[i]));
               break;
-            case LIST_ERROR:
+            case listError:
               error(result[i]);
               break;
-            case LIST_DONE:
+            case listDone:
               canceled = true;
               return;
           }
@@ -380,20 +381,20 @@
     if (pointer == null) {
       _cleanup();
     } else {
-      _IOService
-          ._dispatch(_DIRECTORY_LIST_STOP, [pointer]).whenComplete(_cleanup);
+      _IOService._dispatch(
+          _IOService.directoryListStop, [pointer]).whenComplete(_cleanup);
     }
   }
 
   void error(message) {
-    var errorType = message[RESPONSE_ERROR][_ERROR_RESPONSE_ERROR_TYPE];
-    if (errorType == _ILLEGAL_ARGUMENT_RESPONSE) {
+    var errorType = message[responseError][_errorResponseErrorType];
+    if (errorType == _illegalArgumentResponse) {
       controller.addError(new ArgumentError());
-    } else if (errorType == _OSERROR_RESPONSE) {
-      var responseError = message[RESPONSE_ERROR];
-      var err = new OSError(responseError[_OSERROR_RESPONSE_MESSAGE],
-          responseError[_OSERROR_RESPONSE_ERROR_CODE]);
-      var errorPath = message[RESPONSE_PATH];
+    } else if (errorType == _osErrorResponse) {
+      var responseErrorInfo = message[responseError];
+      var err = new OSError(responseErrorInfo[_osErrorResponseMessage],
+          responseErrorInfo[_osErrorResponseErrorCode]);
+      var errorPath = message[responsePath];
       if (errorPath == null) errorPath = path;
       controller.addError(
           new FileSystemException("Directory listing failed", errorPath, err));
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index b881bbe..33ce01f 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -9,64 +9,92 @@
  */
 class FileMode {
   /// The mode for opening a file only for reading.
-  static const READ = const FileMode._internal(0);
+  static const read = const FileMode._internal(0);
+  @Deprecated("Use read instead")
+  static const READ = read;
 
   /// Mode for opening a file for reading and writing. The file is
   /// overwritten if it already exists. The file is created if it does not
   /// already exist.
-  static const WRITE = const FileMode._internal(1);
+  static const write = const FileMode._internal(1);
+  @Deprecated("Use write instead")
+  static const WRITE = write;
 
   /// Mode for opening a file for reading and writing to the
   /// end of it. The file is created if it does not already exist.
-  static const APPEND = const FileMode._internal(2);
+  static const append = const FileMode._internal(2);
+  @Deprecated("Use append instead")
+  static const APPEND = append;
 
   /// Mode for opening a file for writing *only*. The file is
   /// overwritten if it already exists. The file is created if it does not
   /// already exist.
-  static const WRITE_ONLY = const FileMode._internal(3);
+  static const writeOnly = const FileMode._internal(3);
+  @Deprecated("Use writeOnly instead")
+  static const WRITE_ONLY = writeOnly;
 
   /// Mode for opening a file for writing *only* to the
   /// end of it. The file is created if it does not already exist.
-  static const WRITE_ONLY_APPEND = const FileMode._internal(4);
+  static const writeOnlyAppend = const FileMode._internal(4);
+  @Deprecated("Use writeOnlyAppend instead")
+  static const WRITE_ONLY_APPEND = writeOnlyAppend;
+
   final int _mode;
 
   const FileMode._internal(this._mode);
 }
 
 /// The mode for opening a file only for reading.
-const READ = FileMode.READ;
+@Deprecated("Use FileMode.read instead")
+const READ = FileMode.read;
 
 /// The mode for opening a file for reading and writing. The file is
 /// overwritten if it already exists. The file is created if it does not
 /// already exist.
-const WRITE = FileMode.WRITE;
+@Deprecated("Use FileMode.write instead")
+const WRITE = FileMode.write;
 
 /// The mode for opening a file for reading and writing to the
 /// end of it. The file is created if it does not already exist.
-const APPEND = FileMode.APPEND;
+@Deprecated("Use FileMode.append instead")
+const APPEND = FileMode.append;
 
 /// Mode for opening a file for writing *only*. The file is
 /// overwritten if it already exists. The file is created if it does not
 /// already exist.
-const WRITE_ONLY = FileMode.WRITE_ONLY;
+@Deprecated("Use FileMode.writeOnly instead")
+const WRITE_ONLY = FileMode.writeOnly;
 
 /// Mode for opening a file for writing *only* to the
 /// end of it. The file is created if it does not already exist.
-const WRITE_ONLY_APPEND = FileMode.WRITE_ONLY_APPEND;
+@Deprecated("Use FileMode.writeOnlyAppend instead")
+const WRITE_ONLY_APPEND = FileMode.writeOnlyAppend;
 
 /// Type of lock when requesting a lock on a file.
-enum FileLock {
+class FileLock {
   /// Shared file lock.
-  SHARED,
+  static const shared = const FileLock._internal(1);
+  @Deprecated("Use shared instead")
+  static const SHARED = shared;
 
   /// Exclusive file lock.
-  EXCLUSIVE,
+  static const exclusive = const FileLock._internal(2);
+  @Deprecated("Use exclusive instead")
+  static const EXCLUSIVE = exclusive;
 
   /// Blocking shared file lock.
-  BLOCKING_SHARED,
+  static const blockingShared = const FileLock._internal(3);
+  @Deprecated("Use blockingShared instead")
+  static const BLOCKING_SHARED = blockingShared;
 
   /// Blocking exclusive file lock.
-  BLOCKING_EXCLUSIVE,
+  static const blockingExclusive = const FileLock._internal(4);
+  @Deprecated("Use blockingExclusive instead")
+  static const BLOCKING_EXCLUSIVE = blockingExclusive;
+
+  final int _type;
+
+  const FileLock._internal(this._type);
 }
 
 /**
@@ -403,16 +431,16 @@
    *
    * Files can be opened in three modes:
    *
-   * [FileMode.READ]: open the file for reading.
+   * [FileMode.read]: open the file for reading.
    *
-   * [FileMode.WRITE]: open the file for both reading and writing and
+   * [FileMode.write]: open the file for both reading and writing and
    * truncate the file to length zero. If the file does not exist the
    * file is created.
    *
-   * [FileMode.APPEND]: same as [FileMode.WRITE] except that the file is
+   * [FileMode.append]: same as [FileMode.write] except that the file is
    * not truncated.
    */
-  Future<RandomAccessFile> open({FileMode mode: FileMode.READ});
+  Future<RandomAccessFile> open({FileMode mode: FileMode.read});
 
   /**
    * Synchronously open the file for random access operations. The
@@ -424,7 +452,7 @@
    *
    * Throws a [FileSystemException] if the operation fails.
    */
-  RandomAccessFile openSync({FileMode mode: FileMode.READ});
+  RandomAccessFile openSync({FileMode mode: FileMode.read});
 
   /**
    * Create a new independent [Stream] for the contents of this file.
@@ -448,8 +476,8 @@
    *
    * An [IOSink] for a file can be opened in two modes:
    *
-   * * [FileMode.WRITE]: truncates the file to length zero.
-   * * [FileMode.APPEND]: sets the initial write position to the end
+   * * [FileMode.write]: truncates the file to length zero.
+   * * [FileMode.append]: sets the initial write position to the end
    *   of the file.
    *
    *  When writing strings through the returned [IOSink] the encoding
@@ -457,7 +485,7 @@
    *  has an `encoding` property which can be changed after the
    *  [IOSink] has been created.
    */
-  IOSink openWrite({FileMode mode: FileMode.WRITE, Encoding encoding: utf8});
+  IOSink openWrite({FileMode mode: FileMode.write, Encoding encoding: utf8});
 
   /**
    * Read the entire file contents as a list of bytes. Returns a
@@ -516,13 +544,13 @@
    *
    * By default [writeAsBytes] creates the file for writing and truncates the
    * file if it already exists. In order to append the bytes to an existing
-   * file, pass [FileMode.APPEND] as the optional mode parameter.
+   * file, pass [FileMode.append] as the optional mode parameter.
    *
    * If the argument [flush] is set to `true`, the data written will be
    * flushed to the file system before the returned future completes.
    */
   Future<File> writeAsBytes(List<int> bytes,
-      {FileMode mode: FileMode.WRITE, bool flush: false});
+      {FileMode mode: FileMode.write, bool flush: false});
 
   /**
    * Synchronously write a list of bytes to a file.
@@ -531,7 +559,7 @@
    *
    * By default [writeAsBytesSync] creates the file for writing and truncates
    * the file if it already exists. In order to append the bytes to an existing
-   * file, pass [FileMode.APPEND] as the optional mode parameter.
+   * file, pass [FileMode.append] as the optional mode parameter.
    *
    * If the [flush] argument is set to `true` data written will be
    * flushed to the file system before returning.
@@ -539,7 +567,7 @@
    * Throws a [FileSystemException] if the operation fails.
    */
   void writeAsBytesSync(List<int> bytes,
-      {FileMode mode: FileMode.WRITE, bool flush: false});
+      {FileMode mode: FileMode.write, bool flush: false});
 
   /**
    * Write a string to a file.
@@ -550,14 +578,14 @@
    *
    * By default [writeAsString] creates the file for writing and truncates the
    * file if it already exists. In order to append the bytes to an existing
-   * file, pass [FileMode.APPEND] as the optional mode parameter.
+   * file, pass [FileMode.append] as the optional mode parameter.
    *
    * If the argument [flush] is set to `true`, the data written will be
    * flushed to the file system before the returned future completes.
    *
    */
   Future<File> writeAsString(String contents,
-      {FileMode mode: FileMode.WRITE,
+      {FileMode mode: FileMode.write,
       Encoding encoding: utf8,
       bool flush: false});
 
@@ -569,7 +597,7 @@
    *
    * By default [writeAsStringSync] creates the file for writing and
    * truncates the file if it already exists. In order to append the bytes
-   * to an existing file, pass [FileMode.APPEND] as the optional mode
+   * to an existing file, pass [FileMode.append] as the optional mode
    * parameter.
    *
    * If the [flush] argument is set to `true` data written will be
@@ -578,7 +606,7 @@
    * Throws a [FileSystemException] if the operation fails.
    */
   void writeAsStringSync(String contents,
-      {FileMode mode: FileMode.WRITE,
+      {FileMode mode: FileMode.write,
       Encoding encoding: utf8,
       bool flush: false});
 
@@ -805,9 +833,9 @@
    *
    * To obtain an exclusive lock on a file it must be opened for writing.
    *
-   * If [mode] is [FileLock.EXCLUSIVE] or [FileLock.SHARED], an error is
+   * If [mode] is [FileLock.exclusive] or [FileLock.shared], an error is
    * signaled if the lock cannot be obtained. If [mode] is
-   * [FileLock.BLOCKING_EXCLUSIVE] or [FileLock.BLOCKING_SHARED], the
+   * [FileLock.blockingExclusive] or [FileLock.blockingShared], the
    * returned [Future] is resolved only when the lock has been obtained.
    *
    * *NOTE* file locking does have slight differences in behavior across
@@ -826,7 +854,7 @@
    * already unlocked".
    */
   Future<RandomAccessFile> lock(
-      [FileLock mode = FileLock.EXCLUSIVE, int start = 0, int end = -1]);
+      [FileLock mode = FileLock.exclusive, int start = 0, int end = -1]);
 
   /**
    * Synchronously locks the file or part of the file.
@@ -843,9 +871,9 @@
    *
    * To obtain an exclusive lock on a file it must be opened for writing.
    *
-   * If [mode] is [FileLock.EXCLUSIVE] or [FileLock.SHARED], an exception is
+   * If [mode] is [FileLock.exclusive] or [FileLock.shared], an exception is
    * thrown if the lock cannot be obtained. If [mode] is
-   * [FileLock.BLOCKING_EXCLUSIVE] or [FileLock.BLOCKING_SHARED], the
+   * [FileLock.blockingExclusive] or [FileLock.blockingShared], the
    * call returns only after the lock has been obtained.
    *
    * *NOTE* file locking does have slight differences in behavior across
@@ -865,7 +893,7 @@
    *
    */
   void lockSync(
-      [FileLock mode = FileLock.EXCLUSIVE, int start = 0, int end = -1]);
+      [FileLock mode = FileLock.exclusive, int start = 0, int end = -1]);
 
   /**
    * Unlocks the file or part of the file.
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index a64fdc2..67a49b7 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -5,7 +5,7 @@
 part of dart.io;
 
 // Read the file in blocks of size 64k.
-const int _BLOCK_SIZE = 64 * 1024;
+const int _blockSize = 64 * 1024;
 
 class _FileStream extends Stream<List<int>> {
   // Stream controller.
@@ -74,7 +74,7 @@
       return;
     }
     _readInProgress = true;
-    int readBytes = _BLOCK_SIZE;
+    int readBytes = _blockSize;
     if (_end != null) {
       readBytes = min(readBytes, _end - _position);
       if (readBytes < 0) {
@@ -147,7 +147,7 @@
 
     if (_path != null) {
       new File(_path)
-          .open(mode: FileMode.READ)
+          .open(mode: FileMode.read)
           .then(onOpenFile, onError: openFailed);
     } else {
       try {
@@ -226,7 +226,8 @@
   }
 
   Future<bool> exists() {
-    return _dispatchWithNamespace(_FILE_EXISTS, [null, path]).then((response) {
+    return _dispatchWithNamespace(_IOService.fileExists, [null, path])
+        .then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "Cannot check existence", path);
       }
@@ -248,7 +249,8 @@
     var result =
         recursive ? parent.create(recursive: true) : new Future.value(null);
     return result
-        .then((_) => _dispatchWithNamespace(_FILE_CREATE, [null, path]))
+        .then(
+            (_) => _dispatchWithNamespace(_IOService.fileCreate, [null, path]))
         .then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "Cannot create file", path);
@@ -275,7 +277,8 @@
     if (recursive) {
       return new Directory(path).delete(recursive: true).then((_) => this);
     }
-    return _dispatchWithNamespace(_FILE_DELETE, [null, path]).then((response) {
+    return _dispatchWithNamespace(_IOService.fileDelete, [null, path])
+        .then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "Cannot delete file", path);
       }
@@ -296,7 +299,7 @@
   }
 
   Future<File> rename(String newPath) {
-    return _dispatchWithNamespace(_FILE_RENAME, [null, path, newPath])
+    return _dispatchWithNamespace(_IOService.fileRename, [null, path, newPath])
         .then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(
@@ -318,7 +321,7 @@
   }
 
   Future<File> copy(String newPath) {
-    return _dispatchWithNamespace(_FILE_COPY, [null, path, newPath])
+    return _dispatchWithNamespace(_IOService.fileCopy, [null, path, newPath])
         .then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(
@@ -336,16 +339,16 @@
     return new File(newPath);
   }
 
-  Future<RandomAccessFile> open({FileMode mode: FileMode.READ}) {
-    if (mode != FileMode.READ &&
-        mode != FileMode.WRITE &&
-        mode != FileMode.APPEND &&
-        mode != FileMode.WRITE_ONLY &&
-        mode != FileMode.WRITE_ONLY_APPEND) {
+  Future<RandomAccessFile> open({FileMode mode: FileMode.read}) {
+    if (mode != FileMode.read &&
+        mode != FileMode.write &&
+        mode != FileMode.append &&
+        mode != FileMode.writeOnly &&
+        mode != FileMode.writeOnlyAppend) {
       return new Future.error(
           new ArgumentError('Invalid file mode for this operation'));
     }
-    return _dispatchWithNamespace(_FILE_OPEN, [null, path, mode._mode])
+    return _dispatchWithNamespace(_IOService.fileOpen, [null, path, mode._mode])
         .then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "Cannot open file", path);
@@ -355,7 +358,7 @@
   }
 
   Future<int> length() {
-    return _dispatchWithNamespace(_FILE_LENGTH_FROM_PATH, [null, path])
+    return _dispatchWithNamespace(_IOService.fileLengthFromPath, [null, path])
         .then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(
@@ -374,7 +377,7 @@
   }
 
   Future<DateTime> lastAccessed() {
-    return _dispatchWithNamespace(_FILE_LAST_ACCESSED, [null, path])
+    return _dispatchWithNamespace(_IOService.fileLastAccessed, [null, path])
         .then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(
@@ -394,8 +397,8 @@
 
   Future setLastAccessed(DateTime time) {
     int millis = time.millisecondsSinceEpoch;
-    return _dispatchWithNamespace(_FILE_SET_LAST_ACCESSED, [null, path, millis])
-        .then((response) {
+    return _dispatchWithNamespace(
+        _IOService.fileSetLastAccessed, [null, path, millis]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "Cannot set access time", path);
       }
@@ -416,7 +419,7 @@
   }
 
   Future<DateTime> lastModified() {
-    return _dispatchWithNamespace(_FILE_LAST_MODIFIED, [null, path])
+    return _dispatchWithNamespace(_IOService.fileLastModified, [null, path])
         .then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(
@@ -436,8 +439,8 @@
 
   Future setLastModified(DateTime time) {
     int millis = time.millisecondsSinceEpoch;
-    return _dispatchWithNamespace(_FILE_SET_LAST_MODIFIED, [null, path, millis])
-        .then((response) {
+    return _dispatchWithNamespace(
+        _IOService.fileSetLastModified, [null, path, millis]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(
             response, "Cannot set modification time", path);
@@ -460,12 +463,12 @@
 
   external static _open(_Namespace namespace, String path, int mode);
 
-  RandomAccessFile openSync({FileMode mode: FileMode.READ}) {
-    if (mode != FileMode.READ &&
-        mode != FileMode.WRITE &&
-        mode != FileMode.APPEND &&
-        mode != FileMode.WRITE_ONLY &&
-        mode != FileMode.WRITE_ONLY_APPEND) {
+  RandomAccessFile openSync({FileMode mode: FileMode.read}) {
+    if (mode != FileMode.read &&
+        mode != FileMode.write &&
+        mode != FileMode.append &&
+        mode != FileMode.writeOnly &&
+        mode != FileMode.writeOnlyAppend) {
       throw new ArgumentError('Invalid file mode for this operation');
     }
     var id = _open(_Namespace._namespace, path, mode._mode);
@@ -487,11 +490,11 @@
     return new _FileStream(path, start, end);
   }
 
-  IOSink openWrite({FileMode mode: FileMode.WRITE, Encoding encoding: utf8}) {
-    if (mode != FileMode.WRITE &&
-        mode != FileMode.APPEND &&
-        mode != FileMode.WRITE_ONLY &&
-        mode != FileMode.WRITE_ONLY_APPEND) {
+  IOSink openWrite({FileMode mode: FileMode.write, Encoding encoding: utf8}) {
+    if (mode != FileMode.write &&
+        mode != FileMode.append &&
+        mode != FileMode.writeOnly &&
+        mode != FileMode.writeOnlyAppend) {
       throw new ArgumentError('Invalid file mode for this operation');
     }
     var consumer = new _FileStreamConsumer(this, mode);
@@ -503,7 +506,7 @@
       var builder = new BytesBuilder(copy: false);
       var completer = new Completer<List<int>>();
       void read() {
-        file.read(_BLOCK_SIZE).then((data) {
+        file.read(_blockSize).then((data) {
           if (data.length > 0) {
             builder.add(data);
             read();
@@ -537,7 +540,7 @@
         // May be character device, try to read it in chunks.
         var builder = new BytesBuilder(copy: false);
         do {
-          data = opened.readSync(_BLOCK_SIZE);
+          data = opened.readSync(_blockSize);
           if (data.length > 0) builder.add(data);
         } while (data.length > 0);
         data = builder.takeBytes();
@@ -583,7 +586,7 @@
       const LineSplitter().convert(readAsStringSync(encoding: encoding));
 
   Future<File> writeAsBytes(List<int> bytes,
-      {FileMode mode: FileMode.WRITE, bool flush: false}) {
+      {FileMode mode: FileMode.write, bool flush: false}) {
     return open(mode: mode).then((file) {
       return file.writeFrom(bytes, 0, bytes.length).then<File>((_) {
         if (flush) return file.flush().then((_) => this);
@@ -593,7 +596,7 @@
   }
 
   void writeAsBytesSync(List<int> bytes,
-      {FileMode mode: FileMode.WRITE, bool flush: false}) {
+      {FileMode mode: FileMode.write, bool flush: false}) {
     RandomAccessFile opened = openSync(mode: mode);
     try {
       opened.writeFromSync(bytes, 0, bytes.length);
@@ -604,7 +607,7 @@
   }
 
   Future<File> writeAsString(String contents,
-      {FileMode mode: FileMode.WRITE,
+      {FileMode mode: FileMode.write,
       Encoding encoding: utf8,
       bool flush: false}) {
     try {
@@ -615,7 +618,7 @@
   }
 
   void writeAsStringSync(String contents,
-      {FileMode mode: FileMode.WRITE,
+      {FileMode mode: FileMode.write,
       Encoding encoding: utf8,
       bool flush: false}) {
     writeAsBytesSync(encoding.encode(contents), mode: mode, flush: flush);
@@ -686,7 +689,8 @@
   }
 
   Future<void> close() {
-    return _dispatch(_FILE_CLOSE, [null], markClosed: true).then((result) {
+    return _dispatch(_IOService.fileClose, [null], markClosed: true)
+        .then((result) {
       if (result == -1) {
         throw new FileSystemException("Cannot close file", path);
       }
@@ -706,7 +710,7 @@
   }
 
   Future<int> readByte() {
-    return _dispatch(_FILE_READ_BYTE, [null]).then((response) {
+    return _dispatch(_IOService.fileReadByte, [null]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "readByte failed", path);
       }
@@ -729,7 +733,7 @@
     if (bytes is! int) {
       throw new ArgumentError(bytes);
     }
-    return _dispatch(_FILE_READ, [null, bytes]).then((response) {
+    return _dispatch(_IOService.fileRead, [null, bytes]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "read failed", path);
       }
@@ -763,7 +767,7 @@
       return new Future.value(0);
     }
     int length = end - start;
-    return _dispatch(_FILE_READ_INTO, [null, length]).then((response) {
+    return _dispatch(_IOService.fileReadInto, [null, length]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "readInto failed", path);
       }
@@ -798,7 +802,7 @@
     if (value is! int) {
       throw new ArgumentError(value);
     }
-    return _dispatch(_FILE_WRITE_BYTE, [null, value]).then((response) {
+    return _dispatch(_IOService.fileWriteByte, [null, value]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "writeByte failed", path);
       }
@@ -843,7 +847,7 @@
     request[1] = result.buffer;
     request[2] = result.start;
     request[3] = end - (start - result.start);
-    return _dispatch(_FILE_WRITE_FROM, request).then((response) {
+    return _dispatch(_IOService.fileWriteFrom, request).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "writeFrom failed", path);
       }
@@ -891,7 +895,7 @@
   }
 
   Future<int> position() {
-    return _dispatch(_FILE_POSITION, [null]).then((response) {
+    return _dispatch(_IOService.filePosition, [null]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "position failed", path);
       }
@@ -909,7 +913,8 @@
   }
 
   Future<RandomAccessFile> setPosition(int position) {
-    return _dispatch(_FILE_SET_POSITION, [null, position]).then((response) {
+    return _dispatch(_IOService.fileSetPosition, [null, position])
+        .then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "setPosition failed", path);
       }
@@ -926,7 +931,7 @@
   }
 
   Future<RandomAccessFile> truncate(int length) {
-    return _dispatch(_FILE_TRUNCATE, [null, length]).then((response) {
+    return _dispatch(_IOService.fileTruncate, [null, length]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "truncate failed", path);
       }
@@ -943,7 +948,7 @@
   }
 
   Future<int> length() {
-    return _dispatch(_FILE_LENGTH, [null]).then((response) {
+    return _dispatch(_IOService.fileLength, [null]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "length failed", path);
       }
@@ -961,7 +966,7 @@
   }
 
   Future<RandomAccessFile> flush() {
-    return _dispatch(_FILE_FLUSH, [null]).then((response) {
+    return _dispatch(_IOService.fileFlush, [null]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "flush failed", path);
       }
@@ -977,29 +982,16 @@
     }
   }
 
-  static const int LOCK_UNLOCK = 0;
-  static const int LOCK_SHARED = 1;
-  static const int LOCK_EXCLUSIVE = 2;
-  static const int LOCK_BLOCKING_SHARED = 3;
-  static const int LOCK_BLOCKING_EXCLUSIVE = 4;
+  static const int lockUnlock = 0;
+  // static const int lockShared = 1;
+  // static const int lockExclusive = 2;
+  // static const int lockBlockingShared = 3;
+  // static const int lockBlockingExclusive = 4;
 
-  int _fileLockValue(FileLock fl) {
-    switch (fl) {
-      case FileLock.SHARED:
-        return LOCK_SHARED;
-      case FileLock.EXCLUSIVE:
-        return LOCK_EXCLUSIVE;
-      case FileLock.BLOCKING_SHARED:
-        return LOCK_BLOCKING_SHARED;
-      case FileLock.BLOCKING_EXCLUSIVE:
-        return LOCK_BLOCKING_EXCLUSIVE;
-      default:
-        return -1;
-    }
-  }
+  int _fileLockValue(FileLock fl) => fl._type;
 
   Future<RandomAccessFile> lock(
-      [FileLock mode = FileLock.EXCLUSIVE, int start = 0, int end = -1]) {
+      [FileLock mode = FileLock.exclusive, int start = 0, int end = -1]) {
     if ((mode is! FileLock) || (start is! int) || (end is! int)) {
       throw new ArgumentError();
     }
@@ -1007,7 +999,8 @@
       throw new ArgumentError();
     }
     int lock = _fileLockValue(mode);
-    return _dispatch(_FILE_LOCK, [null, lock, start, end]).then((response) {
+    return _dispatch(_IOService.fileLock, [null, lock, start, end])
+        .then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, 'lock failed', path);
       }
@@ -1022,7 +1015,7 @@
     if (start == end) {
       throw new ArgumentError();
     }
-    return _dispatch(_FILE_LOCK, [null, LOCK_UNLOCK, start, end])
+    return _dispatch(_IOService.fileLock, [null, lockUnlock, start, end])
         .then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, 'unlock failed', path);
@@ -1032,7 +1025,7 @@
   }
 
   void lockSync(
-      [FileLock mode = FileLock.EXCLUSIVE, int start = 0, int end = -1]) {
+      [FileLock mode = FileLock.exclusive, int start = 0, int end = -1]) {
     _checkAvailable();
     if ((mode is! FileLock) || (start is! int) || (end is! int)) {
       throw new ArgumentError();
@@ -1055,7 +1048,7 @@
     if (start == end) {
       throw new ArgumentError();
     }
-    var result = _ops.lock(LOCK_UNLOCK, start, end);
+    var result = _ops.lock(lockUnlock, start, end);
     if (result is OSError) {
       throw new FileSystemException('unlock failed', path, result);
     }
diff --git a/sdk/lib/io/file_system_entity.dart b/sdk/lib/io/file_system_entity.dart
index d66c9f4..a78e03f 100644
--- a/sdk/lib/io/file_system_entity.dart
+++ b/sdk/lib/io/file_system_entity.dart
@@ -13,22 +13,34 @@
  */
 
 class FileSystemEntityType {
-  static const FILE = const FileSystemEntityType._internal(0);
-  static const DIRECTORY = const FileSystemEntityType._internal(1);
-  static const LINK = const FileSystemEntityType._internal(2);
-  static const NOT_FOUND = const FileSystemEntityType._internal(3);
+  static const file = const FileSystemEntityType._internal(0);
+  @Deprecated("Use file instead")
+  static const FILE = file;
+
+  static const directory = const FileSystemEntityType._internal(1);
+  @Deprecated("Use directory instead")
+  static const DIRECTORY = directory;
+
+  static const link = const FileSystemEntityType._internal(2);
+  @Deprecated("Use link instead")
+  static const LINK = link;
+
+  static const notFound = const FileSystemEntityType._internal(3);
+  @Deprecated("Use notFound instead")
+  static const NOT_FOUND = notFound;
+
   static const _typeList = const [
-    FileSystemEntityType.FILE,
-    FileSystemEntityType.DIRECTORY,
-    FileSystemEntityType.LINK,
-    FileSystemEntityType.NOT_FOUND
+    FileSystemEntityType.file,
+    FileSystemEntityType.directory,
+    FileSystemEntityType.link,
+    FileSystemEntityType.notFound,
   ];
   final int _type;
 
   const FileSystemEntityType._internal(this._type);
 
   static FileSystemEntityType _lookup(int type) => _typeList[type];
-  String toString() => const ['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'][_type];
+  String toString() => const ['file', 'directory', 'link', 'notFound'][_type];
 }
 
 /**
@@ -38,12 +50,12 @@
  */
 class FileStat {
   // These must agree with enum FileStat in file.h.
-  static const _TYPE = 0;
-  static const _CHANGED_TIME = 1;
-  static const _MODIFIED_TIME = 2;
-  static const _ACCESSED_TIME = 3;
-  static const _MODE = 4;
-  static const _SIZE = 5;
+  static const _type = 0;
+  static const _changedTime = 1;
+  static const _modifiedTime = 2;
+  static const _accessedTime = 3;
+  static const _mode = 4;
+  static const _size = 5;
 
   static const _notFound = const FileStat._internalNotFound();
 
@@ -71,7 +83,7 @@
   /**
    * The type of the object (file, directory, or link).
    *
-   * If the call to stat() fails, the type of the returned object is NOT_FOUND.
+   * If the call to stat() fails, the type of the returned object is notFound.
    */
   final FileSystemEntityType type;
 
@@ -95,7 +107,7 @@
       : changed = null,
         modified = null,
         accessed = null,
-        type = FileSystemEntityType.NOT_FOUND,
+        type = FileSystemEntityType.notFound,
         mode = 0,
         size = -1;
 
@@ -106,7 +118,7 @@
    *
    * Returns a [FileStat] object containing the data returned by stat().
    * If the call fails, returns a [FileStat] object with .type set to
-   * FileSystemEntityType.NOT_FOUND and the other fields invalid.
+   * FileSystemEntityType.notFound and the other fields invalid.
    */
   static FileStat statSync(String path) {
     final IOOverrides overrides = IOOverrides.current;
@@ -124,12 +136,12 @@
     var data = _statSync(_Namespace._namespace, path);
     if (data is OSError) return FileStat._notFound;
     return new FileStat._internal(
-        new DateTime.fromMillisecondsSinceEpoch(data[_CHANGED_TIME]),
-        new DateTime.fromMillisecondsSinceEpoch(data[_MODIFIED_TIME]),
-        new DateTime.fromMillisecondsSinceEpoch(data[_ACCESSED_TIME]),
-        FileSystemEntityType._lookup(data[_TYPE]),
-        data[_MODE],
-        data[_SIZE]);
+        new DateTime.fromMillisecondsSinceEpoch(data[_changedTime]),
+        new DateTime.fromMillisecondsSinceEpoch(data[_modifiedTime]),
+        new DateTime.fromMillisecondsSinceEpoch(data[_accessedTime]),
+        FileSystemEntityType._lookup(data[_type]),
+        data[_mode],
+        data[_size]);
   }
 
   /**
@@ -137,7 +149,7 @@
    *
    * Returns a Future which completes with a [FileStat] object containing
    * the data returned by stat(). If the call fails, completes the future with a
-   * [FileStat] object with `.type` set to FileSystemEntityType.NOT_FOUND and
+   * [FileStat] object with `.type` set to FileSystemEntityType.notFound and
    * the other fields invalid.
    */
   static Future<FileStat> stat(String path) {
@@ -153,20 +165,20 @@
     if (Platform.isWindows) {
       path = FileSystemEntity._trimTrailingPathSeparators(path);
     }
-    return _File
-        ._dispatchWithNamespace(_FILE_STAT, [null, path]).then((response) {
+    return _File._dispatchWithNamespace(_IOService.fileStat, [null, path]).then(
+        (response) {
       if (_isErrorResponse(response)) {
         return FileStat._notFound;
       }
       // Unwrap the real list from the "I'm not an error" wrapper.
       List data = response[1];
       return new FileStat._internal(
-          new DateTime.fromMillisecondsSinceEpoch(data[_CHANGED_TIME]),
-          new DateTime.fromMillisecondsSinceEpoch(data[_MODIFIED_TIME]),
-          new DateTime.fromMillisecondsSinceEpoch(data[_ACCESSED_TIME]),
-          FileSystemEntityType._lookup(data[_TYPE]),
-          data[_MODE],
-          data[_SIZE]);
+          new DateTime.fromMillisecondsSinceEpoch(data[_changedTime]),
+          new DateTime.fromMillisecondsSinceEpoch(data[_modifiedTime]),
+          new DateTime.fromMillisecondsSinceEpoch(data[_accessedTime]),
+          FileSystemEntityType._lookup(data[_type]),
+          data[_mode],
+          data[_size]);
     });
   }
 
@@ -339,7 +351,7 @@
    */
   Future<String> resolveSymbolicLinks() {
     return _File._dispatchWithNamespace(
-        _FILE_RESOLVE_SYMBOLIC_LINKS, [null, path]).then((response) {
+        _IOService.fileResolveSymbolicLinks, [null, path]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(
             response, "Cannot resolve symbolic links", path);
@@ -394,7 +406,7 @@
    *
    * If the call fails, completes the future with a [FileStat] object
    * with .type set to
-   * FileSystemEntityType.NOT_FOUND and the other fields invalid.
+   * FileSystemEntityType.notFound and the other fields invalid.
    */
   Future<FileStat> stat() => FileStat.stat(path);
 
@@ -407,7 +419,7 @@
    * Returns a [FileStat] object containing the data returned by stat().
    *
    * If the call fails, returns a [FileStat] object with .type set to
-   * FileSystemEntityType.NOT_FOUND and the other fields invalid.
+   * FileSystemEntityType.notFound and the other fields invalid.
    */
   FileStat statSync() => FileStat.statSync(path);
 
@@ -482,7 +494,7 @@
    * A move event may be reported as seperate delete and create events.
    */
   Stream<FileSystemEvent> watch(
-      {int events: FileSystemEvent.ALL, bool recursive: false}) {
+      {int events: FileSystemEvent.all, bool recursive: false}) {
     final String trimmedPath = _trimTrailingPathSeparators(path);
     final IOOverrides overrides = IOOverrides.current;
     if (overrides == null) {
@@ -496,7 +508,7 @@
 
   static Future<bool> _identical(String path1, String path2) {
     return _File._dispatchWithNamespace(
-        _FILE_IDENTICAL, [null, path1, path2]).then((response) {
+        _IOService.fileIdentical, [null, path1, path2]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response,
             "Error in FileSystemEntity.identical($path1, $path2)", "");
@@ -611,11 +623,11 @@
    *
    * Returns a [:Future<FileSystemEntityType>:] that completes with the result.
    *
-   * [FileSystemEntityType] has the constant instances FILE, DIRECTORY,
-   * LINK, and NOT_FOUND.  [type] will return LINK only if the optional
+   * [FileSystemEntityType] has the constant instances file, directory,
+   * link, and notFound.  [type] will return link only if the optional
    * named argument [followLinks] is false, and [path] points to a link.
    * If the path does not point to a file system object, or any other error
-   * occurs in looking up the path, NOT_FOUND is returned.  The only
+   * occurs in looking up the path, notFound is returned.  The only
    * error or exception that may be put on the returned future is ArgumentError,
    * caused by passing the wrong type of arguments to the function.
    */
@@ -629,11 +641,11 @@
    *
    * Returns a [FileSystemEntityType].
    *
-   * [FileSystemEntityType] has the constant instances FILE, DIRECTORY,
-   * LINK, and NOT_FOUND.  [type] will return LINK only if the optional
+   * [FileSystemEntityType] has the constant instances file, directory,
+   * link, and notFound.  [type] will return link only if the optional
    * named argument [followLinks] is false, and [path] points to a link.
    * If the path does not point to a file system object, or any other error
-   * occurs in looking up the path, NOT_FOUND is returned.  The only
+   * occurs in looking up the path, notFound is returned.  The only
    * error or exception that may be thrown is ArgumentError,
    * caused by passing the wrong type of arguments to the function.
    */
@@ -642,43 +654,43 @@
   }
 
   /**
-   * Checks if type(path, followLinks: false) returns FileSystemEntityType.LINK.
+   * Checks if type(path, followLinks: false) returns FileSystemEntityType.link.
    */
   static Future<bool> isLink(String path) =>
-      _getType(path, false).then((type) => (type == FileSystemEntityType.LINK));
+      _getType(path, false).then((type) => (type == FileSystemEntityType.link));
 
   /**
-   * Checks if type(path) returns FileSystemEntityType.FILE.
+   * Checks if type(path) returns FileSystemEntityType.file.
    */
   static Future<bool> isFile(String path) =>
-      _getType(path, true).then((type) => (type == FileSystemEntityType.FILE));
+      _getType(path, true).then((type) => (type == FileSystemEntityType.file));
 
   /**
-   * Checks if type(path) returns FileSystemEntityType.DIRECTORY.
+   * Checks if type(path) returns FileSystemEntityType.directory.
    */
   static Future<bool> isDirectory(String path) => _getType(path, true)
-      .then((type) => (type == FileSystemEntityType.DIRECTORY));
+      .then((type) => (type == FileSystemEntityType.directory));
 
   /**
    * Synchronously checks if typeSync(path, followLinks: false) returns
-   * FileSystemEntityType.LINK.
+   * FileSystemEntityType.link.
    */
   static bool isLinkSync(String path) =>
-      (_getTypeSync(path, false) == FileSystemEntityType.LINK);
+      (_getTypeSync(path, false) == FileSystemEntityType.link);
 
   /**
    * Synchronously checks if typeSync(path) returns
-   * FileSystemEntityType.FILE.
+   * FileSystemEntityType.file.
    */
   static bool isFileSync(String path) =>
-      (_getTypeSync(path, true) == FileSystemEntityType.FILE);
+      (_getTypeSync(path, true) == FileSystemEntityType.file);
 
   /**
    * Synchronously checks if typeSync(path) returns
-   * FileSystemEntityType.DIRECTORY.
+   * FileSystemEntityType.directory.
    */
   static bool isDirectorySync(String path) =>
-      (_getTypeSync(path, true) == FileSystemEntityType.DIRECTORY);
+      (_getTypeSync(path, true) == FileSystemEntityType.directory);
 
   external static _getTypeNative(
       _Namespace namespace, String path, bool followLinks);
@@ -747,7 +759,7 @@
   static Future<FileSystemEntityType> _getTypeRequest(
       String path, bool followLinks) {
     return _File._dispatchWithNamespace(
-        _FILE_TYPE, [null, path, followLinks]).then((response) {
+        _IOService.fileType, [null, path, followLinks]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "Error getting type", path);
       }
@@ -811,32 +823,42 @@
   /**
    * Bitfield for [FileSystemEntity.watch], to enable [FileSystemCreateEvent]s.
    */
+  static const int create = 1 << 0;
+  @Deprecated("Use create instead")
   static const int CREATE = 1 << 0;
 
   /**
    * Bitfield for [FileSystemEntity.watch], to enable [FileSystemModifyEvent]s.
    */
+  static const int modify = 1 << 1;
+  @Deprecated("Use modify instead")
   static const int MODIFY = 1 << 1;
 
   /**
    * Bitfield for [FileSystemEntity.watch], to enable [FileSystemDeleteEvent]s.
    */
+  static const int delete = 1 << 2;
+  @Deprecated("Use delete instead")
   static const int DELETE = 1 << 2;
 
   /**
    * Bitfield for [FileSystemEntity.watch], to enable [FileSystemMoveEvent]s.
    */
+  static const int move = 1 << 3;
+  @Deprecated("Use move instead")
   static const int MOVE = 1 << 3;
 
   /**
-   * Bitfield for [FileSystemEntity.watch], for enabling all of [CREATE],
-   * [MODIFY], [DELETE] and [MOVE].
+   * Bitfield for [FileSystemEntity.watch], for enabling all of [create],
+   * [modify], [delete] and [move].
    */
-  static const int ALL = CREATE | MODIFY | DELETE | MOVE;
+  static const int all = create | modify | delete | move;
+  @Deprecated("Use all instead")
+  static const int ALL = create | modify | delete | move;
 
-  static const int _MODIFY_ATTRIBUTES = 1 << 4;
-  static const int _DELETE_SELF = 1 << 5;
-  static const int _IS_DIR = 1 << 6;
+  static const int _modifyAttributes = 1 << 4;
+  static const int _deleteSelf = 1 << 5;
+  static const int _isDir = 1 << 6;
 
   /**
    * The type of event. See [FileSystemEvent] for a list of events.
@@ -856,7 +878,7 @@
    *
    * Note that if the file has been deleted by the time the event has arrived,
    * this will always be `false` on Windows. In particular, it will always be
-   * `false` for `DELETE` events.
+   * `false` for `delete` events.
    */
   final bool isDirectory;
 
@@ -868,7 +890,7 @@
  */
 class FileSystemCreateEvent extends FileSystemEvent {
   FileSystemCreateEvent._(path, isDirectory)
-      : super._(FileSystemEvent.CREATE, path, isDirectory);
+      : super._(FileSystemEvent.create, path, isDirectory);
 
   String toString() => "FileSystemCreateEvent('$path')";
 }
@@ -884,7 +906,7 @@
   final bool contentChanged;
 
   FileSystemModifyEvent._(path, isDirectory, this.contentChanged)
-      : super._(FileSystemEvent.MODIFY, path, isDirectory);
+      : super._(FileSystemEvent.modify, path, isDirectory);
 
   String toString() =>
       "FileSystemModifyEvent('$path', contentChanged=$contentChanged)";
@@ -895,7 +917,7 @@
  */
 class FileSystemDeleteEvent extends FileSystemEvent {
   FileSystemDeleteEvent._(path, isDirectory)
-      : super._(FileSystemEvent.DELETE, path, isDirectory);
+      : super._(FileSystemEvent.delete, path, isDirectory);
 
   String toString() => "FileSystemDeleteEvent('$path')";
 }
@@ -911,7 +933,7 @@
   final String destination;
 
   FileSystemMoveEvent._(path, isDirectory, this.destination)
-      : super._(FileSystemEvent.MOVE, path, isDirectory);
+      : super._(FileSystemEvent.move, path, isDirectory);
 
   String toString() {
     var buffer = new StringBuffer();
diff --git a/sdk/lib/io/io_resource_info.dart b/sdk/lib/io/io_resource_info.dart
index 22ff562..3e29221 100644
--- a/sdk/lib/io/io_resource_info.dart
+++ b/sdk/lib/io/io_resource_info.dart
@@ -86,14 +86,14 @@
 }
 
 class _FileResourceInfo extends _ReadWriteResourceInfo {
-  static const String TYPE = '_file';
+  static const String _type = '_file';
 
   final file;
 
   static Map<int, _FileResourceInfo> openFiles =
       new Map<int, _FileResourceInfo>();
 
-  _FileResourceInfo(this.file) : super(TYPE) {
+  _FileResourceInfo(this.file) : super(_type) {
     FileOpened(this);
   }
 
@@ -137,7 +137,7 @@
 }
 
 class _ProcessResourceInfo extends _IOResourceInfo {
-  static const String TYPE = '_process';
+  static const String _type = '_process';
   final process;
   final double startedAt;
 
@@ -146,7 +146,7 @@
 
   _ProcessResourceInfo(this.process)
       : startedAt = _IOResourceInfo.timestamp,
-        super(TYPE) {
+        super(_type) {
     ProcessStarted(this);
   }
 
@@ -200,16 +200,16 @@
 }
 
 class _SocketResourceInfo extends _ReadWriteResourceInfo {
-  static const String TCP_STRING = 'TCP';
-  static const String UDP_STRING = 'UDP';
-  static const String TYPE = '_socket';
+  static const String _tcpString = 'TCP';
+  static const String _udpString = 'UDP';
+  static const String _type = '_socket';
 
   final /*_NativeSocket|*/ socket;
 
   static Map<int, _SocketResourceInfo> openSockets =
       new Map<int, _SocketResourceInfo>();
 
-  _SocketResourceInfo(this.socket) : super(TYPE) {
+  _SocketResourceInfo(this.socket) : super(_type) {
     SocketOpened(this);
   }
 
@@ -232,7 +232,7 @@
 
   Map<String, dynamic> getSocketInfoMap() {
     var result = fullValueMap;
-    result['socketType'] = socket.isTcp ? TCP_STRING : UDP_STRING;
+    result['socketType'] = socket.isTcp ? _tcpString : _udpString;
     result['listening'] = socket.isListening;
     result['host'] = socket.address.host;
     result['port'] = socket.port;
diff --git a/sdk/lib/io/io_service.dart b/sdk/lib/io/io_service.dart
index 0ed4439..7af382c 100644
--- a/sdk/lib/io/io_service.dart
+++ b/sdk/lib/io/io_service.dart
@@ -4,51 +4,51 @@
 
 part of dart.io;
 
-// This list must be kept in sync with the list in runtime/bin/io_service.h
-const int _FILE_EXISTS = 0;
-const int _FILE_CREATE = 1;
-const int _FILE_DELETE = 2;
-const int _FILE_RENAME = 3;
-const int _FILE_COPY = 4;
-const int _FILE_OPEN = 5;
-const int _FILE_RESOLVE_SYMBOLIC_LINKS = 6;
-const int _FILE_CLOSE = 7;
-const int _FILE_POSITION = 8;
-const int _FILE_SET_POSITION = 9;
-const int _FILE_TRUNCATE = 10;
-const int _FILE_LENGTH = 11;
-const int _FILE_LENGTH_FROM_PATH = 12;
-const int _FILE_LAST_ACCESSED = 13;
-const int _FILE_SET_LAST_ACCESSED = 14;
-const int _FILE_LAST_MODIFIED = 15;
-const int _FILE_SET_LAST_MODIFIED = 16;
-const int _FILE_FLUSH = 17;
-const int _FILE_READ_BYTE = 18;
-const int _FILE_WRITE_BYTE = 19;
-const int _FILE_READ = 20;
-const int _FILE_READ_INTO = 21;
-const int _FILE_WRITE_FROM = 22;
-const int _FILE_CREATE_LINK = 23;
-const int _FILE_DELETE_LINK = 24;
-const int _FILE_RENAME_LINK = 25;
-const int _FILE_LINK_TARGET = 26;
-const int _FILE_TYPE = 27;
-const int _FILE_IDENTICAL = 28;
-const int _FILE_STAT = 29;
-const int _FILE_LOCK = 30;
-const int _SOCKET_LOOKUP = 31;
-const int _SOCKET_LIST_INTERFACES = 32;
-const int _SOCKET_REVERSE_LOOKUP = 33;
-const int _DIRECTORY_CREATE = 34;
-const int _DIRECTORY_DELETE = 35;
-const int _DIRECTORY_EXISTS = 36;
-const int _DIRECTORY_CREATE_TEMP = 37;
-const int _DIRECTORY_LIST_START = 38;
-const int _DIRECTORY_LIST_NEXT = 39;
-const int _DIRECTORY_LIST_STOP = 40;
-const int _DIRECTORY_RENAME = 41;
-const int _SSL_PROCESS_FILTER = 42;
-
 class _IOService {
+  // This list must be kept in sync with the list in runtime/bin/io_service.h
+  static const int fileExists = 0;
+  static const int fileCreate = 1;
+  static const int fileDelete = 2;
+  static const int fileRename = 3;
+  static const int fileCopy = 4;
+  static const int fileOpen = 5;
+  static const int fileResolveSymbolicLinks = 6;
+  static const int fileClose = 7;
+  static const int filePosition = 8;
+  static const int fileSetPosition = 9;
+  static const int fileTruncate = 10;
+  static const int fileLength = 11;
+  static const int fileLengthFromPath = 12;
+  static const int fileLastAccessed = 13;
+  static const int fileSetLastAccessed = 14;
+  static const int fileLastModified = 15;
+  static const int fileSetLastModified = 16;
+  static const int fileFlush = 17;
+  static const int fileReadByte = 18;
+  static const int fileWriteByte = 19;
+  static const int fileRead = 20;
+  static const int fileReadInto = 21;
+  static const int fileWriteFrom = 22;
+  static const int fileCreateLink = 23;
+  static const int fileDeleteLink = 24;
+  static const int fileRenameLink = 25;
+  static const int fileLinkTarget = 26;
+  static const int fileType = 27;
+  static const int fileIdentical = 28;
+  static const int fileStat = 29;
+  static const int fileLock = 30;
+  static const int socketLookup = 31;
+  static const int socketListInterfaces = 32;
+  static const int socketReverseLookup = 33;
+  static const int directoryCreate = 34;
+  static const int directoryDelete = 35;
+  static const int directoryExists = 36;
+  static const int directoryCreateTemp = 37;
+  static const int directoryListStart = 38;
+  static const int directoryListNext = 39;
+  static const int directoryListStop = 40;
+  static const int directoryRename = 41;
+  static const int sslProcessFilter = 42;
+
   external static Future _dispatch(int request, List data);
 }
diff --git a/sdk/lib/io/link.dart b/sdk/lib/io/link.dart
index 42e5bca..697694f 100644
--- a/sdk/lib/io/link.dart
+++ b/sdk/lib/io/link.dart
@@ -174,8 +174,8 @@
     var result =
         recursive ? parent.create(recursive: true) : new Future.value(null);
     return result
-        .then((_) => _File
-            ._dispatchWithNamespace(_FILE_CREATE_LINK, [null, path, target]))
+        .then((_) => _File._dispatchWithNamespace(
+            _IOService.fileCreateLink, [null, path, target]))
         .then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(
@@ -232,8 +232,8 @@
     if (recursive) {
       return new Directory(path).delete(recursive: true).then((_) => this);
     }
-    return _File._dispatchWithNamespace(_FILE_DELETE_LINK, [null, path]).then(
-        (response) {
+    return _File._dispatchWithNamespace(
+        _IOService.fileDeleteLink, [null, path]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "Cannot delete link", path);
       }
@@ -251,7 +251,7 @@
 
   Future<Link> rename(String newPath) {
     return _File._dispatchWithNamespace(
-        _FILE_RENAME_LINK, [null, path, newPath]).then((response) {
+        _IOService.fileRenameLink, [null, path, newPath]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(
             response, "Cannot rename link to '$newPath'", path);
@@ -267,8 +267,8 @@
   }
 
   Future<String> target() {
-    return _File._dispatchWithNamespace(_FILE_LINK_TARGET, [null, path]).then(
-        (response) {
+    return _File._dispatchWithNamespace(
+        _IOService.fileLinkTarget, [null, path]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(
             response, "Cannot get target of link", path);
@@ -290,17 +290,17 @@
   }
 
   bool _isErrorResponse(response) {
-    return response is List && response[0] != _SUCCESS_RESPONSE;
+    return response is List && response[0] != _successResponse;
   }
 
   _exceptionFromResponse(response, String message, String path) {
     assert(_isErrorResponse(response));
-    switch (response[_ERROR_RESPONSE_ERROR_TYPE]) {
-      case _ILLEGAL_ARGUMENT_RESPONSE:
+    switch (response[_errorResponseErrorType]) {
+      case _illegalArgumentResponse:
         return new ArgumentError();
-      case _OSERROR_RESPONSE:
-        var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
-            response[_OSERROR_RESPONSE_ERROR_CODE]);
+      case _osErrorResponse:
+        var err = new OSError(response[_osErrorResponseMessage],
+            response[_osErrorResponseErrorCode]);
         return new FileSystemException(message, path, err);
       default:
         return new Exception("Unknown error");
diff --git a/sdk/lib/io/process.dart b/sdk/lib/io/process.dart
index 5cd5951..e1d4c23 100644
--- a/sdk/lib/io/process.dart
+++ b/sdk/lib/io/process.dart
@@ -137,19 +137,39 @@
 /**
  * Modes for running a new process.
  */
-enum ProcessStartMode {
+class ProcessStartMode {
   /// Normal child process.
-  NORMAL,
+  static const normal = const ProcessStartMode._internal(0);
+  @Deprecated("Use normal instead")
+  static const NORMAL = normal;
 
   /// Stdio handles are inherited by the child process.
-  INHERIT_STDIO,
+  static const inheritStdio = const ProcessStartMode._internal(1);
+  @Deprecated("Use inheritStdio instead")
+  static const INHERIT_STDIO = inheritStdio;
 
   /// Detached child process with no open communication channel.
-  DETACHED,
+  static const detached = const ProcessStartMode._internal(2);
+  @Deprecated("Use detached instead")
+  static const DETACHED = detached;
 
   /// Detached child process with stdin, stdout and stderr still open
   /// for communication with the child.
-  DETACHED_WITH_STDIO,
+  static const detachedWithStdio = const ProcessStartMode._internal(3);
+  @Deprecated("Use detachedWithStdio instead")
+  static const DETACHED_WITH_STDIO = detachedWithStdio;
+
+  List<ProcessStartMode> get values => const <ProcessStartMode>[
+        normal,
+        inheritStdio,
+        detached,
+        detachedWithStdio
+      ];
+  String toString() =>
+      const ["normal", "inheritStdio", "detached", "detachedWithStdio"][_mode];
+
+  final int _mode;
+  const ProcessStartMode._internal(this._mode);
 }
 
 /**
@@ -311,25 +331,25 @@
    *       stderr.addStream(process.stderr);
    *     });
    *
-   * If [mode] is [ProcessStartMode.NORMAL] (the default) a child
+   * If [mode] is [ProcessStartMode.normal] (the default) a child
    * process will be started with `stdin`, `stdout` and `stderr`
    * connected.
    *
-   * If `mode` is [ProcessStartMode.DETACHED] a detached process will
+   * If `mode` is [ProcessStartMode.detached] a detached process will
    * be created. A detached process has no connection to its parent,
    * and can keep running on its own when the parent dies. The only
    * information available from a detached process is its `pid`. There
    * is no connection to its `stdin`, `stdout` or `stderr`, nor will
    * the process' exit code become available when it terminates.
    *
-   * If `mode` is [ProcessStartMode.DETACHED_WITH_STDIO] a detached
+   * If `mode` is [ProcessStartMode.detachedWithStdio] a detached
    * process will be created where the `stdin`, `stdout` and `stderr`
    * are connected. The creator can communicate with the child through
    * these. The detached process will keep running even if these
    * communication channels are closed. The process' exit code will
    * not become available when it terminated.
    *
-   * The default value for `mode` is `ProcessStartMode.NORMAL`.
+   * The default value for `mode` is `ProcessStartMode.normal`.
    */
   external static Future<Process> start(
       String executable, List<String> arguments,
@@ -337,7 +357,7 @@
       Map<String, String> environment,
       bool includeParentEnvironment: true,
       bool runInShell: false,
-      ProcessStartMode mode: ProcessStartMode.NORMAL});
+      ProcessStartMode mode: ProcessStartMode.normal});
 
   /**
    * Starts a process and runs it non-interactively to completion. The
@@ -364,7 +384,7 @@
    *
    * The encoding used for decoding `stdout` and `stderr` into text is
    * controlled through [stdoutEncoding] and [stderrEncoding]. The
-   * default encoding is [SYSTEM_ENCODING]. If `null` is used no
+   * default encoding is [systemEncoding]. If `null` is used no
    * decoding will happen and the [ProcessResult] will hold binary
    * data.
    *
@@ -386,8 +406,8 @@
       Map<String, String> environment,
       bool includeParentEnvironment: true,
       bool runInShell: false,
-      Encoding stdoutEncoding: SYSTEM_ENCODING,
-      Encoding stderrEncoding: SYSTEM_ENCODING});
+      Encoding stdoutEncoding: systemEncoding,
+      Encoding stderrEncoding: systemEncoding});
 
   /**
    * Starts a process and runs it to completion. This is a synchronous
@@ -404,15 +424,15 @@
       Map<String, String> environment,
       bool includeParentEnvironment: true,
       bool runInShell: false,
-      Encoding stdoutEncoding: SYSTEM_ENCODING,
-      Encoding stderrEncoding: SYSTEM_ENCODING});
+      Encoding stdoutEncoding: systemEncoding,
+      Encoding stderrEncoding: systemEncoding});
 
   /**
    * Kills the process with id [pid].
    *
    * Where possible, sends the [signal] to the process with id
    * `pid`. This includes Linux and OS X. The default signal is
-   * [ProcessSignal.SIGTERM] which will normally terminate the
+   * [ProcessSignal.sigterm] which will normally terminate the
    * process.
    *
    * On platforms without signal support, including Windows, the call
@@ -424,7 +444,7 @@
    * that the process is already dead.
    */
   external static bool killPid(int pid,
-      [ProcessSignal signal = ProcessSignal.SIGTERM]);
+      [ProcessSignal signal = ProcessSignal.sigterm]);
 
   /**
    * Returns the standard output stream of the process as a [:Stream:].
@@ -450,7 +470,7 @@
    * Kills the process.
    *
    * Where possible, sends the [signal] to the process. This includes
-   * Linux and OS X. The default signal is [ProcessSignal.SIGTERM]
+   * Linux and OS X. The default signal is [ProcessSignal.sigterm]
    * which will normally terminate the process.
    *
    * On platforms without signal support, including Windows, the call
@@ -461,7 +481,7 @@
    * process. Otherwise the signal could not be sent, usually meaning
    * that the process is already dead.
    */
-  bool kill([ProcessSignal signal = ProcessSignal.SIGTERM]);
+  bool kill([ProcessSignal signal = ProcessSignal.sigterm]);
 }
 
 /**
@@ -510,35 +530,94 @@
  * information.
  */
 class ProcessSignal {
-  static const ProcessSignal SIGHUP = const ProcessSignal._(1, "SIGHUP");
-  static const ProcessSignal SIGINT = const ProcessSignal._(2, "SIGINT");
-  static const ProcessSignal SIGQUIT = const ProcessSignal._(3, "SIGQUIT");
-  static const ProcessSignal SIGILL = const ProcessSignal._(4, "SIGILL");
-  static const ProcessSignal SIGTRAP = const ProcessSignal._(5, "SIGTRAP");
-  static const ProcessSignal SIGABRT = const ProcessSignal._(6, "SIGABRT");
-  static const ProcessSignal SIGBUS = const ProcessSignal._(7, "SIGBUS");
-  static const ProcessSignal SIGFPE = const ProcessSignal._(8, "SIGFPE");
-  static const ProcessSignal SIGKILL = const ProcessSignal._(9, "SIGKILL");
-  static const ProcessSignal SIGUSR1 = const ProcessSignal._(10, "SIGUSR1");
-  static const ProcessSignal SIGSEGV = const ProcessSignal._(11, "SIGSEGV");
-  static const ProcessSignal SIGUSR2 = const ProcessSignal._(12, "SIGUSR2");
-  static const ProcessSignal SIGPIPE = const ProcessSignal._(13, "SIGPIPE");
-  static const ProcessSignal SIGALRM = const ProcessSignal._(14, "SIGALRM");
-  static const ProcessSignal SIGTERM = const ProcessSignal._(15, "SIGTERM");
-  static const ProcessSignal SIGCHLD = const ProcessSignal._(17, "SIGCHLD");
-  static const ProcessSignal SIGCONT = const ProcessSignal._(18, "SIGCONT");
-  static const ProcessSignal SIGSTOP = const ProcessSignal._(19, "SIGSTOP");
-  static const ProcessSignal SIGTSTP = const ProcessSignal._(20, "SIGTSTP");
-  static const ProcessSignal SIGTTIN = const ProcessSignal._(21, "SIGTTIN");
-  static const ProcessSignal SIGTTOU = const ProcessSignal._(22, "SIGTTOU");
-  static const ProcessSignal SIGURG = const ProcessSignal._(23, "SIGURG");
-  static const ProcessSignal SIGXCPU = const ProcessSignal._(24, "SIGXCPU");
-  static const ProcessSignal SIGXFSZ = const ProcessSignal._(25, "SIGXFSZ");
-  static const ProcessSignal SIGVTALRM = const ProcessSignal._(26, "SIGVTALRM");
-  static const ProcessSignal SIGPROF = const ProcessSignal._(27, "SIGPROF");
-  static const ProcessSignal SIGWINCH = const ProcessSignal._(28, "SIGWINCH");
-  static const ProcessSignal SIGPOLL = const ProcessSignal._(29, "SIGPOLL");
-  static const ProcessSignal SIGSYS = const ProcessSignal._(31, "SIGSYS");
+  static const ProcessSignal sighup = const ProcessSignal._(1, "SIGHUP");
+  static const ProcessSignal sigint = const ProcessSignal._(2, "SIGINT");
+  static const ProcessSignal sigquit = const ProcessSignal._(3, "SIGQUIT");
+  static const ProcessSignal sigill = const ProcessSignal._(4, "SIGILL");
+  static const ProcessSignal sigtrap = const ProcessSignal._(5, "SIGTRAP");
+  static const ProcessSignal sigabrt = const ProcessSignal._(6, "SIGABRT");
+  static const ProcessSignal sigbus = const ProcessSignal._(7, "SIGBUS");
+  static const ProcessSignal sigfpe = const ProcessSignal._(8, "SIGFPE");
+  static const ProcessSignal sigkill = const ProcessSignal._(9, "SIGKILL");
+  static const ProcessSignal sigusr1 = const ProcessSignal._(10, "SIGUSR1");
+  static const ProcessSignal sigsegv = const ProcessSignal._(11, "SIGSEGV");
+  static const ProcessSignal sigusr2 = const ProcessSignal._(12, "SIGUSR2");
+  static const ProcessSignal sigpipe = const ProcessSignal._(13, "SIGPIPE");
+  static const ProcessSignal sigalrm = const ProcessSignal._(14, "SIGALRM");
+  static const ProcessSignal sigterm = const ProcessSignal._(15, "SIGTERM");
+  static const ProcessSignal sigchld = const ProcessSignal._(17, "SIGCHLD");
+  static const ProcessSignal sigcont = const ProcessSignal._(18, "SIGCONT");
+  static const ProcessSignal sigstop = const ProcessSignal._(19, "SIGSTOP");
+  static const ProcessSignal sigtstp = const ProcessSignal._(20, "SIGTSTP");
+  static const ProcessSignal sigttin = const ProcessSignal._(21, "SIGTTIN");
+  static const ProcessSignal sigttou = const ProcessSignal._(22, "SIGTTOU");
+  static const ProcessSignal sigurg = const ProcessSignal._(23, "SIGURG");
+  static const ProcessSignal sigxcpu = const ProcessSignal._(24, "SIGXCPU");
+  static const ProcessSignal sigxfsz = const ProcessSignal._(25, "SIGXFSZ");
+  static const ProcessSignal sigvtalrm = const ProcessSignal._(26, "SIGVTALRM");
+  static const ProcessSignal sigprof = const ProcessSignal._(27, "SIGPROF");
+  static const ProcessSignal sigwinch = const ProcessSignal._(28, "SIGWINCH");
+  static const ProcessSignal sigpoll = const ProcessSignal._(29, "SIGPOLL");
+  static const ProcessSignal sigsys = const ProcessSignal._(31, "SIGSYS");
+
+  @Deprecated("Use sighup instead")
+  static const ProcessSignal SIGHUP = sighup;
+  @Deprecated("Use sigint instead")
+  static const ProcessSignal SIGINT = sigint;
+  @Deprecated("Use sigquit instead")
+  static const ProcessSignal SIGQUIT = sigquit;
+  @Deprecated("Use sigill instead")
+  static const ProcessSignal SIGILL = sigill;
+  @Deprecated("Use sigtrap instead")
+  static const ProcessSignal SIGTRAP = sigtrap;
+  @Deprecated("Use sigabrt instead")
+  static const ProcessSignal SIGABRT = sigabrt;
+  @Deprecated("Use sigbus instead")
+  static const ProcessSignal SIGBUS = sigbus;
+  @Deprecated("Use sigfpe instead")
+  static const ProcessSignal SIGFPE = sigfpe;
+  @Deprecated("Use sigkill instead")
+  static const ProcessSignal SIGKILL = sigkill;
+  @Deprecated("Use sigusr1 instead")
+  static const ProcessSignal SIGUSR1 = sigusr1;
+  @Deprecated("Use sigsegv instead")
+  static const ProcessSignal SIGSEGV = sigsegv;
+  @Deprecated("Use sigusr2 instead")
+  static const ProcessSignal SIGUSR2 = sigusr2;
+  @Deprecated("Use sigpipe instead")
+  static const ProcessSignal SIGPIPE = sigpipe;
+  @Deprecated("Use sigalrm instead")
+  static const ProcessSignal SIGALRM = sigalrm;
+  @Deprecated("Use sigterm instead")
+  static const ProcessSignal SIGTERM = sigterm;
+  @Deprecated("Use sigchld instead")
+  static const ProcessSignal SIGCHLD = sigchld;
+  @Deprecated("Use sigcont instead")
+  static const ProcessSignal SIGCONT = sigcont;
+  @Deprecated("Use sigstop instead")
+  static const ProcessSignal SIGSTOP = sigstop;
+  @Deprecated("Use sigtstp instead")
+  static const ProcessSignal SIGTSTP = sigtstp;
+  @Deprecated("Use sigttin instead")
+  static const ProcessSignal SIGTTIN = sigttin;
+  @Deprecated("Use sigttou instead")
+  static const ProcessSignal SIGTTOU = sigttou;
+  @Deprecated("Use sigurg instead")
+  static const ProcessSignal SIGURG = sigurg;
+  @Deprecated("Use sigxcpu instead")
+  static const ProcessSignal SIGXCPU = sigxcpu;
+  @Deprecated("Use sigxfsz instead")
+  static const ProcessSignal SIGXFSZ = sigxfsz;
+  @Deprecated("Use sigvtalrm instead")
+  static const ProcessSignal SIGVTALRM = sigvtalrm;
+  @Deprecated("Use sigprof instead")
+  static const ProcessSignal SIGPROF = sigprof;
+  @Deprecated("Use sigwinch instead")
+  static const ProcessSignal SIGWINCH = sigwinch;
+  @Deprecated("Use sigpoll instead")
+  static const ProcessSignal SIGPOLL = sigpoll;
+  @Deprecated("Use sigsys instead")
+  static const ProcessSignal SIGSYS = sigsys;
 
   final int _signalNumber;
   final String _name;
@@ -552,12 +631,12 @@
    *
    * The following [ProcessSignal]s can be listened to:
    *
-   *   * [ProcessSignal.SIGHUP].
-   *   * [ProcessSignal.SIGINT]. Signal sent by e.g. CTRL-C.
-   *   * [ProcessSignal.SIGTERM]. Not available on Windows.
-   *   * [ProcessSignal.SIGUSR1]. Not available on Windows.
-   *   * [ProcessSignal.SIGUSR2]. Not available on Windows.
-   *   * [ProcessSignal.SIGWINCH]. Not available on Windows.
+   *   * [ProcessSignal.sighup].
+   *   * [ProcessSignal.sigint]. Signal sent by e.g. CTRL-C.
+   *   * [ProcessSignal.sigterm]. Not available on Windows.
+   *   * [ProcessSignal.sigusr1]. Not available on Windows.
+   *   * [ProcessSignal.sigusr2]. Not available on Windows.
+   *   * [ProcessSignal.sigwinch]. Not available on Windows.
    *
    * Other signals are disallowed, as they may be used by the VM.
    *
diff --git a/sdk/lib/io/secure_server_socket.dart b/sdk/lib/io/secure_server_socket.dart
index 5533df6..b4ca32e 100644
--- a/sdk/lib/io/secure_server_socket.dart
+++ b/sdk/lib/io/secure_server_socket.dart
@@ -25,10 +25,10 @@
    * perform a [InternetAddress.lookup] and use the first value in the
    * list. To listen on the loopback adapter, which will allow only
    * incoming connections from the local host, use the value
-   * [InternetAddress.LOOPBACK_IP_V4] or
-   * [InternetAddress.LOOPBACK_IP_V6]. To allow for incoming
+   * [InternetAddress.loopbackIPv4] or
+   * [InternetAddress.loopbackIPv6]. To allow for incoming
    * connection from the network use either one of the values
-   * [InternetAddress.ANY_IP_V4] or [InternetAddress.ANY_IP_V6] to
+   * [InternetAddress.anyIPv4] or [InternetAddress.anyIPv6] to
    * bind to all interfaces or the IP address of a specific interface.
    *
    * If [port] has the value [:0:] an ephemeral port will be chosen by
@@ -155,10 +155,10 @@
    * perform a [InternetAddress.lookup] and use the first value in the
    * list. To listen on the loopback adapter, which will allow only
    * incoming connections from the local host, use the value
-   * [InternetAddress.LOOPBACK_IP_V4] or
-   * [InternetAddress.LOOPBACK_IP_V6]. To allow for incoming
+   * [InternetAddress.loopbackIPv4] or
+   * [InternetAddress.loopbackIPv6]. To allow for incoming
    * connection from the network use either one of the values
-   * [InternetAddress.ANY_IP_V4] or [InternetAddress.ANY_IP_V6] to
+   * [InternetAddress.anyIPv4] or [InternetAddress.anyIPv6] to
    * bind to all interfaces or the IP address of a specific interface.
    *
    * If [port] has the value [:0:] an ephemeral port will be chosen by
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index 0262e10..9f2711b 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -364,21 +364,21 @@
 class _RawSecureSocket extends Stream<RawSocketEvent>
     implements RawSecureSocket {
   // Status states
-  static const int HANDSHAKE = 201;
-  static const int CONNECTED = 202;
-  static const int CLOSED = 203;
+  static const int handshakeStatus = 201;
+  static const int connectedStatus = 202;
+  static const int closedStatus = 203;
 
   // Buffer identifiers.
   // These must agree with those in the native C++ implementation.
-  static const int READ_PLAINTEXT = 0;
-  static const int WRITE_PLAINTEXT = 1;
-  static const int READ_ENCRYPTED = 2;
-  static const int WRITE_ENCRYPTED = 3;
-  static const int NUM_BUFFERS = 4;
+  static const int readPlaintextId = 0;
+  static const int writePlaintextId = 1;
+  static const int readEncryptedId = 2;
+  static const int writeEncryptedId = 3;
+  static const int bufferCount = 4;
 
   // Is a buffer identifier for an encrypted buffer?
   static bool _isBufferEncrypted(int identifier) =>
-      identifier >= READ_ENCRYPTED;
+      identifier >= readEncryptedId;
 
   RawSocket _socket;
   final Completer<_RawSecureSocket> _handshakeComplete =
@@ -395,7 +395,7 @@
   final bool requireClientCertificate;
   final Function onBadCertificate;
 
-  var _status = HANDSHAKE;
+  var _status = handshakeStatus;
   bool _writeEventsEnabled = true;
   bool _readEventsEnabled = true;
   int _pauseCount = 0;
@@ -491,10 +491,10 @@
         throw new ArgumentError("Subscription passed to TLS upgrade is paused");
       }
       // If we are upgrading a socket that is already closed for read,
-      // report an error as if we received READ_CLOSED during the handshake.
+      // report an error as if we received readClosed during the handshake.
       dynamic s = _socket; // Cast to dynamic to avoid warning.
       if (s._socket.closedReadEventSent) {
-        _eventDispatcher(RawSocketEvent.READ_CLOSED);
+        _eventDispatcher(RawSocketEvent.readClosed);
       }
       _socketSubscription
         ..onData(_eventDispatcher)
@@ -562,13 +562,13 @@
   }
 
   int available() {
-    return _status != CONNECTED
+    return _status != connectedStatus
         ? 0
-        : _secureFilter.buffers[READ_PLAINTEXT].length;
+        : _secureFilter.buffers[readPlaintextId].length;
   }
 
   Future<RawSecureSocket> close() {
-    shutdown(SocketDirection.BOTH);
+    shutdown(SocketDirection.both);
     return _closeCompleter.future;
   }
 
@@ -594,26 +594,26 @@
       _socketSubscription.cancel();
     }
     _controller.close();
-    _status = CLOSED;
+    _status = closedStatus;
   }
 
   void shutdown(SocketDirection direction) {
-    if (direction == SocketDirection.SEND ||
-        direction == SocketDirection.BOTH) {
+    if (direction == SocketDirection.send ||
+        direction == SocketDirection.both) {
       _closedWrite = true;
       if (_filterStatus.writeEmpty) {
-        _socket.shutdown(SocketDirection.SEND);
+        _socket.shutdown(SocketDirection.send);
         _socketClosedWrite = true;
         if (_closedRead) {
           _close();
         }
       }
     }
-    if (direction == SocketDirection.RECEIVE ||
-        direction == SocketDirection.BOTH) {
+    if (direction == SocketDirection.receive ||
+        direction == SocketDirection.both) {
       _closedRead = true;
       _socketClosedRead = true;
-      _socket.shutdown(SocketDirection.RECEIVE);
+      _socket.shutdown(SocketDirection.receive);
       if (_socketClosedWrite) {
         _close();
       }
@@ -644,10 +644,10 @@
     if (_closedRead) {
       throw new SocketException("Reading from a closed socket");
     }
-    if (_status != CONNECTED) {
+    if (_status != connectedStatus) {
       return null;
     }
-    var result = _secureFilter.buffers[READ_PLAINTEXT].read(length);
+    var result = _secureFilter.buffers[readPlaintextId].read(length);
     _scheduleFilter();
     return result;
   }
@@ -666,12 +666,12 @@
       _controller.addError(new SocketException("Writing to a closed socket"));
       return 0;
     }
-    if (_status != CONNECTED) return 0;
+    if (_status != connectedStatus) return 0;
     if (offset == null) offset = 0;
     if (bytes == null) bytes = data.length - offset;
 
     int written =
-        _secureFilter.buffers[WRITE_PLAINTEXT].write(data, offset, bytes);
+        _secureFilter.buffers[writePlaintextId].write(data, offset, bytes);
     if (written > 0) {
       _filterStatus.writeEmpty = false;
     }
@@ -698,11 +698,11 @@
 
   void _eventDispatcher(RawSocketEvent event) {
     try {
-      if (event == RawSocketEvent.READ) {
+      if (event == RawSocketEvent.read) {
         _readHandler();
-      } else if (event == RawSocketEvent.WRITE) {
+      } else if (event == RawSocketEvent.write) {
         _writeHandler();
-      } else if (event == RawSocketEvent.READ_CLOSED) {
+      } else if (event == RawSocketEvent.readClosed) {
         _closeHandler();
       }
     } catch (e, stackTrace) {
@@ -727,7 +727,7 @@
   }
 
   void _reportError(e, [StackTrace stackTrace]) {
-    if (_status == CLOSED) {
+    if (_status == closedStatus) {
       return;
     } else if (_connectPending) {
       // _connectPending is true until the handshake has completed, and the
@@ -741,19 +741,19 @@
   }
 
   void _closeHandler() {
-    if (_status == CONNECTED) {
+    if (_status == connectedStatus) {
       if (_closedRead) return;
       _socketClosedRead = true;
       if (_filterStatus.readEmpty) {
         _closedRead = true;
-        _controller.add(RawSocketEvent.READ_CLOSED);
+        _controller.add(RawSocketEvent.readClosed);
         if (_socketClosedWrite) {
           _close();
         }
       } else {
         _scheduleFilter();
       }
-    } else if (_status == HANDSHAKE) {
+    } else if (_status == handshakeStatus) {
       _socketClosedRead = true;
       if (_filterStatus.readEmpty) {
         _reportError(
@@ -781,19 +781,19 @@
       {bool useSessionCache: true,
       bool requestClientCertificate: false,
       bool requireClientCertificate: false}) {
-    if (_status != CONNECTED) {
+    if (_status != connectedStatus) {
       throw new HandshakeException(
           "Called renegotiate on a non-connected socket");
     }
     _secureFilter.renegotiate(
         useSessionCache, requestClientCertificate, requireClientCertificate);
-    _status = HANDSHAKE;
+    _status = handshakeStatus;
     _filterStatus.writeEmpty = false;
     _scheduleFilter();
   }
 
   void _secureHandshakeCompleteHandler() {
-    _status = CONNECTED;
+    _status = connectedStatus;
     if (_connectPending) {
       _connectPending = false;
       try {
@@ -838,7 +838,7 @@
   }
 
   void _tryFilter() {
-    if (_status == CLOSED) {
+    if (_status == closedStatus) {
       return;
     }
     if (_filterPending && !_filterActive) {
@@ -847,7 +847,7 @@
       _pushAllFilterStages().then((status) {
         _filterStatus = status;
         _filterActive = false;
-        if (_status == CLOSED) {
+        if (_status == closedStatus) {
           _secureFilter.destroy();
           _secureFilter = null;
           return;
@@ -855,22 +855,22 @@
         _socket.readEventsEnabled = true;
         if (_filterStatus.writeEmpty && _closedWrite && !_socketClosedWrite) {
           // Checks for and handles all cases of partially closed sockets.
-          shutdown(SocketDirection.SEND);
-          if (_status == CLOSED) {
+          shutdown(SocketDirection.send);
+          if (_status == closedStatus) {
             return;
           }
         }
         if (_filterStatus.readEmpty && _socketClosedRead && !_closedRead) {
-          if (_status == HANDSHAKE) {
+          if (_status == handshakeStatus) {
             _secureFilter.handshake();
-            if (_status == HANDSHAKE) {
+            if (_status == handshakeStatus) {
               throw new HandshakeException(
                   'Connection terminated during handshake');
             }
           }
           _closeHandler();
         }
-        if (_status == CLOSED) {
+        if (_status == closedStatus) {
           return;
         }
         if (_filterStatus.progress) {
@@ -887,7 +887,7 @@
           if (_filterStatus.readPlaintextNoLongerEmpty) {
             _scheduleReadEvent();
           }
-          if (_status == HANDSHAKE) {
+          if (_status == handshakeStatus) {
             _secureHandshake();
           }
         }
@@ -916,8 +916,8 @@
   }
 
   void _readSocket() {
-    if (_status == CLOSED) return;
-    var buffer = _secureFilter.buffers[READ_ENCRYPTED];
+    if (_status == closedStatus) return;
+    var buffer = _secureFilter.buffers[readEncryptedId];
     if (buffer.writeFromSource(_readSocketOrBufferedData) > 0) {
       _filterStatus.readEmpty = false;
     } else {
@@ -927,7 +927,7 @@
 
   void _writeSocket() {
     if (_socketClosedWrite) return;
-    var buffer = _secureFilter.buffers[WRITE_ENCRYPTED];
+    var buffer = _secureFilter.buffers[writeEncryptedId];
     if (buffer.readToSocket(_socket)) {
       // Returns true if blocked
       _socket.writeEventsEnabled = true;
@@ -940,7 +940,7 @@
         _readEventsEnabled &&
         _pauseCount == 0 &&
         _secureFilter != null &&
-        !_secureFilter.buffers[READ_PLAINTEXT].isEmpty) {
+        !_secureFilter.buffers[readPlaintextId].isEmpty) {
       _pendingReadEvent = true;
       Timer.run(_sendReadEvent);
     }
@@ -948,12 +948,12 @@
 
   _sendReadEvent() {
     _pendingReadEvent = false;
-    if (_status != CLOSED &&
+    if (_status != closedStatus &&
         _readEventsEnabled &&
         _pauseCount == 0 &&
         _secureFilter != null &&
-        !_secureFilter.buffers[READ_PLAINTEXT].isEmpty) {
-      _controller.add(RawSocketEvent.READ);
+        !_secureFilter.buffers[readPlaintextId].isEmpty) {
+      _controller.add(RawSocketEvent.read);
       _scheduleReadEvent();
     }
   }
@@ -964,24 +964,26 @@
         _writeEventsEnabled &&
         _pauseCount == 0 &&
         _secureFilter != null &&
-        _secureFilter.buffers[WRITE_PLAINTEXT].free > 0) {
+        _secureFilter.buffers[writePlaintextId].free > 0) {
       _writeEventsEnabled = false;
-      _controller.add(RawSocketEvent.WRITE);
+      _controller.add(RawSocketEvent.write);
     }
   }
 
   Future<_FilterStatus> _pushAllFilterStages() {
-    bool wasInHandshake = _status != CONNECTED;
-    List args = new List(2 + NUM_BUFFERS * 2);
+    bool wasInHandshake = _status != connectedStatus;
+    List args = new List(2 + bufferCount * 2);
     args[0] = _secureFilter._pointer();
     args[1] = wasInHandshake;
     var bufs = _secureFilter.buffers;
-    for (var i = 0; i < NUM_BUFFERS; ++i) {
+    for (var i = 0; i < bufferCount; ++i) {
       args[2 * i + 2] = bufs[i].start;
       args[2 * i + 3] = bufs[i].end;
     }
 
-    return _IOService._dispatch(_SSL_PROCESS_FILTER, args).then((response) {
+    return _IOService
+        ._dispatch(_IOService.sslProcessFilter, args)
+        .then((response) {
       if (response.length == 2) {
         if (wasInHandshake) {
           // If we're in handshake, throw a handshake error.
@@ -1000,19 +1002,19 @@
       _FilterStatus status = new _FilterStatus();
       // Compute writeEmpty as "write plaintext buffer and write encrypted
       // buffer were empty when we started and are empty now".
-      status.writeEmpty = bufs[WRITE_PLAINTEXT].isEmpty &&
-          start(WRITE_ENCRYPTED) == end(WRITE_ENCRYPTED);
+      status.writeEmpty = bufs[writePlaintextId].isEmpty &&
+          start(writeEncryptedId) == end(writeEncryptedId);
       // If we were in handshake when this started, _writeEmpty may be false
       // because the handshake wrote data after we checked.
       if (wasInHandshake) status.writeEmpty = false;
 
       // Compute readEmpty as "both read buffers were empty when we started
       // and are empty now".
-      status.readEmpty = bufs[READ_ENCRYPTED].isEmpty &&
-          start(READ_PLAINTEXT) == end(READ_PLAINTEXT);
+      status.readEmpty = bufs[readEncryptedId].isEmpty &&
+          start(readPlaintextId) == end(readPlaintextId);
 
-      _ExternalBuffer buffer = bufs[WRITE_PLAINTEXT];
-      int new_start = start(WRITE_PLAINTEXT);
+      _ExternalBuffer buffer = bufs[writePlaintextId];
+      int new_start = start(writePlaintextId);
       if (new_start != buffer.start) {
         status.progress = true;
         if (buffer.free == 0) {
@@ -1020,8 +1022,8 @@
         }
         buffer.start = new_start;
       }
-      buffer = bufs[READ_ENCRYPTED];
-      new_start = start(READ_ENCRYPTED);
+      buffer = bufs[readEncryptedId];
+      new_start = start(readEncryptedId);
       if (new_start != buffer.start) {
         status.progress = true;
         if (buffer.free == 0) {
@@ -1029,8 +1031,8 @@
         }
         buffer.start = new_start;
       }
-      buffer = bufs[WRITE_ENCRYPTED];
-      int new_end = end(WRITE_ENCRYPTED);
+      buffer = bufs[writeEncryptedId];
+      int new_end = end(writeEncryptedId);
       if (new_end != buffer.end) {
         status.progress = true;
         if (buffer.length == 0) {
@@ -1038,8 +1040,8 @@
         }
         buffer.end = new_end;
       }
-      buffer = bufs[READ_PLAINTEXT];
-      new_end = end(READ_PLAINTEXT);
+      buffer = bufs[readPlaintextId];
+      new_end = end(readPlaintextId);
       if (new_end != buffer.end) {
         status.progress = true;
         if (buffer.length == 0) {
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index 7c25e2c..0ab315e 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -9,31 +9,38 @@
  * IP version 4 (IPv4) and IP version 6 (IPv6) are supported.
  */
 class InternetAddressType {
-  static const InternetAddressType IP_V4 = const InternetAddressType._(0);
-  static const InternetAddressType IP_V6 = const InternetAddressType._(1);
-  static const InternetAddressType ANY = const InternetAddressType._(-1);
+  static const InternetAddressType IPv4 = const InternetAddressType._(0);
+  static const InternetAddressType IPv6 = const InternetAddressType._(1);
+  static const InternetAddressType any = const InternetAddressType._(-1);
+
+  @Deprecated("Use IPv4 instead")
+  static const InternetAddressType IP_V4 = IPv4;
+  @Deprecated("Use IPv6 instead")
+  static const InternetAddressType IP_V6 = IPv6;
+  @Deprecated("Use any instead")
+  static const InternetAddressType ANY = any;
 
   final int _value;
 
   const InternetAddressType._(this._value);
 
   factory InternetAddressType._from(int value) {
-    if (value == 0) return IP_V4;
-    if (value == 1) return IP_V6;
+    if (value == 0) return IPv4;
+    if (value == 1) return IPv6;
     throw new ArgumentError("Invalid type: $value");
   }
 
   /**
-   * Get the name of the type, e.g. "IP_V4" or "IP_V6".
+   * Get the name of the type, e.g. "IPv4" or "IPv6".
    */
   String get name {
     switch (_value) {
       case -1:
         return "ANY";
       case 0:
-        return "IP_V4";
+        return "IPv4";
       case 1:
-        return "IP_V6";
+        return "IPv6";
       default:
         throw new ArgumentError("Invalid InternetAddress");
     }
@@ -57,24 +64,32 @@
    * IP version 4 loopback address. Use this address when listening on
    * or connecting to the loopback adapter using IP version 4 (IPv4).
    */
+  static InternetAddress get loopbackIPv4 => LOOPBACK_IP_V4;
+  @Deprecated("Use loopbackIPv4 instead")
   external static InternetAddress get LOOPBACK_IP_V4;
 
   /**
    * IP version 6 loopback address. Use this address when listening on
    * or connecting to the loopback adapter using IP version 6 (IPv6).
    */
+  static InternetAddress get loopbackIPv6 => LOOPBACK_IP_V6;
+  @Deprecated("Use loopbackIPv6 instead")
   external static InternetAddress get LOOPBACK_IP_V6;
 
   /**
    * IP version 4 any address. Use this address when listening on
    * all adapters IP addresses using IP version 4 (IPv4).
    */
+  static InternetAddress get anyIPv4 => ANY_IP_V4;
+  @Deprecated("Use anyIPv4 instead")
   external static InternetAddress get ANY_IP_V4;
 
   /**
    * IP version 6 any address. Use this address when listening on
    * all adapters IP addresses using IP version 6 (IPv6).
    */
+  static InternetAddress get anyIPv6 => ANY_IP_V6;
+  @Deprecated("Use anyIPv6 instead")
   external static InternetAddress get ANY_IP_V6;
 
   /**
@@ -136,13 +151,13 @@
    * Lookup a host, returning a Future of a list of
    * [InternetAddress]s. If [type] is [InternetAddressType.ANY], it
    * will lookup both IP version 4 (IPv4) and IP version 6 (IPv6)
-   * addresses. If [type] is either [InternetAddressType.IP_V4] or
-   * [InternetAddressType.IP_V6] it will only lookup addresses of the
+   * addresses. If [type] is either [InternetAddressType.IPv4] or
+   * [InternetAddressType.IPv6] it will only lookup addresses of the
    * specified type. The order of the list can, and most likely will,
    * change over time.
    */
   external static Future<List<InternetAddress>> lookup(String host,
-      {InternetAddressType type: InternetAddressType.ANY});
+      {InternetAddressType type: InternetAddressType.any});
 
   /**
    * Clones the given [address] with the new [host].
@@ -192,14 +207,14 @@
    * If [includeLinkLocal] is `true`, the list of addresses of the returned
    * [NetworkInterface]s, may include link local addresses. Default is `false`.
    *
-   * If [type] is either [InternetAddressType.IP_V4] or
-   * [InternetAddressType.IP_V6] it will only lookup addresses of the
-   * specified type. Default is [InternetAddressType.ANY].
+   * If [type] is either [InternetAddressType.IPv4] or
+   * [InternetAddressType.IPv6] it will only lookup addresses of the
+   * specified type. Default is [InternetAddressType.any].
    */
   external static Future<List<NetworkInterface>> list(
       {bool includeLoopback: false,
       bool includeLinkLocal: false,
-      InternetAddressType type: InternetAddressType.ANY});
+      InternetAddressType type: InternetAddressType.any});
 }
 
 /**
@@ -220,10 +235,10 @@
    * perform a [InternetAddress.lookup] and use the first value in the
    * list. To listen on the loopback adapter, which will allow only
    * incoming connections from the local host, use the value
-   * [InternetAddress.LOOPBACK_IP_V4] or
-   * [InternetAddress.LOOPBACK_IP_V6]. To allow for incoming
+   * [InternetAddress.loopbackIPv4] or
+   * [InternetAddress.loopbackIPv6]. To allow for incoming
    * connection from the network use either one of the values
-   * [InternetAddress.ANY_IP_V4] or [InternetAddress.ANY_IP_V6] to
+   * [InternetAddress.anyIPv4] or [InternetAddress.anyIPv6] to
    * bind to all interfaces or the IP address of a specific interface.
    *
    * If an IP version 6 (IPv6) address is used, both IP version 6
@@ -285,10 +300,10 @@
    * perform a [InternetAddress.lookup] and use the first value in the
    * list. To listen on the loopback adapter, which will allow only
    * incoming connections from the local host, use the value
-   * [InternetAddress.LOOPBACK_IP_V4] or
-   * [InternetAddress.LOOPBACK_IP_V6]. To allow for incoming
+   * [InternetAddress.loopbackIPv4] or
+   * [InternetAddress.loopbackIPv6]. To allow for incoming
    * connection from the network use either one of the values
-   * [InternetAddress.ANY_IP_V4] or [InternetAddress.ANY_IP_V6] to
+   * [InternetAddress.anyIPv4] or [InternetAddress.anyIPv6] to
    * bind to all interfaces or the IP address of a specific interface.
    *
    * If an IP version 6 (IPv6) address is used, both IP version 6
@@ -337,9 +352,17 @@
  * [RawSocket.close] to close a socket in the specified direction(s).
  */
 class SocketDirection {
-  static const SocketDirection RECEIVE = const SocketDirection._(0);
-  static const SocketDirection SEND = const SocketDirection._(1);
-  static const SocketDirection BOTH = const SocketDirection._(2);
+  static const SocketDirection receive = const SocketDirection._(0);
+  static const SocketDirection send = const SocketDirection._(1);
+  static const SocketDirection both = const SocketDirection._(2);
+
+  @Deprecated("Use receive instead")
+  static const SocketDirection RECEIVE = receive;
+  @Deprecated("Use send instead")
+  static const SocketDirection SEND = send;
+  @Deprecated("Use both instead")
+  static const SocketDirection BOTH = both;
+
   final _value;
 
   const SocketDirection._(this._value);
@@ -352,18 +375,21 @@
  */
 class SocketOption {
   /**
-   * Enable or disable no-delay on the socket. If TCP_NODELAY is enabled, the
+   * Enable or disable no-delay on the socket. If tcpNoDelay is enabled, the
    * socket will not buffer data internally, but instead write each data chunk
    * as an individual TCP packet.
    *
-   * TCP_NODELAY is disabled by default.
+   * tcpNoDelay is disabled by default.
    */
-  static const SocketOption TCP_NODELAY = const SocketOption._(0);
+  static const SocketOption tcpNoDelay = const SocketOption._(0);
+  @Deprecated("Use tcpNoDelay instead")
+  static const SocketOption TCP_NODELAY = tcpNoDelay;
 
-  static const SocketOption _IP_MULTICAST_LOOP = const SocketOption._(1);
-  static const SocketOption _IP_MULTICAST_HOPS = const SocketOption._(2);
-  static const SocketOption _IP_MULTICAST_IF = const SocketOption._(3);
-  static const SocketOption _IP_BROADCAST = const SocketOption._(4);
+  static const SocketOption _ipMulticastLoop = const SocketOption._(1);
+  static const SocketOption _ipMulticastHops = const SocketOption._(2);
+  static const SocketOption _ipMulticastIf = const SocketOption._(3);
+  static const SocketOption _ipBroadcast = const SocketOption._(4);
+
   final _value;
 
   const SocketOption._(this._value);
@@ -373,19 +399,29 @@
  * Events for the [RawSocket].
  */
 class RawSocketEvent {
-  static const RawSocketEvent READ = const RawSocketEvent._(0);
-  static const RawSocketEvent WRITE = const RawSocketEvent._(1);
-  static const RawSocketEvent READ_CLOSED = const RawSocketEvent._(2);
-  static const RawSocketEvent CLOSED = const RawSocketEvent._(3);
+  static const RawSocketEvent read = const RawSocketEvent._(0);
+  static const RawSocketEvent write = const RawSocketEvent._(1);
+  static const RawSocketEvent readClosed = const RawSocketEvent._(2);
+  static const RawSocketEvent closed = const RawSocketEvent._(3);
+
+  @Deprecated("Use read instead")
+  static const RawSocketEvent READ = read;
+  @Deprecated("Use write instead")
+  static const RawSocketEvent WRITE = write;
+  @Deprecated("Use readClosed instead")
+  static const RawSocketEvent READ_CLOSED = readClosed;
+  @Deprecated("Use closed instead")
+  static const RawSocketEvent CLOSED = closed;
+
   final int _value;
 
   const RawSocketEvent._(this._value);
   String toString() {
     return const [
-      'RawSocketEvent:READ',
-      'RawSocketEvent:WRITE',
-      'RawSocketEvent:READ_CLOSED',
-      'RawSocketEvent:CLOSED'
+      'RawSocketEvent.read',
+      'RawSocketEvent.write',
+      'RawSocketEvent.readClosed',
+      'RawSocketEvent.closed'
     ][_value];
   }
 }
@@ -396,13 +432,13 @@
  */
 abstract class RawSocket implements Stream<RawSocketEvent> {
   /**
-   * Set or get, if the [RawSocket] should listen for [RawSocketEvent.READ]
+   * Set or get, if the [RawSocket] should listen for [RawSocketEvent.read]
    * events. Default is [:true:].
    */
   bool readEventsEnabled;
 
   /**
-   * Set or get, if the [RawSocket] should listen for [RawSocketEvent.WRITE]
+   * Set or get, if the [RawSocket] should listen for [RawSocketEvent.write]
    * events. Default is [:true:].
    * This is a one-shot listener, and writeEventsEnabled must be set
    * to true again to receive another write event.
@@ -486,15 +522,15 @@
    *
    * Calling [close] will never throw an exception
    * and calling it several times is supported. Calling [close] can result in
-   * a [RawSocketEvent.READ_CLOSED] event.
+   * a [RawSocketEvent.readClosed] event.
    */
   Future<RawSocket> close();
 
   /**
    * Shutdown the socket in the [direction]. Calling [shutdown] will never
    * throw an exception and calling it several times is supported. Calling
-   * shutdown with either [SocketDirection.BOTH] or [SocketDirection.RECEIVE]
-   * can result in a [RawSocketEvent.READ_CLOSED] event.
+   * shutdown with either [SocketDirection.both] or [SocketDirection.receive]
+   * can result in a [RawSocketEvent.readClosed] event.
    */
   void shutdown(SocketDirection direction);
 
@@ -611,19 +647,19 @@
  * exposing the raw events signaled by the system. It's a [Stream] of
  * [RawSocketEvent]s.
  *
- * Note that the event [RawSocketEvent.READ_CLOSED] will never be
+ * Note that the event [RawSocketEvent.readClosed] will never be
  * received as an UDP socket cannot be closed by a remote peer.
  */
 abstract class RawDatagramSocket extends Stream<RawSocketEvent> {
   /**
    * Set or get, if the [RawDatagramSocket] should listen for
-   * [RawSocketEvent.READ] events. Default is [:true:].
+   * [RawSocketEvent.read] events. Default is [:true:].
    */
   bool readEventsEnabled;
 
   /**
    * Set or get, if the [RawDatagramSocket] should listen for
-   * [RawSocketEvent.WRITE] events. Default is [:true:].  This is a
+   * [RawSocketEvent.write] events. Default is [:true:].  This is a
    * one-shot listener, and writeEventsEnabled must be set to true
    * again to receive another write event.
    */
diff --git a/sdk/lib/io/stdio.dart b/sdk/lib/io/stdio.dart
index 09f2698..626ce7e 100644
--- a/sdk/lib/io/stdio.dart
+++ b/sdk/lib/io/stdio.dart
@@ -4,11 +4,11 @@
 
 part of dart.io;
 
-const int _STDIO_HANDLE_TYPE_TERMINAL = 0;
-const int _STDIO_HANDLE_TYPE_PIPE = 1;
-const int _STDIO_HANDLE_TYPE_FILE = 2;
-const int _STDIO_HANDLE_TYPE_SOCKET = 3;
-const int _STDIO_HANDLE_TYPE_OTHER = 4;
+const int _stdioHandleTypeTerminal = 0;
+const int _stdioHandleTypePipe = 1;
+const int _stdioHandleTypeFile = 2;
+const int _stdioHandleTypeSocket = 3;
+const int _stdioHandleTypeOther = 4;
 
 class _StdStream extends Stream<List<int>> {
   final Stream<List<int>> _stream;
@@ -38,7 +38,7 @@
    * line is available.
    *
    * The argument [encoding] can be used to changed how the input should be
-   * decoded. Default is [SYSTEM_ENCODING].
+   * decoded. Default is [systemEncoding].
    *
    * If [retainNewlines] is `false`, the returned String will not contain the
    * final newline. If `true`, the returned String will contain the line
@@ -49,13 +49,13 @@
    * Returns `null` if no bytes preceded the end of input.
    */
   String readLineSync(
-      {Encoding encoding: SYSTEM_ENCODING, bool retainNewlines: false}) {
+      {Encoding encoding: systemEncoding, bool retainNewlines: false}) {
     const CR = 13;
     const LF = 10;
     final List<int> line = <int>[];
     // On Windows, if lineMode is disabled, only CR is received.
     bool crIsNewline = Platform.isWindows &&
-        (stdioType(stdin) == StdioType.TERMINAL) &&
+        (stdioType(stdin) == StdioType.terminal) &&
         !lineMode;
     if (retainNewlines) {
       int byte;
@@ -175,7 +175,7 @@
    */
   bool get hasTerminal {
     try {
-      return stdioType(this) == StdioType.TERMINAL;
+      return stdioType(this) == StdioType.terminal;
     } on FileSystemException catch (_) {
       // If stdioType throws a FileSystemException, then it is not hooked up to
       // a terminal, probably because it is closed, but let other exception
@@ -358,10 +358,20 @@
 
 /// The type of object a standard IO stream is attached to.
 class StdioType {
-  static const StdioType TERMINAL = const StdioType._("terminal");
-  static const StdioType PIPE = const StdioType._("pipe");
-  static const StdioType FILE = const StdioType._("file");
-  static const StdioType OTHER = const StdioType._("other");
+  static const StdioType terminal = const StdioType._("terminal");
+  static const StdioType pipe = const StdioType._("pipe");
+  static const StdioType file = const StdioType._("file");
+  static const StdioType other = const StdioType._("other");
+
+  @Deprecated("Use terminal instead")
+  static const StdioType TERMINAL = terminal;
+  @Deprecated("Use pipe instead")
+  static const StdioType PIPE = pipe;
+  @Deprecated("Use file instead")
+  static const StdioType FILE = file;
+  @Deprecated("Use other instead")
+  static const StdioType OTHER = other;
+
   final String name;
   const StdioType._(this.name);
   String toString() => "StdioType: $name";
@@ -416,39 +426,39 @@
   } else if (object == stdout || object == stderr) {
     int stdiofd = object == stdout ? _stdoutFD : _stderrFD;
     switch (_StdIOUtils._getStdioHandleType(stdiofd)) {
-      case _STDIO_HANDLE_TYPE_TERMINAL:
-        return StdioType.TERMINAL;
-      case _STDIO_HANDLE_TYPE_PIPE:
-        return StdioType.PIPE;
-      case _STDIO_HANDLE_TYPE_FILE:
-        return StdioType.FILE;
+      case _stdioHandleTypeTerminal:
+        return StdioType.terminal;
+      case _stdioHandleTypePipe:
+        return StdioType.pipe;
+      case _stdioHandleTypeFile:
+        return StdioType.file;
     }
   }
   if (object is _FileStream) {
-    return StdioType.FILE;
+    return StdioType.file;
   }
   if (object is Socket) {
     int socketType = _StdIOUtils._socketType(object);
-    if (socketType == null) return StdioType.OTHER;
+    if (socketType == null) return StdioType.other;
     switch (socketType) {
-      case _STDIO_HANDLE_TYPE_TERMINAL:
-        return StdioType.TERMINAL;
-      case _STDIO_HANDLE_TYPE_PIPE:
-        return StdioType.PIPE;
-      case _STDIO_HANDLE_TYPE_FILE:
-        return StdioType.FILE;
+      case _stdioHandleTypeTerminal:
+        return StdioType.terminal;
+      case _stdioHandleTypePipe:
+        return StdioType.pipe;
+      case _stdioHandleTypeFile:
+        return StdioType.file;
     }
   }
   if (object is _IOSinkImpl) {
     try {
       if (object._target is _FileStreamConsumer) {
-        return StdioType.FILE;
+        return StdioType.file;
       }
     } catch (e) {
       // Only the interface implemented, _sink not available.
     }
   }
-  return StdioType.OTHER;
+  return StdioType.other;
 }
 
 class _StdIOUtils {
diff --git a/sdk/lib/io/string_transformer.dart b/sdk/lib/io/string_transformer.dart
index fb864ad..5f4a14c 100644
--- a/sdk/lib/io/string_transformer.dart
+++ b/sdk/lib/io/string_transformer.dart
@@ -11,6 +11,8 @@
 ///
 /// On Windows this will use the currently active code page for the
 /// conversion. On all other systems it will always use UTF-8.
+const SystemEncoding systemEncoding = const SystemEncoding();
+@Deprecated("Use systemEncoding instead")
 const SystemEncoding SYSTEM_ENCODING = const SystemEncoding();
 
 /**
diff --git a/sdk/lib/js/_js_client.dart b/sdk/lib/js/_js_client.dart
index 74df24d..de25540 100644
--- a/sdk/lib/js/_js_client.dart
+++ b/sdk/lib/js/_js_client.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.
 
-import 'dart:html' show Blob, Event, ImageData, Node, Window;
+import 'dart:html' show Blob, Event, ImageData, Node, Window, WorkerGlobalScope;
 import 'dart:indexed_db' show KeyRange;
 import 'dart:_js_helper' show patch;
 import 'dart:_foreign_helper' show JS;
@@ -14,8 +14,9 @@
     o is KeyRange ||
     o is ImageData ||
     o is Node ||
-    o is Window;
+    o is Window ||
+    o is WorkerGlobalScope;
 
 @patch
 Object convertFromBrowserObject(dynamic o) =>
-    JS('Blob|Event|KeyRange|ImageData|Node|Window', '#', o);
+    JS('Blob|Event|KeyRange|ImageData|Node|Window|WorkerGlobalScope', '#', o);
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 6296cde..ceb2592 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -886,6 +886,7 @@
 LayoutTests/fast/speechsynthesis/speech-synthesis-voices_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/storage/disallowed-storage_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/storage/storage-disallowed-in-data-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/computedstylemargin_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/sub-pixel/cssom-subpixel-precision_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/sub-pixel/replaced-element-baseline_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/table/anonymous-table-section-removed_t01: RuntimeError # Please triage this failure
@@ -6492,7 +6493,6 @@
 LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/innerHtml_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/isContentEditable_A01_t01: RuntimeError, Pass # Fails 19 out of 20.
-LibTest/html/IFrameElement/isContentEditable_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # Please triage this failure
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index 5d636c5..d72657b 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -57,10 +57,10 @@
 Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t01: MissingCompileTimeError
 Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t02: MissingCompileTimeError
 Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t02: MissingCompileTimeError
-Language/Classes/Getters/same_name_method_t03: MissingCompileTimeError
-Language/Classes/Getters/same_name_method_t04: MissingCompileTimeError
-Language/Classes/Getters/same_name_method_t05: MissingCompileTimeError
-Language/Classes/Getters/same_name_method_t07: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_setter_t02: CompileTimeError # Issue 14736
+Language/Classes/Setters/name_t03: CompileTimeError
+Language/Classes/Setters/name_t04: CompileTimeError
+Language/Classes/Setters/name_t06: CompileTimeError
 Language/Classes/Superinterfaces/more_than_once_t01: MissingCompileTimeError
 Language/Classes/Superinterfaces/superclass_as_superinterface_t01: MissingCompileTimeError
 Language/Classes/same_name_instance_and_static_members_t01: MissingCompileTimeError
@@ -72,9 +72,10 @@
 Language/Expressions/Constants/no_other_constant_expressions_t11: MissingCompileTimeError
 Language/Expressions/Constants/ternary_operator_t02: MissingCompileTimeError
 Language/Expressions/Instance_Creation/Const/exception_t01: MissingCompileTimeError
+Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_members_t01: CompileTimeError
+Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_method_and_getter_t01: CompileTimeError
+Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_method_and_getter_t02: CompileTimeError
 Language/Metadata/compilation_t03: MissingCompileTimeError
-Language/Mixins/Mixin_Application/error_t01: MissingCompileTimeError
-Language/Mixins/Mixin_Application/error_t02: MissingCompileTimeError
 
 [ $compiler == fasta && !$strong ]
 Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t01: MissingCompileTimeError
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 76eadd0..2dd3260 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -188,6 +188,9 @@
 LibTest/collection/ListMixin/ListMixin_class_A01_t02: Skip # co19 issue 673, These tests take too much memory (300 MB) for our 1 GB test machine co19 issue 673. http://code.google.com/p/co19/issues/detail?id=673
 LibTest/core/List/List_class_A01_t02: Skip # co19 issue 673, These tests take too much memory (300 MB) for our 1 GB test machine co19 issue 673. http://code.google.com/p/co19/issues/detail?id=673
 
+[ $arch != arm64 && $arch != simarm64 && $arch != simdbc && $arch != simdbc64 && $arch != x64 && ($runtime == dart_precompiled || $runtime == vm) ]
+LibTest/core/int/operator_left_shift_A01_t02: Fail # co19 issue 129
+
 [ $arch == ia32 && $mode == release && $runtime == vm && $system == linux ]
 service/dev_fs_spawn_test: Pass, Fail # Issue 28411
 
@@ -379,9 +382,6 @@
 LibTest/typed_data/Uint64List/Uint64List.view_A01_t02: CompileTimeError # Large integer literal
 WebPlatformTest/*: SkipByDesign # dart:html not supported on VM.
 
-[ $runtime == dart_precompiled || $runtime == vm ]
-LibTest/core/int/operator_left_shift_A01_t02: Fail # Can't represent 1 << 2147483647 without running out of memory.
-
 [ $runtime == flutter || $hot_reload || $hot_reload_rollback ]
 Language/Expressions/Assignment/prefix_object_t02: Skip # Requires deferred libraries
 Language/Expressions/Constants/constant_constructor_t03: Skip # Requires deferred libraries
diff --git a/tests/compiler/dart2js/all_native_test.dart b/tests/compiler/dart2js/all_native_test.dart
index e1f236c..9550f03 100644
--- a/tests/compiler/dart2js/all_native_test.dart
+++ b/tests/compiler/dart2js/all_native_test.dart
@@ -9,8 +9,6 @@
 
 main() {
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await test([Flags.useOldFrontend]);
     print('--test from kernel------------------------------------------------');
     await test([]);
   });
diff --git a/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart b/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart
index f213526..159d8d2 100644
--- a/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart
+++ b/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart
@@ -78,29 +78,19 @@
   var timesOne = new RegExp(r"\* 1");
   var oneTimes = new RegExp(r"1 \*");
 
-  test({bool useKernel}) async {
-    await compileAndDoNotMatch(INT_PLUS_ZERO, 'main', plusZero,
-        useKernel: useKernel);
-    await compileAndDoNotMatch(ZERO_PLUS_INT, 'main', zeroPlus,
-        useKernel: useKernel);
-    await compileAndMatch(NUM_PLUS_ZERO, 'main', plusZero,
-        useKernel: useKernel);
-    await compileAndMatch(ZERO_PLUS_NUM, 'main', zeroPlus,
-        useKernel: useKernel);
-    await compileAndDoNotMatch(INT_TIMES_ONE, 'main', timesOne,
-        useKernel: useKernel);
-    await compileAndDoNotMatch(ONE_TIMES_INT, 'main', oneTimes,
-        useKernel: useKernel);
-    await compileAndDoNotMatch(NUM_TIMES_ONE, 'main', timesOne,
-        useKernel: useKernel);
-    await compileAndDoNotMatch(ONE_TIMES_NUM, 'main', oneTimes,
-        useKernel: useKernel);
+  test() async {
+    await compileAndDoNotMatch(INT_PLUS_ZERO, 'main', plusZero);
+    await compileAndDoNotMatch(ZERO_PLUS_INT, 'main', zeroPlus);
+    await compileAndMatch(NUM_PLUS_ZERO, 'main', plusZero);
+    await compileAndMatch(ZERO_PLUS_NUM, 'main', zeroPlus);
+    await compileAndDoNotMatch(INT_TIMES_ONE, 'main', timesOne);
+    await compileAndDoNotMatch(ONE_TIMES_INT, 'main', oneTimes);
+    await compileAndDoNotMatch(NUM_TIMES_ONE, 'main', timesOne);
+    await compileAndDoNotMatch(ONE_TIMES_NUM, 'main', oneTimes);
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await test(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await test(useKernel: true);
+    await test();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/array_static_intercept_test.dart b/tests/compiler/dart2js/codegen/array_static_intercept_test.dart
index 95bddad..f7cb5e3 100644
--- a/tests/compiler/dart2js/codegen/array_static_intercept_test.dart
+++ b/tests/compiler/dart2js/codegen/array_static_intercept_test.dart
@@ -15,9 +15,8 @@
 """;
 
 main() {
-  test({bool useKernel}) async {
-    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+  test() async {
+    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       Expect.isTrue(generated.contains(r'.add$1('));
       Expect.isTrue(generated.contains(r'.removeLast$0('));
       Expect.isTrue(generated.contains(r'.length'),
@@ -26,9 +25,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await test(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await test(useKernel: true);
+    await test();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/boolify_test.dart b/tests/compiler/dart2js/codegen/boolify_test.dart
index afaefc5..9f0c41b 100644
--- a/tests/compiler/dart2js/codegen/boolify_test.dart
+++ b/tests/compiler/dart2js/codegen/boolify_test.dart
@@ -17,17 +17,14 @@
 """;
 
 main() {
-  test({bool useKernel}) async {
-    await compile(TEST, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+  test() async {
+    await compile(TEST, entry: 'foo', check: (String generated) {
       Expect.isTrue(generated.contains('foo() !== true)'));
     });
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await test(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await test(useKernel: true);
+    await test();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/builtin_equals_test.dart b/tests/compiler/dart2js/codegen/builtin_equals_test.dart
index 9adc8fa..f60d067 100644
--- a/tests/compiler/dart2js/codegen/builtin_equals_test.dart
+++ b/tests/compiler/dart2js/codegen/builtin_equals_test.dart
@@ -18,11 +18,9 @@
 """;
 
 main() {
-  test({bool useKernel}) async {
-    await compile(TEST,
-        entry: 'foo',
-        enableTypeAssertions: true,
-        useKernel: useKernel, check: (String generated) {
+  test() async {
+    await compile(TEST, entry: 'foo', enableTypeAssertions: true,
+        check: (String generated) {
       Expect.isTrue(!generated.contains('eqB'));
 
       RegExp regexp = new RegExp('==');
@@ -32,9 +30,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await test(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await test(useKernel: true);
+    await test();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/builtin_interceptor_test.dart b/tests/compiler/dart2js/codegen/builtin_interceptor_test.dart
index 1384a0f..b8e7201 100644
--- a/tests/compiler/dart2js/codegen/builtin_interceptor_test.dart
+++ b/tests/compiler/dart2js/codegen/builtin_interceptor_test.dart
@@ -25,25 +25,20 @@
 """;
 
 main() {
-  test({bool useKernel}) async {
-    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+  test() async {
+    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       Expect.isTrue(generated.contains("return 3;"));
     });
-    await compile(TEST_TWO, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+    await compile(TEST_TWO, entry: 'foo', check: (String generated) {
       Expect.isTrue(generated.contains("return 3;"));
     });
-    await compile(TEST_THREE, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+    await compile(TEST_THREE, entry: 'foo', check: (String generated) {
       Expect.isTrue(generated.contains("push(2);"));
     });
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await test(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await test(useKernel: true);
+    await test();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/class_codegen2_test.dart b/tests/compiler/dart2js/codegen/class_codegen2_test.dart
index 8577b77..2fb2595 100644
--- a/tests/compiler/dart2js/codegen/class_codegen2_test.dart
+++ b/tests/compiler/dart2js/codegen/class_codegen2_test.dart
@@ -89,17 +89,15 @@
   // { a: true, }. Make sure this doesn't happen again.
   RegExp danglingComma = new RegExp(r',[ \n]*}');
 
-  Future runTests(CompileMode compileMode) async {
+  Future runTests() async {
     for (String test in [TEST_ONE, TEST_TWO, TEST_THREE, TEST_FOUR]) {
-      String generated = await compileAll(test, compileMode: compileMode);
+      String generated = await compileAll(test);
       Expect.isFalse(danglingComma.hasMatch(generated));
     }
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(CompileMode.memory);
     print('--test from kernel------------------------------------------------');
-    await runTests(CompileMode.kernel);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/class_codegen_test.dart b/tests/compiler/dart2js/codegen/class_codegen_test.dart
index 693e934..b27fda4 100644
--- a/tests/compiler/dart2js/codegen/class_codegen_test.dart
+++ b/tests/compiler/dart2js/codegen/class_codegen_test.dart
@@ -63,45 +63,43 @@
 }
 """;
 
-twoClasses(CompileMode compileMode) async {
-  String generated = await compileAll(TEST_ONE, compileMode: compileMode);
+twoClasses() async {
+  String generated = await compileAll(TEST_ONE);
   Expect.isTrue(generated.contains(new RegExp('A: {[ \n]*"\\^": "Object;"')));
   Expect.isTrue(generated.contains(new RegExp('B: {[ \n]*"\\^": "Object;"')));
 }
 
-subClass(CompileMode compileMode) async {
+subClass() async {
   checkOutput(String generated) {
     Expect.isTrue(generated.contains(new RegExp('A: {[ \n]*"\\^": "Object;"')));
     Expect.isTrue(generated.contains(new RegExp('B: {[ \n]*"\\^": "A;"')));
   }
 
-  checkOutput(await compileAll(TEST_TWO, compileMode: compileMode));
-  checkOutput(await compileAll(TEST_THREE, compileMode: compileMode));
+  checkOutput(await compileAll(TEST_TWO));
+  checkOutput(await compileAll(TEST_THREE));
 }
 
-fieldTest(CompileMode compileMode) async {
-  String generated = await compileAll(TEST_FOUR, compileMode: compileMode);
+fieldTest() async {
+  String generated = await compileAll(TEST_FOUR);
   Expect.isTrue(generated
       .contains(new RegExp('B: {[ \n]*"\\^": "A;y,z,x",[ \n]*static:')));
 }
 
-constructor1(CompileMode compileMode) async {
-  String generated = await compileAll(TEST_FIVE, compileMode: compileMode);
+constructor1() async {
+  String generated = await compileAll(TEST_FIVE);
   Expect.isTrue(generated.contains(new RegExp(r"new [$A-Z]+\.A\(a\);")));
 }
 
 main() {
-  runTests(CompileMode compileMode) async {
-    await twoClasses(compileMode);
-    await subClass(compileMode);
-    await fieldTest(compileMode);
-    await constructor1(compileMode);
+  runTests() async {
+    await twoClasses();
+    await subClass();
+    await fieldTest();
+    await constructor1();
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(CompileMode.memory);
     print('--test from kernel------------------------------------------------');
-    await runTests(CompileMode.kernel);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/class_order_test.dart b/tests/compiler/dart2js/codegen/class_order_test.dart
index 1946305..14d79a7 100644
--- a/tests/compiler/dart2js/codegen/class_order_test.dart
+++ b/tests/compiler/dart2js/codegen/class_order_test.dart
@@ -36,18 +36,16 @@
   // we just verify that their members are in the correct order.
   RegExp regexp = new RegExp(r"foo\$0?:(.|\n)*bar\$0:(.|\n)*gee\$0:");
 
-  runTests(CompileMode compileMode) async {
-    String generated1 = await compileAll(TEST_ONE, compileMode: compileMode);
+  runTests() async {
+    String generated1 = await compileAll(TEST_ONE);
     Expect.isTrue(regexp.hasMatch(generated1));
 
-    String generated2 = await compileAll(TEST_TWO, compileMode: compileMode);
+    String generated2 = await compileAll(TEST_TWO);
     Expect.isTrue(regexp.hasMatch(generated2));
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(CompileMode.memory);
     print('--test from kernel------------------------------------------------');
-    await runTests(CompileMode.kernel);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/closure_codegen_test.dart b/tests/compiler/dart2js/codegen/closure_codegen_test.dart
index 07650a2..927d023 100644
--- a/tests/compiler/dart2js/codegen/closure_codegen_test.dart
+++ b/tests/compiler/dart2js/codegen/closure_codegen_test.dart
@@ -41,47 +41,37 @@
 main() { new A().foo(1); }
 """;
 
-Future closureInvocation({bool useKernel, bool minify, String prefix}) async {
-  await compile(TEST_INVOCATION0, useKernel: useKernel, minify: minify,
-      check: (String generated) {
+Future closureInvocation({bool minify, String prefix}) async {
+  await compile(TEST_INVOCATION0, minify: minify, check: (String generated) {
     Expect.isTrue(generated.contains(".$prefix\$0()"));
   });
-  await compile(TEST_INVOCATION1, useKernel: useKernel, minify: minify,
-      check: (String generated) {
+  await compile(TEST_INVOCATION1, minify: minify, check: (String generated) {
     Expect.isTrue(generated.contains(".$prefix\$1(1)"));
   });
-  await compile(TEST_INVOCATION2, useKernel: useKernel, minify: minify,
-      check: (String generated) {
+  await compile(TEST_INVOCATION2, minify: minify, check: (String generated) {
     Expect.isTrue(generated.contains(".$prefix\$2(1,${minify ? "" : " "}2)"));
   });
 }
 
 // Make sure that the bailout version does not introduce a second version of
 // the closure.
-Future closureBailout(CompileMode compileMode,
-    {bool minify, String prefix}) async {
-  String generated =
-      await compileAll(TEST_BAILOUT, compileMode: compileMode, minify: minify);
+Future closureBailout({bool minify, String prefix}) async {
+  String generated = await compileAll(TEST_BAILOUT, minify: minify);
   RegExp regexp = new RegExp("$prefix\\\$0:${minify ? "" : " "}function");
   Iterator<Match> matches = regexp.allMatches(generated).iterator;
   checkNumberOfMatches(matches, 1);
 }
 
 main() {
-  runTests({bool useKernel}) async {
-    await closureInvocation(
-        useKernel: useKernel, minify: false, prefix: "call");
-    await closureInvocation(useKernel: useKernel, minify: true, prefix: "");
-    CompileMode compileMode =
-        useKernel ? CompileMode.kernel : CompileMode.memory;
-    await closureBailout(compileMode, minify: false, prefix: "call");
-    await closureBailout(compileMode, minify: true, prefix: "");
+  runTests() async {
+    await closureInvocation(minify: false, prefix: "call");
+    await closureInvocation(minify: true, prefix: "");
+    await closureBailout(minify: false, prefix: "call");
+    await closureBailout(minify: true, prefix: "");
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/code_motion_test.dart b/tests/compiler/dart2js/codegen/code_motion_test.dart
index f800e33..b727164 100644
--- a/tests/compiler/dart2js/codegen/code_motion_test.dart
+++ b/tests/compiler/dart2js/codegen/code_motion_test.dart
@@ -22,9 +22,8 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    await compile(TEST_ONE, useKernel: useKernel, entry: 'foo',
-        check: (String generated) {
+  runTest() async {
+    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       RegExp regexp = new RegExp('a \\+ b');
       Iterator matches = regexp.allMatches(generated).iterator;
       Expect.isTrue(matches.moveNext());
@@ -33,9 +32,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart b/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart
index d576b64..74dda1b 100644
--- a/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart
+++ b/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart
@@ -33,21 +33,15 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
-    await compileAndMatch(TEST_1, 'foo', new RegExp(r'return 72'),
-        useKernel: useKernel);
-    await compileAndDoNotMatch(TEST_1, 'foo', new RegExp(r'Hello'),
-        useKernel: useKernel);
-    await compileAndMatch(TEST_2, 'foo', new RegExp(r'Hello'),
-        useKernel: useKernel);
-    await compileAndMatch(TEST_3, 'foo', new RegExp(r'Hello'),
-        useKernel: useKernel);
+  runTests() async {
+    await compileAndMatch(TEST_1, 'foo', new RegExp(r'return 72'));
+    await compileAndDoNotMatch(TEST_1, 'foo', new RegExp(r'Hello'));
+    await compileAndMatch(TEST_2, 'foo', new RegExp(r'Hello'));
+    await compileAndMatch(TEST_3, 'foo', new RegExp(r'Hello'));
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/constant_folding_test.dart b/tests/compiler/dart2js/codegen/constant_folding_test.dart
index 80bcac7..c6d0a58 100644
--- a/tests/compiler/dart2js/codegen/constant_folding_test.dart
+++ b/tests/compiler/dart2js/codegen/constant_folding_test.dart
@@ -57,14 +57,11 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
-    await compileAndMatch(NUMBER_FOLDING, 'main', new RegExp(r"print\(7\)"),
-        useKernel: useKernel);
+  runTests() async {
+    await compileAndMatch(NUMBER_FOLDING, 'main', new RegExp(r"print\(7\)"));
     await compileAndMatch(
-        NEGATIVE_NUMBER_FOLDING, 'main', new RegExp(r"print\(1\)"),
-        useKernel: useKernel);
-    await compile(NULL_EQUALS_FOLDING, useKernel: useKernel, entry: 'foo',
-        check: (String generated) {
+        NEGATIVE_NUMBER_FOLDING, 'main', new RegExp(r"print\(1\)"));
+    await compile(NULL_EQUALS_FOLDING, entry: 'foo', check: (String generated) {
       RegExp regexp = new RegExp(r'a == null');
       Expect.isTrue(regexp.hasMatch(generated));
 
@@ -77,23 +74,17 @@
       regexp = new RegExp('"foo" === d');
       Expect.isTrue(regexp.hasMatch(generated));
     });
-    await compileAndMatch(LIST_LENGTH_FOLDING, 'foo', new RegExp(r"return 3"),
-        useKernel: useKernel);
-    await compileAndMatch(LIST_INDEX_FOLDING, 'foo', new RegExp(r"return 1"),
-        useKernel: useKernel);
-    await compileAndDoNotMatch(LIST_INDEX_FOLDING, 'foo', new RegExp(r"ioore"),
-        useKernel: useKernel);
-    await compileAndMatch(STRING_LENGTH_FOLDING, 'foo', new RegExp(r"return 3"),
-        useKernel: useKernel);
+    await compileAndMatch(LIST_LENGTH_FOLDING, 'foo', new RegExp(r"return 3"));
+    await compileAndMatch(LIST_INDEX_FOLDING, 'foo', new RegExp(r"return 1"));
+    await compileAndDoNotMatch(LIST_INDEX_FOLDING, 'foo', new RegExp(r"ioore"));
     await compileAndMatch(
-        RANGE_ERROR_INDEX_FOLDING, 'foo', new RegExp(r"ioore"),
-        useKernel: useKernel);
+        STRING_LENGTH_FOLDING, 'foo', new RegExp(r"return 3"));
+    await compileAndMatch(
+        RANGE_ERROR_INDEX_FOLDING, 'foo', new RegExp(r"ioore"));
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/constant_namer_test.dart b/tests/compiler/dart2js/codegen/constant_namer_test.dart
index 14d93ce..3a491f9 100644
--- a/tests/compiler/dart2js/codegen/constant_namer_test.dart
+++ b/tests/compiler/dart2js/codegen/constant_namer_test.dart
@@ -27,9 +27,8 @@
     Expect.isTrue(generated.contains(text), text);
   }
 
-  runTests({bool useKernel}) async {
-    String generated =
-        await compile(TEST_ONE, useKernel: useKernel, entry: 'test');
+  runTests() async {
+    String generated = await compile(TEST_ONE, entry: 'test');
     check(generated, '.List_12_53.');
     check(generated, '.Token_start_null.');
     check(generated, '.Token_end_null.');
@@ -38,9 +37,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/dead_code_test.dart b/tests/compiler/dart2js/codegen/dead_code_test.dart
index 56f42d1..d62af18 100644
--- a/tests/compiler/dart2js/codegen/dead_code_test.dart
+++ b/tests/compiler/dart2js/codegen/dead_code_test.dart
@@ -17,16 +17,13 @@
 ''';
 
 main() {
-  runTest({bool useKernel}) async {
-    String generated = await compileAll(TEST,
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+  runTest() async {
+    String generated = await compileAll(TEST);
     Expect.isFalse(generated.contains('return 42'), 'dead code not eliminated');
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/dead_phi_eliminator_test.dart b/tests/compiler/dart2js/codegen/dead_phi_eliminator_test.dart
index aa5597e..d6627b3 100644
--- a/tests/compiler/dart2js/codegen/dead_phi_eliminator_test.dart
+++ b/tests/compiler/dart2js/codegen/dead_phi_eliminator_test.dart
@@ -18,18 +18,15 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    await compile(TEST_ONE, useKernel: useKernel, entry: 'foo',
-        check: (String generated) {
+  runTest() async {
+    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       RegExp regexp = new RegExp("toBeRemoved");
       Expect.isTrue(!regexp.hasMatch(generated));
     });
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/declare_once_test.dart b/tests/compiler/dart2js/codegen/declare_once_test.dart
index 68e0036..b1d9cbb 100644
--- a/tests/compiler/dart2js/codegen/declare_once_test.dart
+++ b/tests/compiler/dart2js/codegen/declare_once_test.dart
@@ -11,7 +11,7 @@
   // For a function with only one variable we declare it inline for more
   // compactness.  Test that we don't also declare it at the start of the
   // method.
-  runTest({bool useKernel}) async {
+  runTest() async {
     String generated = await compile(
         'final List a = const ["bar", "baz"];'
         'int foo() {'
@@ -19,7 +19,6 @@
         '    print(a[i]);'
         '  }'
         '}',
-        useKernel: useKernel,
         entry: 'foo',
         minify: false);
     RegExp re = new RegExp(r"var ");
@@ -29,9 +28,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/elide_callthrough_stub_test.dart b/tests/compiler/dart2js/codegen/elide_callthrough_stub_test.dart
index f7a3db9..c315c66 100644
--- a/tests/compiler/dart2js/codegen/elide_callthrough_stub_test.dart
+++ b/tests/compiler/dart2js/codegen/elide_callthrough_stub_test.dart
@@ -38,10 +38,8 @@
 ''';
 
 main() {
-  runTests({bool useKernel}) async {
-    CompileMode compileMode =
-        useKernel ? CompileMode.kernel : CompileMode.memory;
-    String generated1 = await compileAll(TEST1, compileMode: compileMode);
+  runTests() async {
+    String generated1 = await compileAll(TEST1);
     // Direct call through field.
     Expect.isTrue(generated1.contains(r'this._fun.call$1(zzz)'));
     // No stub.
@@ -49,7 +47,7 @@
     // No call to stub.
     Expect.isFalse(generated1.contains(r'_fun$1('));
 
-    String generated2 = await compileAll(TEST2, compileMode: compileMode);
+    String generated2 = await compileAll(TEST2);
     // No call through field.
     Expect.isFalse(generated2.contains(r'this._fun.call$1(zzz)'));
     // Call through stub.
@@ -61,9 +59,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/emit_const_fields_test.dart b/tests/compiler/dart2js/codegen/emit_const_fields_test.dart
index 8a7eea4..abc960f 100644
--- a/tests/compiler/dart2js/codegen/emit_const_fields_test.dart
+++ b/tests/compiler/dart2js/codegen/emit_const_fields_test.dart
@@ -19,17 +19,14 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    String generated = await compileAll(TEST_GUIDE,
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+  runTest() async {
+    String generated = await compileAll(TEST_GUIDE);
     Expect.isTrue(generated.contains("42"));
     Expect.isFalse(generated.contains("TITLE"));
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/expect_annotations2_test.dart b/tests/compiler/dart2js/codegen/expect_annotations2_test.dart
index 81d8a0a..3ceca1c 100644
--- a/tests/compiler/dart2js/codegen/expect_annotations2_test.dart
+++ b/tests/compiler/dart2js/codegen/expect_annotations2_test.dart
@@ -5,7 +5,6 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/compiler_new.dart';
-import 'package:compiler/src/commandline_options.dart';
 import '../memory_compiler.dart';
 
 const MEMORY_SOURCE_FILES = const {
@@ -37,12 +36,10 @@
 };
 
 void main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     OutputCollector collector = new OutputCollector();
     await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        outputProvider: collector,
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
     // Simply check that the constants of the small functions are still in the
     // output, and that we don't see the result of constant folding.
     String jsOutput = collector.getOutput('', OutputType.js);
@@ -57,9 +54,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/expect_annotations_test.dart b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
index 89619b6..bff2af5 100644
--- a/tests/compiler/dart2js/codegen/expect_annotations_test.dart
+++ b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:expect/expect.dart';
 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/entities.dart';
 import 'package:compiler/src/js_backend/annotations.dart' as optimizerHints;
@@ -50,17 +49,14 @@
 
 main() {
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
 
-runTest({bool useKernel}) async {
-  CompilationResult result = await runCompiler(
-      memorySourceFiles: MEMORY_SOURCE_FILES,
-      options: useKernel ? [] : [Flags.useOldFrontend]);
+runTest() async {
+  CompilationResult result =
+      await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
   Compiler compiler = result.compiler;
   ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
   Expect.isFalse(compiler.compilationFailed, 'Unsuccessful compilation');
@@ -117,12 +113,12 @@
           method, expectedParameterType, expectedReturnType, inferrer);
     } else if (expectAssumeDynamic) {
       testTypeMatch(
-          method, closedWorld.commonMasks.dynamicType, null, inferrer);
+          method, closedWorld.abstractValueDomain.dynamicType, null, inferrer);
     }
   }
 
-  TypeMask jsStringType = closedWorld.commonMasks.stringType;
-  TypeMask jsIntType = closedWorld.commonMasks.intType;
+  TypeMask jsStringType = closedWorld.abstractValueDomain.stringType;
+  TypeMask jsIntType = closedWorld.abstractValueDomain.intType;
   TypeMask coreStringType =
       new TypeMask.subtype(closedWorld.commonElements.stringClass, closedWorld);
 
diff --git a/tests/compiler/dart2js/codegen/field_codegen_test.dart b/tests/compiler/dart2js/codegen/field_codegen_test.dart
index e77a1c2..46229f7 100644
--- a/tests/compiler/dart2js/codegen/field_codegen_test.dart
+++ b/tests/compiler/dart2js/codegen/field_codegen_test.dart
@@ -20,21 +20,16 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
-    CompileMode compileMode =
-        useKernel ? CompileMode.kernel : CompileMode.memory;
-
-    String generated1 = await compileAll(TEST_NULL0, compileMode: compileMode);
+  runTests() async {
+    String generated1 = await compileAll(TEST_NULL0);
     Expect.isTrue(generated1.contains("null"));
 
-    String generated2 = await compileAll(TEST_NULL1, compileMode: compileMode);
+    String generated2 = await compileAll(TEST_NULL1);
     Expect.isTrue(generated2.contains("null"));
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/field_update_test.dart b/tests/compiler/dart2js/codegen/field_update_test.dart
index 8f809b5..6e24a0b 100644
--- a/tests/compiler/dart2js/codegen/field_update_test.dart
+++ b/tests/compiler/dart2js/codegen/field_update_test.dart
@@ -82,18 +82,14 @@
 
 main() {
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
 
-runTests({bool useKernel}) async {
+runTests() async {
   test(String code, Function f) async {
-    String generated = await compileAll(code,
-        disableInlining: true,
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+    String generated = await compileAll(code, disableInlining: true);
     Expect.isTrue(f(generated));
   }
 
diff --git a/tests/compiler/dart2js/codegen/for_in_test.dart b/tests/compiler/dart2js/codegen/for_in_test.dart
index 2ae009d..0bf5b31 100644
--- a/tests/compiler/dart2js/codegen/for_in_test.dart
+++ b/tests/compiler/dart2js/codegen/for_in_test.dart
@@ -28,19 +28,17 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       Expect.isTrue(!generated.contains(r'break'));
-    }, useKernel: useKernel);
+    });
     await compile(TEST_TWO, entry: 'foo', check: (String generated) {
       Expect.isTrue(generated.contains(r'continue'));
-    }, useKernel: useKernel);
+    });
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/forloop_box_test.dart b/tests/compiler/dart2js/codegen/forloop_box_test.dart
index 915cbf4..3651aae 100644
--- a/tests/compiler/dart2js/codegen/forloop_box_test.dart
+++ b/tests/compiler/dart2js/codegen/forloop_box_test.dart
@@ -40,17 +40,12 @@
 ''';
 
 main() {
-  runTests({bool useKernel}) async {
-    CompileMode compileMode =
-        useKernel ? CompileMode.kernel : CompileMode.memory;
-
-    String generated1 =
-        await compileAll(SHOULD_NOT_BE_BOXED_TEST, compileMode: compileMode);
+  runTests() async {
+    String generated1 = await compileAll(SHOULD_NOT_BE_BOXED_TEST);
     Expect.isTrue(generated1.contains('main_closure(i)'),
         'for-loop variable should not have been boxed');
 
-    String generated2 =
-        await compileAll(SHOULD_BE_BOXED_TEST, compileMode: compileMode);
+    String generated2 = await compileAll(SHOULD_BE_BOXED_TEST);
     Expect.isFalse(generated2.contains('main_closure(i)'),
         'for-loop variable should have been boxed');
 
@@ -62,9 +57,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/generate_at_use_site_test.dart b/tests/compiler/dart2js/codegen/generate_at_use_site_test.dart
index a7e3bf48..afb890f 100644
--- a/tests/compiler/dart2js/codegen/generate_at_use_site_test.dart
+++ b/tests/compiler/dart2js/codegen/generate_at_use_site_test.dart
@@ -50,16 +50,13 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     // Make sure we don't introduce a new variable.
-    await compileAndDoNotMatch(FIB, 'fib', new RegExp("var $anyIdentifier ="),
-        useKernel: useKernel);
+    await compileAndDoNotMatch(FIB, 'fib', new RegExp("var $anyIdentifier ="));
 
-    await compileAndDoNotMatch(BAR, 'bar', new RegExp("isLeaf"),
-        useKernel: useKernel);
+    await compileAndDoNotMatch(BAR, 'bar', new RegExp("isLeaf"));
 
-    await compile(TEST, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+    await compile(TEST, entry: 'foo', check: (String generated) {
       Expect.isFalse(generated.contains('else'));
       // Regression check to ensure that there is no floating variable
       // expression.
@@ -68,9 +65,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart b/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart
index f9381f8..591d3ad 100644
--- a/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart
+++ b/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart
@@ -8,7 +8,6 @@
 import 'package:async_helper/async_helper.dart';
 import '../compiler_helper.dart';
 import 'package:compiler/compiler_new.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/names.dart';
 import 'package:compiler/src/universe/selector.dart' show Selector;
@@ -29,12 +28,11 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     OutputCollector outputCollector = new OutputCollector();
     CompilationResult result = await runCompiler(
         memorySourceFiles: {'main.dart': TEST},
-        outputProvider: outputCollector,
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+        outputProvider: outputCollector);
     Compiler compiler = result.compiler;
     ClosedWorldBase closedWorld =
         compiler.resolutionWorldBuilder.closedWorldForTesting;
@@ -55,9 +53,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/gvn_test.dart b/tests/compiler/dart2js/codegen/gvn_test.dart
index b9962bc..4d3fad9 100644
--- a/tests/compiler/dart2js/codegen/gvn_test.dart
+++ b/tests/compiler/dart2js/codegen/gvn_test.dart
@@ -106,49 +106,40 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
-    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+  runTests() async {
+    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       RegExp regexp = new RegExp(r"1 \+ [a-z]+");
       checkNumberOfMatches(regexp.allMatches(generated).iterator, 1);
     });
-    await compile(TEST_TWO, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+    await compile(TEST_TWO, entry: 'foo', check: (String generated) {
       checkNumberOfMatches(
           new RegExp("length").allMatches(generated).iterator, 1);
     });
-    await compile(TEST_THREE, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+    await compile(TEST_THREE, entry: 'foo', check: (String generated) {
       checkNumberOfMatches(
           new RegExp("number").allMatches(generated).iterator, 1);
     });
-    await compile(TEST_FOUR, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+    await compile(TEST_FOUR, entry: 'foo', check: (String generated) {
       checkNumberOfMatches(new RegExp("shr").allMatches(generated).iterator, 1);
     });
 
-    CompileMode compileMode =
-        useKernel ? CompileMode.kernel : CompileMode.memory;
-
-    await compileAll(TEST_FIVE, compileMode: compileMode).then((generated) {
+    await compileAll(TEST_FIVE).then((generated) {
       checkNumberOfMatches(
           new RegExp("get\\\$foo").allMatches(generated).iterator, 1);
     });
-    await compileAll(TEST_SIX, compileMode: compileMode).then((generated) {
+    await compileAll(TEST_SIX).then((generated) {
       Expect.isTrue(generated.contains('for (t1 = a.field === 54; t1;)'));
     });
-    await compileAll(TEST_SEVEN, compileMode: compileMode).then((generated) {
+    await compileAll(TEST_SEVEN).then((generated) {
       Expect.isTrue(generated.contains('for (t1 = a.field === 54; t1;)'));
     });
-    await compileAll(TEST_EIGHT, compileMode: compileMode).then((generated) {
+    await compileAll(TEST_EIGHT).then((generated) {
       Expect.isTrue(generated.contains('for (; i < t1; ++i)'));
     });
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/identity_test.dart b/tests/compiler/dart2js/codegen/identity_test.dart
index 78f65cd..1f400f1 100644
--- a/tests/compiler/dart2js/codegen/identity_test.dart
+++ b/tests/compiler/dart2js/codegen/identity_test.dart
@@ -16,9 +16,8 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+  runTest() async {
+    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       // Check that no boolify code is generated.
       RegExp regexp = new RegExp("=== true");
       Iterator matches = regexp.allMatches(generated).iterator;
@@ -32,9 +31,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/if_do_while_test.dart b/tests/compiler/dart2js/codegen/if_do_while_test.dart
index ff6b8d0..fb6378a 100644
--- a/tests/compiler/dart2js/codegen/if_do_while_test.dart
+++ b/tests/compiler/dart2js/codegen/if_do_while_test.dart
@@ -19,9 +19,8 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    await compile(TEST, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+  runTest() async {
+    await compile(TEST, entry: 'foo', check: (String generated) {
       // Check that the do-while in the 'then' is enclosed in braces.
       // Otherwise Android 4.0 stock browser has a syntax error. See issue 10923.
       Expect.isTrue(
@@ -30,9 +29,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/inferrer_factory_test.dart b/tests/compiler/dart2js/codegen/inferrer_factory_test.dart
index 59f39ab..30bb917 100644
--- a/tests/compiler/dart2js/codegen/inferrer_factory_test.dart
+++ b/tests/compiler/dart2js/codegen/inferrer_factory_test.dart
@@ -23,18 +23,15 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    String generated = await compileAll(TEST1,
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+  runTest() async {
+    String generated = await compileAll(TEST1);
     // Check that we're using the index operator on the object returned
     // by the A factory.
     Expect.isTrue(generated.contains('[0] = 42'));
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/interceptor_almost_constant_test.dart b/tests/compiler/dart2js/codegen/interceptor_almost_constant_test.dart
index b9b1783..acc5fff 100644
--- a/tests/compiler/dart2js/codegen/interceptor_almost_constant_test.dart
+++ b/tests/compiler/dart2js/codegen/interceptor_almost_constant_test.dart
@@ -14,19 +14,16 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     // Check that almost-constant interceptor is used.
-    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       String re = r'a && [\w\.]*_methods';
       Expect.isTrue(generated.contains(new RegExp(re)), 'contains /$re/');
     });
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/interceptor_test.dart b/tests/compiler/dart2js/codegen/interceptor_test.dart
index 3955b33..3776d52 100644
--- a/tests/compiler/dart2js/codegen/interceptor_test.dart
+++ b/tests/compiler/dart2js/codegen/interceptor_test.dart
@@ -25,11 +25,10 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     // Check that one-shot interceptors preserve variable names, see
     // https://code.google.com/p/dart/issues/detail?id=8106.
-    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       Expect.isTrue(
           generated.contains(new RegExp(r'[$A-Z]+\.toString\$0\$\(a\)')));
       Expect.isTrue(generated.contains('myVariableName'));
@@ -37,8 +36,7 @@
     // Check that an intercepted getter that does not need to be
     // intercepted, is turned into a regular getter call or field
     // access.
-    await compile(TEST_TWO, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+    await compile(TEST_TWO, entry: 'foo', check: (String generated) {
       Expect.isFalse(generated.contains(r'a.get$length()'));
       Expect
           .isTrue(generated.contains(new RegExp(r'[$A-Z]+\.A\$\(\)\.length')));
@@ -48,9 +46,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/interpolation_folding_test.dart b/tests/compiler/dart2js/codegen/interpolation_folding_test.dart
index 68f13e6..ef88234 100644
--- a/tests/compiler/dart2js/codegen/interpolation_folding_test.dart
+++ b/tests/compiler/dart2js/codegen/interpolation_folding_test.dart
@@ -38,10 +38,9 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     check(String test, String contained) async {
-      String generated =
-          await compile(test, entry: 'foo', useKernel: useKernel);
+      String generated = await compile(test, entry: 'foo');
       Expect.isTrue(generated.contains(contained), contained);
     }
 
@@ -61,9 +60,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/inverse_operator_test.dart b/tests/compiler/dart2js/codegen/inverse_operator_test.dart
index eb1cee1..5881a49 100644
--- a/tests/compiler/dart2js/codegen/inverse_operator_test.dart
+++ b/tests/compiler/dart2js/codegen/inverse_operator_test.dart
@@ -17,15 +17,13 @@
 }""";
 
 main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     // Make sure we don't introduce a new variable.
-    await compileAndMatchFuzzy(MAIN, 'main', "1 >= x", useKernel: useKernel);
+    await compileAndMatchFuzzy(MAIN, 'main', "1 >= x");
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/is_function_test.dart b/tests/compiler/dart2js/codegen/is_function_test.dart
index 9f1676d..e535c69 100644
--- a/tests/compiler/dart2js/codegen/is_function_test.dart
+++ b/tests/compiler/dart2js/codegen/is_function_test.dart
@@ -18,11 +18,8 @@
 ''';
 
 main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     List<String> options = [Flags.enableCheckedMode];
-    if (!useKernel) {
-      options.add(Flags.useOldFrontend);
-    }
     CompilationResult result = await runCompiler(
         memorySourceFiles: {'main.dart': SOURCE}, options: options);
     Expect.isTrue(result.isSuccess);
@@ -44,9 +41,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/is_inference2_test.dart b/tests/compiler/dart2js/codegen/is_inference2_test.dart
index e2bff2a..cfd6ba9 100644
--- a/tests/compiler/dart2js/codegen/is_inference2_test.dart
+++ b/tests/compiler/dart2js/codegen/is_inference2_test.dart
@@ -14,9 +14,9 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    await compile(TEST_IF_BOOL_FIRST_INSTRUCTION,
-        entry: 'negate', useKernel: useKernel, check: (String generated) {
+  runTest() async {
+    await compile(TEST_IF_BOOL_FIRST_INSTRUCTION, entry: 'negate',
+        check: (String generated) {
       Expect.isTrue(generated.contains("!")); // We want to see !x.
       Expect.isFalse(generated.contains("!=")); // And not !== true.
       Expect.isFalse(generated.contains("true"));
@@ -25,9 +25,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/is_inference_test.dart b/tests/compiler/dart2js/codegen/is_inference_test.dart
index 9915918..8758dd8 100644
--- a/tests/compiler/dart2js/codegen/is_inference_test.dart
+++ b/tests/compiler/dart2js/codegen/is_inference_test.dart
@@ -71,9 +71,8 @@
 }
 """;
 
-Future compileAndTest(String code, {bool useKernel}) {
-  return compile(code, entry: 'test', useKernel: useKernel,
-      check: (String generated) {
+Future compileAndTest(String code) {
+  return compile(code, entry: 'test', check: (String generated) {
     RegExp validAdd =
         new RegExp("($anyIdentifier \\+ 42)|($anyIdentifier \\+= 42)");
     RegExp invalidAdd = new RegExp("$anyIdentifier \\+ 53");
@@ -83,19 +82,17 @@
 }
 
 main() {
-  runTests({bool useKernel}) async {
-    await compileAndTest(TEST_IF, useKernel: useKernel);
-    await compileAndTest(TEST_IF_ELSE, useKernel: useKernel);
-    await compileAndTest(TEST_IF_RETURN, useKernel: useKernel);
-    await compileAndTest(TEST_IF_NOT_ELSE, useKernel: useKernel);
-    await compileAndTest(TEST_IF_NOT_RETURN, useKernel: useKernel);
-    await compileAndTest(TEST_IF_NOT_ELSE_RETURN, useKernel: useKernel);
+  runTests() async {
+    await compileAndTest(TEST_IF);
+    await compileAndTest(TEST_IF_ELSE);
+    await compileAndTest(TEST_IF_RETURN);
+    await compileAndTest(TEST_IF_NOT_ELSE);
+    await compileAndTest(TEST_IF_NOT_RETURN);
+    await compileAndTest(TEST_IF_NOT_ELSE_RETURN);
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart b/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
index 5d224e8..c6d31ac 100644
--- a/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
+++ b/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
@@ -32,10 +32,6 @@
 
 main() {
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest([Flags.useOldFrontend]);
-    print('--test from ast (trust-type-annotations)--------------------------');
-    await runTest([Flags.useOldFrontend, Flags.trustTypeAnnotations]);
     print('--test from kernel------------------------------------------------');
     await runTest([]);
     print('--test from kernel (trust-type-annotations)-----------------------');
diff --git a/tests/compiler/dart2js/codegen/licm_test.dart b/tests/compiler/dart2js/codegen/licm_test.dart
index f6fee65..a5c397b 100644
--- a/tests/compiler/dart2js/codegen/licm_test.dart
+++ b/tests/compiler/dart2js/codegen/licm_test.dart
@@ -24,16 +24,13 @@
 ''';
 
 main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     await compileAndMatch(TEST, 'main',
-        new RegExp('if \\(typeof count !== "number"\\)(.|\\n)*while'),
-        useKernel: useKernel);
+        new RegExp('if \\(typeof count !== "number"\\)(.|\\n)*while'));
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/list_tracer_length_test.dart b/tests/compiler/dart2js/codegen/list_tracer_length_test.dart
index d5e8d72..ac42284 100644
--- a/tests/compiler/dart2js/codegen/list_tracer_length_test.dart
+++ b/tests/compiler/dart2js/codegen/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): Move this to the codegen folder. Currently this 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";
@@ -90,23 +89,28 @@
 }
 """;
 
-void checkRangeError(String test, {bool hasRangeError}) {
-  asyncTest(() => compileAll(test).then((generated) {
-        Expect.equals(hasRangeError, generated.contains('ioore'));
-      }));
+checkRangeError(String test, {bool hasRangeError}) async {
+  String generated = await compileAll(test);
+  Expect.equals(
+      hasRangeError,
+      generated.contains('ioore'),
+      "Unexpected use of 'hasRangeError' for test:\n$test\n"
+      "in code\n$generated");
 }
 
 main() {
-  checkRangeError(TEST1, hasRangeError: false);
-  checkRangeError(TEST2('insert', 'null, null'), hasRangeError: true);
-  checkRangeError(TEST2('add', 'null'), hasRangeError: true);
-  checkRangeError(TEST2('clear', ''), hasRangeError: true);
-  checkRangeError(TEST2('toString', ''), hasRangeError: false);
-  checkRangeError(TEST3, hasRangeError: false);
-  checkRangeError(TEST4, hasRangeError: true);
-  checkRangeError(TEST5, hasRangeError: true);
-  checkRangeError(TEST6, hasRangeError: true);
-  checkRangeError(TEST7, hasRangeError: false);
-  checkRangeError(TEST8, hasRangeError: true);
-  checkRangeError(TEST9, hasRangeError: false);
+  asyncTest(() async {
+    await checkRangeError(TEST1, hasRangeError: false);
+    await checkRangeError(TEST2('insert', 'null, null'), hasRangeError: true);
+    await checkRangeError(TEST2('add', 'null'), hasRangeError: true);
+    await checkRangeError(TEST2('clear', ''), hasRangeError: true);
+    await checkRangeError(TEST2('toString', ''), hasRangeError: false);
+    await checkRangeError(TEST3, hasRangeError: false);
+    await checkRangeError(TEST4, hasRangeError: true);
+    await checkRangeError(TEST5, hasRangeError: true);
+    await checkRangeError(TEST6, hasRangeError: true);
+    await checkRangeError(TEST7, hasRangeError: false);
+    await checkRangeError(TEST8, hasRangeError: true);
+    await checkRangeError(TEST9, hasRangeError: false);
+  });
 }
diff --git a/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart b/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart
index 03ae59c..339512a 100644
--- a/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart
+++ b/tests/compiler/dart2js/codegen/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): Move this to the codegen folder. Currently this 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";
@@ -70,47 +69,56 @@
 }
 
 main() {
-  asyncTest(() => compileAll(TEST1).then((generated) {
-        Expect.isTrue(generated.contains('if (typeof t1'));
-      }));
+  runTests() async {
+    String generated1 = await compileAll(TEST1);
+    Expect.isTrue(generated1.contains('if (typeof t1'));
 
-  asyncTest(() => compileAll(TEST2).then((generated) {
-        Expect.isTrue(generated.contains('if (typeof t1'));
-      }));
+    String generated2 = await compileAll(TEST2);
+    Expect.isTrue(generated2.contains('if (typeof t1'));
 
-  asyncTest(() => compileAll(TEST3).then((generated) {
-        Expect.isTrue(generated.contains('if (typeof t1'));
-      }));
+    String generated3 = await compileAll(TEST3);
+    Expect.isTrue(generated3.contains('if (typeof t1'));
 
-  asyncTest(() => compileAll(TEST4).then((generated) {
-        Expect.isTrue(generated.contains('if (typeof t1'));
-      }));
+    String generated4 = await compileAll(TEST4);
+    Expect.isTrue(generated4.contains('if (typeof t1'));
 
-  asyncTest(() => compileAll(TEST5).then((generated) {
-        Expect.isFalse(generated.contains('iae'));
-      }));
+    String generated5 = await compileAll(TEST5);
+    Expect.isFalse(generated5.contains('iae'));
 
-  asyncTest(() => compileAll(TEST6).then((generated) {
-        Expect.isFalse(generated.contains('iae'));
-      }));
+    String generated6 = await compileAll(TEST6);
+    Expect.isFalse(generated6.contains('iae'));
 
-  var memberInvocations = const <String>[
-    'first',
-    'last',
-    'single',
-    'singleWhere((x) => true)',
-    'elementAt(0)',
-    'removeAt(0)',
-    'removeLast()',
-  ];
-  memberInvocations
-      .map((member) => generateTest('$member'))
-      .forEach((String test) {
-    asyncTest(() => compileAll(test, expectedErrors: 0, expectedWarnings: 0)
-            .then((generated) {
-          Expect.isTrue(generated.contains('+ 42'));
-          Expect.isFalse(generated.contains('if (typeof t1'));
-          Expect.isFalse(generated.contains('if (t1 == null)'));
-        }));
+    var memberInvocations = const <String>[
+      'first',
+      'last',
+      'single',
+      'singleWhere((x) => true)',
+      'elementAt(0)',
+      'removeAt(0)',
+      'removeLast()',
+    ];
+    for (String member in memberInvocations) {
+      String generated = await compileAll(generateTest('$member'),
+          expectedErrors: 0, expectedWarnings: 0);
+      Expect.isTrue(
+          generated.contains('+ 42'),
+          "Missing '+ 42' code for invocation '$member':\n"
+          "$generated");
+      // TODO(johnniwinther): Update this test to query the generated code for
+      // main only.
+      /*Expect.isFalse(
+          generated.contains('if (typeof t1'),
+          "Unexpected 'if (typeof t1' code for invocation '$member':\n"
+          "$generated");
+      Expect.isFalse(
+          generated.contains('if (t1 == null)'),
+          "Unexpected 'if (t1 == null)' code for invocation '$member':\n"
+          "$generated");*/
+    }
+  }
+
+  asyncTest(() async {
+    print('--test from kernel------------------------------------------------');
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/literal_list_test.dart b/tests/compiler/dart2js/codegen/literal_list_test.dart
index fa05bec..a989045 100644
--- a/tests/compiler/dart2js/codegen/literal_list_test.dart
+++ b/tests/compiler/dart2js/codegen/literal_list_test.dart
@@ -16,9 +16,8 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+  runTest() async {
+    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       Expect.isTrue(generated.contains('print([1, 2]);'));
       Expect.isTrue(generated.contains('print([3]);'));
       Expect.isTrue(generated.contains('print([4, 5]);'));
@@ -26,9 +25,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/literal_map_test.dart b/tests/compiler/dart2js/codegen/literal_map_test.dart
index 363a8e2..c1bfcf3 100644
--- a/tests/compiler/dart2js/codegen/literal_map_test.dart
+++ b/tests/compiler/dart2js/codegen/literal_map_test.dart
@@ -15,9 +15,8 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    await compile(TEST, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+  runTest() async {
+    await compile(TEST, entry: 'foo', check: (String generated) {
       // Make sure we have all the type information we need.
       Expect.isFalse(generated.contains('bailout'));
       Expect.isFalse(generated.contains('interceptor'));
@@ -28,9 +27,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/load_elimination_test.dart b/tests/compiler/dart2js/codegen/load_elimination_test.dart
index 2a8935e..c6d6e27 100644
--- a/tests/compiler/dart2js/codegen/load_elimination_test.dart
+++ b/tests/compiler/dart2js/codegen/load_elimination_test.dart
@@ -234,11 +234,9 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     test(String code, String expected) async {
-      String generated = await compileAll(code,
-          disableInlining: false,
-          compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+      String generated = await compileAll(code, disableInlining: false);
       Expect.isTrue(
           generated.contains(expected),
           "Generated code didn't contain '$expected'.\n"
@@ -266,9 +264,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/logical_expression_test.dart b/tests/compiler/dart2js/codegen/logical_expression_test.dart
index 8ed8e00..2efbaca 100644
--- a/tests/compiler/dart2js/codegen/logical_expression_test.dart
+++ b/tests/compiler/dart2js/codegen/logical_expression_test.dart
@@ -24,38 +24,29 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     // We want something like:
     //     var t1 = bar.call$0() === true;
     //     if (t1 || gee.call$0() === true) gee.call$0();
     //     if (t1 || gee.call$0() === true) gee.call$0();
     await compileAndDoNotMatchFuzzy(
-        TEST_ONE,
-        'foo',
-        r"""var x = [a-zA-Z0-9$.]+\(\) == true;
+        TEST_ONE, 'foo', r"""var x = [a-zA-Z0-9$.]+\(\) == true;
             if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;
-            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;""",
-        useKernel: useKernel);
+            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;""");
 
     // We want something like:
     //     var t1 = list == null;
     //     if (t1) bar.call$0();
     //     if (t1 || bar.call$0() === true) bar.call$0();
     //     if (t1 || bar.call$0() === true) bar.call$0();
-    await compileAndMatchFuzzy(
-        TEST_TWO,
-        'foo',
-        r"""var x = x == null;
+    await compileAndMatchFuzzy(TEST_TWO, 'foo', r"""var x = x == null;
             if \(x\) [^;]+;
             if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;
-            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;""",
-        useKernel: useKernel);
+            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;""");
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/loop_test.dart b/tests/compiler/dart2js/codegen/loop_test.dart
index 3594325..2615469 100644
--- a/tests/compiler/dart2js/codegen/loop_test.dart
+++ b/tests/compiler/dart2js/codegen/loop_test.dart
@@ -53,29 +53,23 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
-    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+  runTests() async {
+    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       Expect.isTrue(generated.contains(r'for ('));
     });
-    await compile(TEST_TWO, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+    await compile(TEST_TWO, entry: 'foo', check: (String generated) {
       Expect.isTrue(!generated.contains(r'break'));
     });
-    await compile(TEST_THREE, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+    await compile(TEST_THREE, entry: 'foo', check: (String generated) {
       Expect.isTrue(generated.contains(r'continue'));
     });
-    await compile(TEST_FOUR, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+    await compile(TEST_FOUR, entry: 'foo', check: (String generated) {
       Expect.isTrue(generated.contains(r'continue'));
     });
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/minify_many_locals_test.dart b/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
index ed902ed..b69a0fd 100644
--- a/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
+++ b/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
@@ -8,7 +8,7 @@
 import '../compiler_helper.dart';
 
 main() {
-  runTests({bool useKernel, int numberOfParameters}) async {
+  runTests({int numberOfParameters}) async {
     StringBuffer buffer = new StringBuffer();
     buffer.write("foo(");
     for (int i = 0; i < numberOfParameters; i++) {
@@ -21,8 +21,7 @@
     buffer.write("$numberOfParameters; return i; }");
     String code = buffer.toString();
 
-    String generated =
-        await compile(code, entry: 'foo', minify: true, useKernel: useKernel);
+    String generated = await compile(code, entry: 'foo', minify: true);
     RegExp re = new RegExp(r"\(a,b,c");
     Expect.isTrue(re.hasMatch(generated));
 
@@ -46,10 +45,8 @@
   }
 
   asyncTest(() async {
-    // The [numberOfParameters] values are somewhat arbitrary.
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false, numberOfParameters: 1800);
+    // The [numberOfParameters] value is somewhat arbitrary.
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true, numberOfParameters: 2000);
+    await runTests(numberOfParameters: 2000);
   });
 }
diff --git a/tests/compiler/dart2js/codegen/modulo_remainder_test.dart b/tests/compiler/dart2js/codegen/modulo_remainder_test.dart
index 29d8b1b..7997dbf 100644
--- a/tests/compiler/dart2js/codegen/modulo_remainder_test.dart
+++ b/tests/compiler/dart2js/codegen/modulo_remainder_test.dart
@@ -65,12 +65,9 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     check(String test) async {
-      await compile(test,
-          entry: 'foo',
-          useKernel: useKernel,
-          check: checkerForAbsentPresent(test));
+      await compile(test, entry: 'foo', check: checkerForAbsentPresent(test));
     }
 
     await check(MOD1);
@@ -82,9 +79,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/negation_shift_regression_test.dart b/tests/compiler/dart2js/codegen/negation_shift_regression_test.dart
index ec028c8..aeb6731 100644
--- a/tests/compiler/dart2js/codegen/negation_shift_regression_test.dart
+++ b/tests/compiler/dart2js/codegen/negation_shift_regression_test.dart
@@ -26,12 +26,9 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     check(String test) async {
-      await compile(test,
-          entry: 'foo',
-          useKernel: useKernel,
-          check: checkerForAbsentPresent(test));
+      await compile(test, entry: 'foo', check: checkerForAbsentPresent(test));
     }
 
     await check(TEST1);
@@ -39,9 +36,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/no_constructor_body_test.dart b/tests/compiler/dart2js/codegen/no_constructor_body_test.dart
index 3d3e8ec..2279739 100644
--- a/tests/compiler/dart2js/codegen/no_constructor_body_test.dart
+++ b/tests/compiler/dart2js/codegen/no_constructor_body_test.dart
@@ -18,18 +18,15 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    String generated = await compileAll(TEST,
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+  runTest() async {
+    String generated = await compileAll(TEST);
 
     Expect.isTrue(generated
         .contains(new RegExp('A: {[ \n]*"\\^": "Object;",[ \n]*static:')));
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/no_duplicate_constructor_body2_test.dart b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body2_test.dart
index b90eba5..e7cd4cd 100644
--- a/tests/compiler/dart2js/codegen/no_duplicate_constructor_body2_test.dart
+++ b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body2_test.dart
@@ -22,18 +22,15 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    String generated = await compileAll(CODE,
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+  runTest() async {
+    String generated = await compileAll(CODE);
     RegExp regexp = new RegExp(r'A\$0: function');
     Iterator<Match> matches = regexp.allMatches(generated).iterator;
     checkNumberOfMatches(matches, 1);
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart
index 6bba7dd..f5625d5 100644
--- a/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart
+++ b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart
@@ -16,18 +16,15 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    String generated = await compileAll(CODE,
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+  runTest() async {
+    String generated = await compileAll(CODE);
     RegExp regexp = new RegExp(r'\A: {[ \n]*"\^": "[A-Za-z]+;"');
     Iterator<Match> matches = regexp.allMatches(generated).iterator;
     checkNumberOfMatches(matches, 1);
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/no_duplicate_stub_test.dart b/tests/compiler/dart2js/codegen/no_duplicate_stub_test.dart
index 2c9e0bb6..cd7a05a 100644
--- a/tests/compiler/dart2js/codegen/no_duplicate_stub_test.dart
+++ b/tests/compiler/dart2js/codegen/no_duplicate_stub_test.dart
@@ -29,18 +29,15 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    String generated = await compileAll(TEST,
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+  runTest() async {
+    String generated = await compileAll(TEST);
     RegExp regexp = new RegExp('foo\\\$1\\\$a: function');
     Iterator<Match> matches = regexp.allMatches(generated).iterator;
     checkNumberOfMatches(matches, 1);
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/null_check_test.dart b/tests/compiler/dart2js/codegen/null_check_test.dart
index 34bf897..90b7847 100644
--- a/tests/compiler/dart2js/codegen/null_check_test.dart
+++ b/tests/compiler/dart2js/codegen/null_check_test.dart
@@ -17,16 +17,13 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    String generated = await compileAll(TEST1,
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+  runTest() async {
+    String generated = await compileAll(TEST1);
     Expect.isFalse(generated.contains('foo.length'));
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/null_type_test.dart b/tests/compiler/dart2js/codegen/null_type_test.dart
index 353e424..ecbf6df 100644
--- a/tests/compiler/dart2js/codegen/null_type_test.dart
+++ b/tests/compiler/dart2js/codegen/null_type_test.dart
@@ -14,17 +14,14 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+  runTest() async {
+    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       Expect.isFalse(generated.contains('typeof (void 0)'));
     });
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/number_output_test.dart b/tests/compiler/dart2js/codegen/number_output_test.dart
index 07e7126..a51bd7c 100644
--- a/tests/compiler/dart2js/codegen/number_output_test.dart
+++ b/tests/compiler/dart2js/codegen/number_output_test.dart
@@ -20,12 +20,9 @@
         }'''
 };
 
-Future test({bool useKernel, bool minify}) async {
+Future test({bool minify}) async {
   OutputCollector collector = new OutputCollector();
   List<String> options = <String>[];
-  if (!useKernel) {
-    options.add(Flags.useOldFrontend);
-  }
   if (minify) {
     options.add(Flags.minify);
   }
@@ -56,15 +53,13 @@
 }
 
 main() {
-  runTest({bool useKernel}) async {
-    await test(useKernel: useKernel, minify: true);
-    await test(useKernel: useKernel, minify: false);
+  runTest() async {
+    await test(minify: true);
+    await test(minify: false);
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/parameter_phi_elimination_test.dart b/tests/compiler/dart2js/codegen/parameter_phi_elimination_test.dart
index 29f6992..2b843d6 100644
--- a/tests/compiler/dart2js/codegen/parameter_phi_elimination_test.dart
+++ b/tests/compiler/dart2js/codegen/parameter_phi_elimination_test.dart
@@ -19,14 +19,12 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    await compile(SOURCE, entry: "baz", useKernel: useKernel);
+  runTest() async {
+    await compile(SOURCE, entry: "baz");
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/pretty_parameter_test.dart b/tests/compiler/dart2js/codegen/pretty_parameter_test.dart
index d2ca04e..bd68a4c 100644
--- a/tests/compiler/dart2js/codegen/pretty_parameter_test.dart
+++ b/tests/compiler/dart2js/codegen/pretty_parameter_test.dart
@@ -72,42 +72,35 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
-    await compile(FOO, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+  runTests() async {
+    await compile(FOO, entry: 'foo', check: (String generated) {
       Expect.isTrue(generated.contains(r"function(a, b) {"));
     });
-    await compile(BAR, entry: 'bar', useKernel: useKernel,
-        check: (String generated) {
+    await compile(BAR, entry: 'bar', check: (String generated) {
       Expect.isTrue(generated.contains(r"function($eval, $$eval) {"));
     });
-    await compile(PARAMETER_AND_TEMP, entry: 'bar', useKernel: useKernel,
-        check: (String generated) {
+    await compile(PARAMETER_AND_TEMP, entry: 'bar', check: (String generated) {
       Expect.isTrue(generated.contains(r"print(t00)"));
       // Check that the second 't0' got another name.
       Expect.isTrue(generated.contains(r"print(t01)"));
     });
-    await compile(MULTIPLE_PHIS_ONE_LOCAL, entry: 'foo', useKernel: useKernel,
+    await compile(MULTIPLE_PHIS_ONE_LOCAL, entry: 'foo',
         check: (String generated) {
       Expect.isTrue(generated.contains("var a;"));
       // Check that there is only one var declaration.
       checkNumberOfMatches(new RegExp("var").allMatches(generated).iterator, 1);
     });
-    await compile(NO_LOCAL, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+    await compile(NO_LOCAL, entry: 'foo', check: (String generated) {
       Expect.isFalse(generated.contains('var'));
     });
-    await compile(PARAMETER_INIT, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+    await compile(PARAMETER_INIT, entry: 'foo', check: (String generated) {
       // Check that there is only one var declaration.
       checkNumberOfMatches(new RegExp("var").allMatches(generated).iterator, 1);
     });
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/redundant_phi_eliminator_test.dart b/tests/compiler/dart2js/codegen/redundant_phi_eliminator_test.dart
index e18c6e3..a6f6c37 100644
--- a/tests/compiler/dart2js/codegen/redundant_phi_eliminator_test.dart
+++ b/tests/compiler/dart2js/codegen/redundant_phi_eliminator_test.dart
@@ -28,14 +28,12 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
-    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+  runTests() async {
+    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       RegExp regexp = new RegExp("toBeRemoved");
       Expect.isTrue(!regexp.hasMatch(generated));
     });
-    await compile(TEST_TWO, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+    await compile(TEST_TWO, entry: 'foo', check: (String generated) {
       RegExp regexp = new RegExp("toBeRemoved");
       Expect.isTrue(!regexp.hasMatch(generated));
       regexp = new RegExp("temp");
@@ -44,9 +42,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/regress_10231_test.dart b/tests/compiler/dart2js/codegen/regress_10231_test.dart
index 2c2c242..bc97ecb 100644
--- a/tests/compiler/dart2js/codegen/regress_10231_test.dart
+++ b/tests/compiler/dart2js/codegen/regress_10231_test.dart
@@ -25,18 +25,15 @@
 """;
 
 void main() {
-  runTests({bool useKernel}) async {
-    String code =
-        await compile(SOURCE, useKernel: useKernel, methodName: 'test');
+  runTests() async {
+    String code = await compile(SOURCE, methodName: 'test');
     Expect.isNotNull(code);
     Expect.equals(0, new RegExp('add').allMatches(code).length);
     Expect.equals(3, new RegExp('\\+').allMatches(code).length);
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart b/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart
index 4d87085..670316a 100644
--- a/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart
+++ b/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart
@@ -23,17 +23,14 @@
 ''';
 
 void main() {
-  runTest({bool useKernel}) async {
-    String generated = await compileAll(TEST,
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.mock);
-    Expect.isTrue(generated.contains('return c + c;'));
+  runTest() async {
+    String generated = await compileAll(TEST);
+    Expect.isTrue(generated.contains('return c + c;'),
+        "Expected generated code to contain 'return c + c;':\n$generated");
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    // TODO(johnniwinther): This test only works with the mock compiler.
-    //print('--test from kernel----------------------------------------------');
-    //await runTest(useKernel: true);
+    print('--test from kernel----------------------------------------------');
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/simple_function_subtype_test.dart b/tests/compiler/dart2js/codegen/simple_function_subtype_test.dart
index 7821d4a..6f64cdf 100644
--- a/tests/compiler/dart2js/codegen/simple_function_subtype_test.dart
+++ b/tests/compiler/dart2js/codegen/simple_function_subtype_test.dart
@@ -51,9 +51,8 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    await compile(TEST, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+  runTest() async {
+    await compile(TEST, entry: 'foo', check: (String generated) {
       for (int i = 0; i <= 15; i++) {
         String predicateCheck = '.\$is_args$i';
         Expect.isTrue(generated.contains(predicateCheck),
@@ -65,9 +64,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/simple_inferrer_relations_test.dart b/tests/compiler/dart2js/codegen/simple_inferrer_relations_test.dart
index b89d27a..6eef9bb 100644
--- a/tests/compiler/dart2js/codegen/simple_inferrer_relations_test.dart
+++ b/tests/compiler/dart2js/codegen/simple_inferrer_relations_test.dart
@@ -50,9 +50,8 @@
 """;
 
 void main() {
-  runTest({bool useKernel}) async {
-    String generated = await compileAll(TEST,
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+  runTest() async {
+    String generated = await compileAll(TEST);
     if (generated.contains(r'=== true')) {
       print(generated);
       Expect.fail("missing elision of '=== true'");
@@ -60,9 +59,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart b/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart
index 8aa46ad..b5fd0c1 100644
--- a/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart
+++ b/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart
@@ -69,39 +69,29 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
-    await compileAndMatchFuzzy(TEST_ONE, 'foo', "var x = x === true \\? 2 : 3;",
-        useKernel: useKernel);
-    await compileAndMatchFuzzy(TEST_ONE, 'foo', "print\\(x\\);",
-        useKernel: useKernel);
+  runTests() async {
+    await compileAndMatchFuzzy(
+        TEST_ONE, 'foo', "var x = x === true \\? 2 : 3;");
+    await compileAndMatchFuzzy(TEST_ONE, 'foo', "print\\(x\\);");
 
-    await compileAndMatchFuzzy(TEST_TWO, 'main', "x \\+= 10",
-        useKernel: useKernel);
-    await compileAndMatchFuzzy(TEST_TWO, 'main', "\\+\\+x",
-        useKernel: useKernel);
+    await compileAndMatchFuzzy(TEST_TWO, 'main', "x \\+= 10");
+    await compileAndMatchFuzzy(TEST_TWO, 'main', "\\+\\+x");
 
     // Check that we don't have 'd = d' (using regexp back references).
-    await compileAndDoNotMatchFuzzy(TEST_THREE, 'foo', '(x) = \1',
-        useKernel: useKernel);
-    await compileAndMatchFuzzy(TEST_THREE, 'foo', 'return x',
-        useKernel: useKernel);
+    await compileAndDoNotMatchFuzzy(TEST_THREE, 'foo', '(x) = \1');
+    await compileAndMatchFuzzy(TEST_THREE, 'foo', 'return x');
 
     // Check that a store just after the declaration of the local
     // only generates one instruction.
-    await compileAndMatchFuzzy(TEST_THREE, 'foo', 'x = 42',
-        useKernel: useKernel);
+    await compileAndMatchFuzzy(TEST_THREE, 'foo', 'x = 42');
 
-    await compileAndDoNotMatchFuzzy(TEST_FOUR, 'foo', '(x) = \1;',
-        useKernel: useKernel);
+    await compileAndDoNotMatchFuzzy(TEST_FOUR, 'foo', '(x) = \1;');
 
-    await compileAndDoNotMatch(TEST_FIVE, 'main', new RegExp('hash0'),
-        useKernel: useKernel);
+    await compileAndDoNotMatch(TEST_FIVE, 'main', new RegExp('hash0'));
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/static_closure_test.dart b/tests/compiler/dart2js/codegen/static_closure_test.dart
index 67fe7d1..7865768 100644
--- a/tests/compiler/dart2js/codegen/static_closure_test.dart
+++ b/tests/compiler/dart2js/codegen/static_closure_test.dart
@@ -9,9 +9,8 @@
 import '../compiler_helper.dart';
 
 main() {
-  runTest({bool useKernel}) async {
-    String code = await compileAll(r'''main() { print(main); }''',
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.mock);
+  runTest() async {
+    String code = await compileAll(r'''main() { print(main); }''');
     // At some point, we will have to closurize global functions
     // differently, at which point this test will break. Then it is time
     // to implement a way to call a Dart closure from JS foreign
@@ -21,15 +20,12 @@
     // toStringWrapper in captureStackTrace in js_helper.dart.
     Expect.isTrue(
         code.contains(
-            new RegExp(r'print\([$A-Z]+\.lib___main\$closure\(\)\);')),
+            new RegExp(r'print\([$A-Z]+\.main__main\$closure\(\)\);')),
         code);
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
-    // TODO(johnniwinther): This test only works with the mock compiler.
-    //print('--test from kernel----------------------------------------------');
-    //await runTest(useKernel: true);
+    print('--test from kernel----------------------------------------------');
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/strength_eq_test.dart b/tests/compiler/dart2js/codegen/strength_eq_test.dart
index c8d9f29..327c9cc 100644
--- a/tests/compiler/dart2js/codegen/strength_eq_test.dart
+++ b/tests/compiler/dart2js/codegen/strength_eq_test.dart
@@ -24,17 +24,15 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     // The `==` is strengthened to a HIdentity instruction.  The HIdentity follows
     // `x.link`, so x cannot be `null`.
     var compare = new RegExp(r'x === x\.get\$link\(\)');
-    await compileAndMatch(CODE, 'main', compare, useKernel: useKernel);
+    await compileAndMatch(CODE, 'main', compare);
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/string_add_test.dart b/tests/compiler/dart2js/codegen/string_add_test.dart
index 1be733a..da069f1 100644
--- a/tests/compiler/dart2js/codegen/string_add_test.dart
+++ b/tests/compiler/dart2js/codegen/string_add_test.dart
@@ -7,16 +7,13 @@
 import '../compiler_helper.dart';
 
 main() {
-  runTest({bool useKernel}) async {
-    String code = await compileAll(r'''main() { return "foo" + "bar"; }''',
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+  runTest() async {
+    String code = await compileAll(r'''main() { return "foo" + "bar"; }''');
     Expect.isTrue(!code.contains(r'$add'));
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/string_escapes_test.dart b/tests/compiler/dart2js/codegen/string_escapes_test.dart
index 14b69d8..c765230 100644
--- a/tests/compiler/dart2js/codegen/string_escapes_test.dart
+++ b/tests/compiler/dart2js/codegen/string_escapes_test.dart
@@ -10,75 +10,94 @@
 // Test that the compiler handles string literals containing line terminators.
 
 main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     Future<String> compileExpression(String expression) {
       var source = "foo() { return $expression; }";
-      return compile(source, entry: "foo", useKernel: useKernel);
+      return compile(source, entry: "foo");
     }
 
     await compileExpression("''' \n\r\u2028\u2029'''").then((String generated) {
-      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
-          generated.contains(r"'\r\u2028\u2029'"));
+      Expect.isTrue(
+          generated.contains(r'"\r\u2028\u2029"') ||
+              generated.contains(r"'\r\u2028\u2029'"),
+          generated);
     });
     await compileExpression("r''' \n\r\u2028\u2029'''")
         .then((String generated) {
-      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
-          generated.contains(r"'\r\u2028\u2029'"));
+      Expect.isTrue(
+          generated.contains(r'"\r\u2028\u2029"') ||
+              generated.contains(r"'\r\u2028\u2029'"),
+          generated);
     });
     await compileExpression("r''' \r\n\u2028\u2029'''")
         .then((String generated) {
-      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
-          generated.contains(r"'\u2028\u2029'"));
+      Expect.isTrue(
+          generated.contains(r'"\u2028\u2029"') ||
+              generated.contains(r"'\u2028\u2029'"),
+          generated);
     });
     await compileExpression("r''' \r\u2028\u2029'''").then((String generated) {
-      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
-          generated.contains(r"'\u2028\u2029'"));
+      Expect.isTrue(
+          generated.contains(r'"\u2028\u2029"') ||
+              generated.contains(r"'\u2028\u2029'"),
+          generated);
     });
     await compileExpression("r''' \n\u2028\u2029'''").then((String generated) {
-      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
-          generated.contains(r"'\u2028\u2029'"));
+      Expect.isTrue(
+          generated.contains(r'"\u2028\u2029"') ||
+              generated.contains(r"'\u2028\u2029'"),
+          generated);
     });
     await compileExpression(
             "r'''\t\t      \t\t  \t\t  \t \t \n\r\u2028\u2029'''")
         .then((String generated) {
-      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
-          generated.contains(r"'\r\u2028\u2029'"));
+      Expect.isTrue(
+          generated.contains(r'"\r\u2028\u2029"') ||
+              generated.contains(r"'\r\u2028\u2029'"),
+          generated);
     });
     await compileExpression(
             "r'''\\\t\\\t \\   \\  \t\\\t  \t \\\n\r\u2028\u2029'''")
         .then((String generated) {
-      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
-          generated.contains(r"'\r\u2028\u2029'"));
+      Expect.isTrue(
+          generated.contains(r'"\r\u2028\u2029"') ||
+              generated.contains(r"'\r\u2028\u2029'"),
+          generated);
     });
     await compileExpression(
             "r'''\t\t      \t\t  \t\t  \t \t \\\n\r\u2028\u2029'''")
         .then((String generated) {
-      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
-          generated.contains(r"'\r\u2028\u2029'"));
+      Expect.isTrue(
+          generated.contains(r'"\r\u2028\u2029"') ||
+              generated.contains(r"'\r\u2028\u2029'"),
+          generated);
     });
     await compileExpression(
             "r'''\\\t\\\t \\   \\  \t\\\t   \\\r\n\u2028\u2029'''")
         .then((String generated) {
-      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
-          generated.contains(r"'\u2028\u2029'"));
+      Expect.isTrue(
+          generated.contains(r'"\u2028\u2029"') ||
+              generated.contains(r"'\u2028\u2029'"),
+          generated);
     });
     await compileExpression(
             "r'''\\\t\\\t \\   \\  \t\\\t   \\\r\u2028\u2029'''")
         .then((String generated) {
-      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
-          generated.contains(r"'\u2028\u2029'"));
+      Expect.isTrue(
+          generated.contains(r'"\u2028\u2029"') ||
+              generated.contains(r"'\u2028\u2029'"),
+          generated);
     });
     await compileExpression("'\u2028\u2029'").then((String generated) {
-      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
-          generated.contains(r"'\u2028\u2029'"));
+      Expect.isTrue(
+          generated.contains(r'"\u2028\u2029"') ||
+              generated.contains(r"'\u2028\u2029'"),
+          generated);
     });
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
-    // TODO(johnniwinther): This test doesn't work with kernel.
-    //print('--test from kernel----------------------------------------------');
-    //await runTests(useKernel: true);
+    print('--test from kernel----------------------------------------------');
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/string_interpolation_test.dart b/tests/compiler/dart2js/codegen/string_interpolation_test.dart
index 13cbbfa..1e3f2ed 100644
--- a/tests/compiler/dart2js/codegen/string_interpolation_test.dart
+++ b/tests/compiler/dart2js/codegen/string_interpolation_test.dart
@@ -7,25 +7,18 @@
 import '../compiler_helper.dart';
 
 main() {
-  runTests({bool useKernel}) async {
-    CompileMode compileMode =
-        useKernel ? CompileMode.kernel : CompileMode.memory;
-
-    String code1 = await compileAll(
-        r'''main() { return "${2}${true}${'a'}${3.14}"; }''',
-        compileMode: compileMode);
+  runTests() async {
+    String code1 =
+        await compileAll(r'''main() { return "${2}${true}${'a'}${3.14}"; }''');
     Expect.isTrue(code1.contains(r'2truea3.14'));
 
-    String code2 = await compileAll(
-        r'''main() { return "foo ${new Object()}"; }''',
-        compileMode: compileMode);
+    String code2 =
+        await compileAll(r'''main() { return "foo ${new Object()}"; }''');
     Expect.isFalse(code2.contains(r'$add'));
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/switch_empty_default_test.dart b/tests/compiler/dart2js/codegen/switch_empty_default_test.dart
index 1250ef7..4fc1bf7 100644
--- a/tests/compiler/dart2js/codegen/switch_empty_default_test.dart
+++ b/tests/compiler/dart2js/codegen/switch_empty_default_test.dart
@@ -119,19 +119,17 @@
   var defOrCase3 = new RegExp(r"(default:|case 3):");
   var case3 = new RegExp(r"case 3:");
 
-  runTests({bool useKernel}) async {
-    await compileAndDoNotMatch(SIMPLY_EMPTY, 'main', def, useKernel: useKernel);
-    await compileAndDoNotMatch(TOTAL, 'main', defOrCase3, useKernel: useKernel);
-    await compileAndDoNotMatch(OPTIMIZED, 'main', def, useKernel: useKernel);
-    await compileAndMatch(LABEL, 'main', case3, useKernel: useKernel);
-    await compileAndMatch(DEFLABEL, 'main', def, useKernel: useKernel);
-    await compileAndMatch(EMPTYDEFLABEL, 'main', def, useKernel: useKernel);
+  runTests() async {
+    await compileAndDoNotMatch(SIMPLY_EMPTY, 'main', def);
+    await compileAndDoNotMatch(TOTAL, 'main', defOrCase3);
+    await compileAndDoNotMatch(OPTIMIZED, 'main', def);
+    await compileAndMatch(LABEL, 'main', case3);
+    await compileAndMatch(DEFLABEL, 'main', def);
+    await compileAndMatch(EMPTYDEFLABEL, 'main', def);
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/tdiv_test.dart b/tests/compiler/dart2js/codegen/tdiv_test.dart
index f894754..0101c71 100644
--- a/tests/compiler/dart2js/codegen/tdiv_test.dart
+++ b/tests/compiler/dart2js/codegen/tdiv_test.dart
@@ -61,12 +61,9 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     Future check(String test) {
-      return compile(test,
-          entry: 'foo',
-          useKernel: useKernel,
-          check: checkerForAbsentPresent(test));
+      return compile(test, entry: 'foo', check: checkerForAbsentPresent(test));
     }
 
     await check(TEST1);
@@ -77,9 +74,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/top_level_closure_tree_shake_test.dart b/tests/compiler/dart2js/codegen/top_level_closure_tree_shake_test.dart
index 277c631..5f21bfe 100644
--- a/tests/compiler/dart2js/codegen/top_level_closure_tree_shake_test.dart
+++ b/tests/compiler/dart2js/codegen/top_level_closure_tree_shake_test.dart
@@ -26,17 +26,14 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    String generated = await compileAll(TEST_ONE,
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+  runTest() async {
+    String generated = await compileAll(TEST_ONE);
     Expect.isFalse(generated.contains('Tarantula!'), "failed to remove 'foo'");
     Expect.isTrue(generated.contains('Coelacanth!'));
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/tree_shaking_test.dart b/tests/compiler/dart2js/codegen/tree_shaking_test.dart
index 4d47a5f..2d8d365 100644
--- a/tests/compiler/dart2js/codegen/tree_shaking_test.dart
+++ b/tests/compiler/dart2js/codegen/tree_shaking_test.dart
@@ -26,18 +26,15 @@
 """;
 
 void main() {
-  runTest({bool useKernel}) async {
-    String generated = await compileAll(TEST,
-        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+  runTest() async {
+    String generated = await compileAll(TEST);
     Expect.isTrue(generated.contains('return 42'));
     Expect.isTrue(generated.contains('return 54'));
     Expect.isFalse(generated.contains('return 68'));
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart b/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart
index ba65ade..b5b8bdd 100644
--- a/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart
+++ b/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart
@@ -25,11 +25,8 @@
 };
 
 main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     var options = [Flags.trustTypeAnnotations];
-    if (!useKernel) {
-      options.add(Flags.useOldFrontend);
-    }
     var result = await runCompiler(
         memorySourceFiles: MEMORY_SOURCE_FILES, options: options);
     var compiler = result.compiler;
@@ -40,9 +37,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart b/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart
index ff423ac..4e8b777 100644
--- a/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart
+++ b/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart
@@ -50,11 +50,8 @@
 """;
 
 void main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     var options = [Flags.trustTypeAnnotations];
-    if (!useKernel) {
-      options.add(Flags.useOldFrontend);
-    }
     var result = await runCompiler(
         memorySourceFiles: {'main.dart': TEST}, options: options);
     var compiler = result.compiler;
@@ -89,9 +86,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart b/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart
index 43bd9e8..3232909 100644
--- a/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart
+++ b/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart
@@ -41,7 +41,7 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       RegExp regexp = new RegExp(getIntTypeCheck(anyIdentifier));
       Iterator<Match> matches = regexp.allMatches(generated).iterator;
@@ -70,9 +70,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/type_inference2_test.dart b/tests/compiler/dart2js/codegen/type_inference2_test.dart
index 60b8899..415f8fc 100644
--- a/tests/compiler/dart2js/codegen/type_inference2_test.dart
+++ b/tests/compiler/dart2js/codegen/type_inference2_test.dart
@@ -14,14 +14,12 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    await compileAndMatchFuzzy(TEST_ONE, 'sum', r"\+\+x", useKernel: useKernel);
+  runTest() async {
+    await compileAndMatchFuzzy(TEST_ONE, 'sum', r"\+\+x");
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/type_inference3_test.dart b/tests/compiler/dart2js/codegen/type_inference3_test.dart
index 8cb9a1b..8574b25 100644
--- a/tests/compiler/dart2js/codegen/type_inference3_test.dart
+++ b/tests/compiler/dart2js/codegen/type_inference3_test.dart
@@ -15,9 +15,8 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    await compile(TEST_ONE, entry: 'sum', useKernel: useKernel,
-        check: (String generated) {
+  runTest() async {
+    await compile(TEST_ONE, entry: 'sum', check: (String generated) {
       RegExp regexp = new RegExp(getNumberTypeCheck('(param1|b)'));
       Expect.isTrue(
           regexp.hasMatch(generated), '$regexp not found in:\n$generated');
@@ -25,9 +24,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/type_inference4_test.dart b/tests/compiler/dart2js/codegen/type_inference4_test.dart
index 300826d..6dc393f 100644
--- a/tests/compiler/dart2js/codegen/type_inference4_test.dart
+++ b/tests/compiler/dart2js/codegen/type_inference4_test.dart
@@ -17,9 +17,8 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+  runTest() async {
+    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       // Test for absence of an illegal argument exception. This means that the
       // arguments are known to be integers.
       Expect.isFalse(generated.contains('iae'));
@@ -31,9 +30,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/type_inference5_test.dart b/tests/compiler/dart2js/codegen/type_inference5_test.dart
index 3e43f2b..75799aa 100644
--- a/tests/compiler/dart2js/codegen/type_inference5_test.dart
+++ b/tests/compiler/dart2js/codegen/type_inference5_test.dart
@@ -16,9 +16,8 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
-    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
-        check: (String generated) {
+  runTest() async {
+    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       // Test for absence of an illegal argument exception. This means that the
       // arguments are known to be integers.
       Expect.isFalse(generated.contains('iae'));
@@ -33,9 +32,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/type_inference8_test.dart b/tests/compiler/dart2js/codegen/type_inference8_test.dart
index 9c37e97..e1be1bb 100644
--- a/tests/compiler/dart2js/codegen/type_inference8_test.dart
+++ b/tests/compiler/dart2js/codegen/type_inference8_test.dart
@@ -9,6 +9,7 @@
 import "package:compiler/src/types/types.dart";
 import "package:expect/expect.dart";
 import '../compiler_helper.dart';
+import '../memory_compiler.dart';
 
 import 'dart:async';
 
@@ -31,27 +32,27 @@
 }
 """;
 
-Future runTest1() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST1, uri);
-  return compiler.run(uri).then((_) {
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var commonMasks = typesInferrer.closedWorld.commonMasks;
-    MemberElement element = findElement(compiler, "foo");
-    var mask = typesInferrer.getReturnTypeOfMember(element);
-    var falseType =
-        new ValueTypeMask(commonMasks.boolType, new FalseConstantValue());
-    // 'foo' should always return false
-    Expect.equals(falseType, mask);
-    // the argument to 'bar' is always false
-    dynamic bar = findElement(compiler, "bar");
-    var barArg = bar.parameters.first;
-    var barArgMask = typesInferrer.getTypeOfParameter(barArg);
-    Expect.equals(falseType, barArgMask);
-    var barCode = compiler.backend.getGeneratedCode(bar);
-    Expect.isTrue(barCode.contains('"bbb"'));
-    Expect.isFalse(barCode.contains('"aaa"'));
-  });
+Future runTest1() async {
+  var result = await runCompiler(
+      memorySourceFiles: {'main.dart': TEST1},
+      options: ['--use-old-frontend', '--disable-inlining']);
+  var compiler = result.compiler;
+  var typesInferrer = compiler.globalInference.typesInferrerInternal;
+  var commonMasks = typesInferrer.closedWorld.abstractValueDomain;
+  MemberElement element = findElement(compiler, "foo");
+  var mask = typesInferrer.getReturnTypeOfMember(element);
+  var falseType =
+      new ValueTypeMask(commonMasks.boolType, new FalseConstantValue());
+  // 'foo' should always return false
+  Expect.equals(falseType, mask);
+  // the argument to 'bar' is always false
+  dynamic bar = findElement(compiler, "bar");
+  var barArg = bar.parameters.first;
+  var barArgMask = typesInferrer.getTypeOfParameter(barArg);
+  Expect.equals(falseType, barArgMask);
+  var barCode = compiler.backend.getGeneratedCode(bar);
+  Expect.isTrue(barCode.contains('"bbb"'));
+  Expect.isFalse(barCode.contains('"aaa"'));
 }
 
 const String TEST2 = r"""
@@ -74,26 +75,26 @@
 }
 """;
 
-Future runTest2() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST2, uri);
-  return compiler.run(uri).then((_) {
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var commonMasks = typesInferrer.closedWorld.commonMasks;
-    MemberElement element = findElement(compiler, "foo");
-    var mask = typesInferrer.getReturnTypeOfMember(element);
-    // Can't infer value for foo's return type, it could be either true or false
-    Expect.identical(commonMasks.boolType, mask);
-    dynamic bar = findElement(compiler, "bar");
-    var barArg = bar.parameters.first;
-    var barArgMask = typesInferrer.getTypeOfParameter(barArg);
-    // The argument to bar should have the same type as the return type of foo
-    Expect.identical(commonMasks.boolType, barArgMask);
-    var barCode = compiler.backend.getGeneratedCode(bar);
-    Expect.isTrue(barCode.contains('"bbb"'));
-    // Still must output the print for "aaa"
-    Expect.isTrue(barCode.contains('"aaa"'));
-  });
+Future runTest2() async {
+  var result = await runCompiler(
+      memorySourceFiles: {'main.dart': TEST2},
+      options: ['--use-old-frontend', '--disable-inlining']);
+  var compiler = result.compiler;
+  var typesInferrer = compiler.globalInference.typesInferrerInternal;
+  var commonMasks = typesInferrer.closedWorld.abstractValueDomain;
+  MemberElement element = findElement(compiler, "foo");
+  var mask = typesInferrer.getReturnTypeOfMember(element);
+  // Can't infer value for foo's return type, it could be either true or false
+  Expect.identical(commonMasks.boolType, mask);
+  dynamic bar = findElement(compiler, "bar");
+  var barArg = bar.parameters.first;
+  var barArgMask = typesInferrer.getTypeOfParameter(barArg);
+  // The argument to bar should have the same type as the return type of foo
+  Expect.identical(commonMasks.boolType, barArgMask);
+  var barCode = compiler.backend.getGeneratedCode(bar);
+  Expect.isTrue(barCode.contains('"bbb"'));
+  // Still must output the print for "aaa"
+  Expect.isTrue(barCode.contains('"aaa"'));
 }
 
 main() {
diff --git a/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart b/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart
index 02d60de..0326068 100644
--- a/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart
+++ b/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart
@@ -35,28 +35,23 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
-    CompileMode compileMode =
-        useKernel ? CompileMode.kernel : CompileMode.memory;
-
+  runTests() async {
     // Test that we know the type of captured, non-mutated variables.
-    String generated1 = await compileAll(TEST1, compileMode: compileMode);
+    String generated1 = await compileAll(TEST1);
     Expect.isTrue(generated1.contains('+ 87'));
 
     // Test that we know the type of captured, mutated variables.
-    String generated2 = await compileAll(TEST2, compileMode: compileMode);
+    String generated2 = await compileAll(TEST2);
     Expect.isTrue(generated2.contains('+ 87'));
 
     // Test that we know when types of a captured, mutated variable
     // conflict.
-    String generated3 = await compileAll(TEST3, compileMode: compileMode);
+    String generated3 = await compileAll(TEST3);
     Expect.isFalse(generated3.contains('+ 87'));
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/unused_empty_map_test.dart b/tests/compiler/dart2js/codegen/unused_empty_map_test.dart
index db577be..dd7d6fb 100644
--- a/tests/compiler/dart2js/codegen/unused_empty_map_test.dart
+++ b/tests/compiler/dart2js/codegen/unused_empty_map_test.dart
@@ -6,7 +6,6 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
 import '../memory_compiler.dart';
 
@@ -22,20 +21,16 @@
 const HASHMAP_EMPTY_CONSTRUCTOR = r"LinkedHashMap_LinkedHashMap$_empty";
 
 main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     var collector = new OutputCollector();
     await runCompiler(
-        memorySourceFiles: TEST_SOURCE,
-        outputProvider: collector,
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+        memorySourceFiles: TEST_SOURCE, outputProvider: collector);
     String generated = collector.getOutput('', OutputType.js);
     Expect.isFalse(generated.contains(HASHMAP_EMPTY_CONSTRUCTOR));
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/use_checks_test.dart b/tests/compiler/dart2js/codegen/use_checks_test.dart
index 283e81c..0d50d070 100644
--- a/tests/compiler/dart2js/codegen/use_checks_test.dart
+++ b/tests/compiler/dart2js/codegen/use_checks_test.dart
@@ -24,9 +24,8 @@
 };
 
 main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     var options = [Flags.enableCheckedMode];
-    if (!useKernel) options.add(Flags.useOldFrontend);
     var result = await runCompiler(
         memorySourceFiles: MEMORY_SOURCE_FILES, options: options);
     var compiler = result.compiler;
@@ -37,9 +36,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/use_strict_test.dart b/tests/compiler/dart2js/codegen/use_strict_test.dart
index fe3cd70..6c65a7f 100644
--- a/tests/compiler/dart2js/codegen/use_strict_test.dart
+++ b/tests/compiler/dart2js/codegen/use_strict_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
 import '../memory_compiler.dart';
 
@@ -48,12 +47,10 @@
 };
 
 main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     OutputCollector collector = new OutputCollector();
     await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        outputProvider: collector,
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
     String jsOutput = collector.getOutput('', OutputType.js);
 
     // Skip comments.
@@ -70,9 +67,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/value_range2_test.dart b/tests/compiler/dart2js/codegen/value_range2_test.dart
index f4b9376..be9df0f 100644
--- a/tests/compiler/dart2js/codegen/value_range2_test.dart
+++ b/tests/compiler/dart2js/codegen/value_range2_test.dart
@@ -5,12 +5,24 @@
 import "package:expect/expect.dart";
 import "package:compiler/src/ssa/nodes.dart";
 import "package:compiler/src/ssa/value_range_analyzer.dart";
+import "package:compiler/src/types/abstract_value_domain.dart";
 import "package:compiler/src/js_backend/constant_system_javascript.dart";
 
 ValueRangeInfo info = new ValueRangeInfo(const JavaScriptConstantSystem());
 
-Value instructionValue = info.newInstructionValue(new HBreak(null, null));
-Value lengthValue = info.newPositiveValue(new HBreak(null, null));
+class AbstractValueDomainMock implements AbstractValueDomain {
+  const AbstractValueDomainMock();
+
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
+
+AbstractValueDomain abstractValueDomain = const AbstractValueDomainMock();
+
+Value instructionValue =
+    info.newInstructionValue(new HBreak(abstractValueDomain, null, null));
+Value lengthValue =
+    info.newPositiveValue(new HBreak(abstractValueDomain, null, null));
 
 Range createSingleRange(Value value) => info.newNormalizedRange(value, value);
 
diff --git a/tests/compiler/dart2js/codegen/value_range3_test.dart b/tests/compiler/dart2js/codegen/value_range3_test.dart
index 899f5f3..bc973e5 100644
--- a/tests/compiler/dart2js/codegen/value_range3_test.dart
+++ b/tests/compiler/dart2js/codegen/value_range3_test.dart
@@ -5,7 +5,6 @@
 // Test that global analysis in dart2js propagates positive integers.
 
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
 import '../memory_compiler.dart';
 
@@ -24,10 +23,8 @@
 };
 
 main() {
-  runTest({bool useKernel}) async {
-    var result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+  runTest() async {
+    var result = await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
     var compiler = result.compiler;
     var element =
         compiler.backendClosedWorldForTesting.elementEnvironment.mainFunction;
@@ -36,9 +33,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/value_range_kernel_test.dart b/tests/compiler/dart2js/codegen/value_range_kernel_test.dart
deleted file mode 100644
index 1e133d6..0000000
--- a/tests/compiler/dart2js/codegen/value_range_kernel_test.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:async_helper/async_helper.dart';
-import 'value_range_test_helper.dart';
-
-main() {
-  asyncTest(() async {
-    // AST part tested in 'value_range_test.dart'.
-    print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
-  });
-}
diff --git a/tests/compiler/dart2js/codegen/value_range_test.dart b/tests/compiler/dart2js/codegen/value_range_test.dart
index e03aa79..10e3f32 100644
--- a/tests/compiler/dart2js/codegen/value_range_test.dart
+++ b/tests/compiler/dart2js/codegen/value_range_test.dart
@@ -1,14 +1,298 @@
-// Copyright (c) 2012, 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.
 
+import 'dart:async';
 import 'package:async_helper/async_helper.dart';
-import 'value_range_test_helper.dart';
+import 'package:expect/expect.dart';
+import '../compiler_helper.dart';
+
+const int REMOVED = 0;
+const int ABOVE_ZERO = 1;
+const int BELOW_LENGTH = 2;
+const int KEPT = 3;
+const int ONE_CHECK = 4;
+const int ONE_ZERO_CHECK = 5;
+const int BELOW_ZERO_CHECK = 6;
+
+final List TESTS = [
+  """
+main() {
+  var a = new List();
+  var sum = 0;
+  for (int i = 0; i < a.length; i++) {
+    sum += a[i];
+  }
+  return sum;
+}
+""",
+  REMOVED,
+  """
+main(value) {
+  var a = new List();
+  var sum = 0;
+  for (int i = 0; i < value; i++) {
+    sum += a[i];
+  }
+  return sum;
+}
+""",
+  ABOVE_ZERO,
+  """
+main(check) {
+  // Make sure value is an int.
+  var value = check ? 42 : 54;
+  var a = new List(value);
+  var sum = 0;
+  for (int i = 0; i < value; i++) {
+    sum += a[i];
+  }
+  return sum;
+}
+""",
+  REMOVED,
+  """
+main() {
+  var a = new List();
+  return a[0];
+}
+""",
+  KEPT,
+  """
+main() {
+  var a = new List();
+  return a.removeLast();
+}
+""",
+  KEPT,
+  """
+main() {
+  var a = new List(4);
+  return a[0];
+}
+""",
+  REMOVED,
+  """
+main() {
+  var a = new List(4);
+  return a.removeLast();
+}
+""",
+  REMOVED,
+  """
+main(value) {
+  var a = new List(value);
+  return a[value];
+}
+""",
+  KEPT,
+  """
+main(value) {
+  var a = new List(1024);
+  return a[1023 & value];
+}
+""",
+  REMOVED,
+  """
+main(value) {
+  var a = new List(1024);
+  return a[1024 & value];
+}
+""",
+  ABOVE_ZERO,
+  """
+main(value) {
+  var a = new List();
+  return a[1];
+}
+""",
+  ABOVE_ZERO,
+  """
+main(value, call) {
+  var a = new List();
+  return a[value] + call() + a[value];
+}
+""",
+  ONE_ZERO_CHECK,
+  """
+main(value) {
+  var a = new List();
+  return a[1] + a[0];
+}
+""",
+  ONE_CHECK,
+  """
+main() {
+  var a = new List();
+  var sum = 0;
+  for (int i = 0; i <= a.length - 1; i++) {
+    sum += a[i];
+  }
+  return sum;
+}
+""",
+  REMOVED,
+  """
+main() {
+  var a = new List();
+  var sum = 0;
+  for (int i = a.length - 1; i >=0; i--) {
+    sum += a[i];
+  }
+  return sum;
+}
+""",
+  REMOVED,
+  """
+main(value) {
+  value = value is int ? value as int : 42;
+  int sum = ~value;
+  for (int i = 0; i < 42; i++) sum += (value & 4);
+  var a = new List();
+  if (value > a.length - 1) return;
+  if (value < 0) return;
+  return a[value];
+}
+""",
+  REMOVED,
+  """
+main(value) {
+  value = value is int ? value as int : 42;
+  int sum = ~value;
+  for (int i = 0; i < 42; i++) sum += (value & 4);
+  var a = new List();
+  if (value <= a.length - 1) {
+    if (value >= 0) {
+      return a[value];
+    }
+  }
+}
+""",
+  REMOVED,
+  """
+main(value) {
+  value = value is int ? value as int : 42;
+  int sum = ~value;
+  for (int i = 0; i < 42; i++) sum += (value & 4);
+  var a = new List();
+  if (value >= a.length) return;
+  if (value <= -1) return;
+  return a[value];
+}
+""",
+  REMOVED,
+  """
+main(value) {
+  var a = new List(4);
+  var sum = 0;
+  for (int i = 0; i < a.length; i++) {
+    sum += a[i];
+    if (sum == 0) i++;
+  }
+  return sum;
+}
+""",
+  REMOVED,
+  """
+main(value) {
+  var a = new List(5);
+  var sum = 0;
+  for (int i = a.length - 1; i >= 0; i--) {
+    sum += a[i];
+    if (sum == 0) i--;
+  }
+  return sum;
+}
+""",
+  REMOVED,
+  """
+main(value) {
+  var a = new List(6);
+  var sum = 0;
+  for (int i = 0; i < a.length; i++) {
+    sum += a[i];
+    if (sum == 0) i--;
+  }
+  return sum;
+}
+""",
+  BELOW_ZERO_CHECK,
+  """
+main(value) {
+  var a = new List(7);
+  var sum = 0;
+  for (int i = 0; i < a.length;) {
+    sum += a[i];
+    sum == 0 ? i-- : i++;
+  }
+  return sum;
+}
+""",
+  BELOW_ZERO_CHECK,
+  """
+main(value) {
+  var a = new List(7);
+  var sum = 0;
+  for (int i = -2; i < a.length; i = 0) {
+    sum += a[i];
+  }
+  return sum;
+}
+""",
+  BELOW_ZERO_CHECK,
+];
+
+Future expect(String code, int kind) {
+  return compile(code, check: (String generated) {
+    switch (kind) {
+      case REMOVED:
+        Expect.isTrue(!generated.contains('ioore'));
+        break;
+
+      case ABOVE_ZERO:
+        Expect.isTrue(!generated.contains('< 0'));
+        Expect.isTrue(generated.contains('ioore'));
+        break;
+
+      case BELOW_ZERO_CHECK:
+        Expect.isTrue(generated.contains('< 0'));
+        Expect.isTrue(!generated.contains('||'));
+        Expect.isTrue(generated.contains('ioore'));
+        break;
+
+      case BELOW_LENGTH:
+        Expect.isTrue(!generated.contains('||'));
+        Expect.isTrue(generated.contains('ioore'));
+        break;
+
+      case KEPT:
+        Expect.isTrue(generated.contains('ioore'));
+        break;
+
+      case ONE_CHECK:
+        RegExp regexp = new RegExp('ioore');
+        Iterator matches = regexp.allMatches(generated).iterator;
+        checkNumberOfMatches(matches, 1);
+        break;
+
+      case ONE_ZERO_CHECK:
+        RegExp regexp = new RegExp('< 0|>>> 0 !==');
+        Iterator matches = regexp.allMatches(generated).iterator;
+        checkNumberOfMatches(matches, 1);
+        break;
+    }
+  });
+}
+
+runTests() async {
+  for (int i = 0; i < TESTS.length; i += 2) {
+    await expect(TESTS[i], TESTS[i + 1]);
+  }
+}
 
 main() {
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
-    // Kernel part tested in 'value_range_kernel_test.dart'.
+    print('--test from kernel------------------------------------------------');
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/value_range_test_helper.dart b/tests/compiler/dart2js/codegen/value_range_test_helper.dart
deleted file mode 100644
index c486048..0000000
--- a/tests/compiler/dart2js/codegen/value_range_test_helper.dart
+++ /dev/null
@@ -1,290 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import '../compiler_helper.dart';
-
-const int REMOVED = 0;
-const int ABOVE_ZERO = 1;
-const int BELOW_LENGTH = 2;
-const int KEPT = 3;
-const int ONE_CHECK = 4;
-const int ONE_ZERO_CHECK = 5;
-const int BELOW_ZERO_CHECK = 6;
-
-final List TESTS = [
-  """
-main() {
-  var a = new List();
-  var sum = 0;
-  for (int i = 0; i < a.length; i++) {
-    sum += a[i];
-  }
-  return sum;
-}
-""",
-  REMOVED,
-  """
-main(value) {
-  var a = new List();
-  var sum = 0;
-  for (int i = 0; i < value; i++) {
-    sum += a[i];
-  }
-  return sum;
-}
-""",
-  ABOVE_ZERO,
-  """
-main(check) {
-  // Make sure value is an int.
-  var value = check ? 42 : 54;
-  var a = new List(value);
-  var sum = 0;
-  for (int i = 0; i < value; i++) {
-    sum += a[i];
-  }
-  return sum;
-}
-""",
-  REMOVED,
-  """
-main() {
-  var a = new List();
-  return a[0];
-}
-""",
-  KEPT,
-  """
-main() {
-  var a = new List();
-  return a.removeLast();
-}
-""",
-  KEPT,
-  """
-main() {
-  var a = new List(4);
-  return a[0];
-}
-""",
-  REMOVED,
-  """
-main() {
-  var a = new List(4);
-  return a.removeLast();
-}
-""",
-  REMOVED,
-  """
-main(value) {
-  var a = new List(value);
-  return a[value];
-}
-""",
-  KEPT,
-  """
-main(value) {
-  var a = new List(1024);
-  return a[1023 & value];
-}
-""",
-  REMOVED,
-  """
-main(value) {
-  var a = new List(1024);
-  return a[1024 & value];
-}
-""",
-  ABOVE_ZERO,
-  """
-main(value) {
-  var a = new List();
-  return a[1];
-}
-""",
-  ABOVE_ZERO,
-  """
-main(value, call) {
-  var a = new List();
-  return a[value] + call() + a[value];
-}
-""",
-  ONE_ZERO_CHECK,
-  """
-main(value) {
-  var a = new List();
-  return a[1] + a[0];
-}
-""",
-  ONE_CHECK,
-  """
-main() {
-  var a = new List();
-  var sum = 0;
-  for (int i = 0; i <= a.length - 1; i++) {
-    sum += a[i];
-  }
-  return sum;
-}
-""",
-  REMOVED,
-  """
-main() {
-  var a = new List();
-  var sum = 0;
-  for (int i = a.length - 1; i >=0; i--) {
-    sum += a[i];
-  }
-  return sum;
-}
-""",
-  REMOVED,
-  """
-main(value) {
-  value = value is int ? value as int : 42;
-  int sum = ~value;
-  for (int i = 0; i < 42; i++) sum += (value & 4);
-  var a = new List();
-  if (value > a.length - 1) return;
-  if (value < 0) return;
-  return a[value];
-}
-""",
-  REMOVED,
-  """
-main(value) {
-  value = value is int ? value as int : 42;
-  int sum = ~value;
-  for (int i = 0; i < 42; i++) sum += (value & 4);
-  var a = new List();
-  if (value <= a.length - 1) {
-    if (value >= 0) {
-      return a[value];
-    }
-  }
-}
-""",
-  REMOVED,
-  """
-main(value) {
-  value = value is int ? value as int : 42;
-  int sum = ~value;
-  for (int i = 0; i < 42; i++) sum += (value & 4);
-  var a = new List();
-  if (value >= a.length) return;
-  if (value <= -1) return;
-  return a[value];
-}
-""",
-  REMOVED,
-  """
-main(value) {
-  var a = new List(4);
-  var sum = 0;
-  for (int i = 0; i < a.length; i++) {
-    sum += a[i];
-    if (sum == 0) i++;
-  }
-  return sum;
-}
-""",
-  REMOVED,
-  """
-main(value) {
-  var a = new List(5);
-  var sum = 0;
-  for (int i = a.length - 1; i >= 0; i--) {
-    sum += a[i];
-    if (sum == 0) i--;
-  }
-  return sum;
-}
-""",
-  REMOVED,
-  """
-main(value) {
-  var a = new List(6);
-  var sum = 0;
-  for (int i = 0; i < a.length; i++) {
-    sum += a[i];
-    if (sum == 0) i--;
-  }
-  return sum;
-}
-""",
-  BELOW_ZERO_CHECK,
-  """
-main(value) {
-  var a = new List(7);
-  var sum = 0;
-  for (int i = 0; i < a.length;) {
-    sum += a[i];
-    sum == 0 ? i-- : i++;
-  }
-  return sum;
-}
-""",
-  BELOW_ZERO_CHECK,
-  """
-main(value) {
-  var a = new List(7);
-  var sum = 0;
-  for (int i = -2; i < a.length; i = 0) {
-    sum += a[i];
-  }
-  return sum;
-}
-""",
-  BELOW_ZERO_CHECK,
-];
-
-Future expect(String code, int kind, {bool useKernel}) {
-  return compile(code, useKernel: useKernel, check: (String generated) {
-    switch (kind) {
-      case REMOVED:
-        Expect.isTrue(!generated.contains('ioore'));
-        break;
-
-      case ABOVE_ZERO:
-        Expect.isTrue(!generated.contains('< 0'));
-        Expect.isTrue(generated.contains('ioore'));
-        break;
-
-      case BELOW_ZERO_CHECK:
-        Expect.isTrue(generated.contains('< 0'));
-        Expect.isTrue(!generated.contains('||'));
-        Expect.isTrue(generated.contains('ioore'));
-        break;
-
-      case BELOW_LENGTH:
-        Expect.isTrue(!generated.contains('||'));
-        Expect.isTrue(generated.contains('ioore'));
-        break;
-
-      case KEPT:
-        Expect.isTrue(generated.contains('ioore'));
-        break;
-
-      case ONE_CHECK:
-        RegExp regexp = new RegExp('ioore');
-        Iterator matches = regexp.allMatches(generated).iterator;
-        checkNumberOfMatches(matches, 1);
-        break;
-
-      case ONE_ZERO_CHECK:
-        RegExp regexp = new RegExp('< 0|>>> 0 !==');
-        Iterator matches = regexp.allMatches(generated).iterator;
-        checkNumberOfMatches(matches, 1);
-        break;
-    }
-  });
-}
-
-runTests({bool useKernel}) async {
-  for (int i = 0; i < TESTS.length; i += 2) {
-    await expect(TESTS[i], TESTS[i + 1], useKernel: useKernel);
-  }
-}
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index dfd7721..f1505be 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -34,22 +34,16 @@
 
 export 'package:compiler/src/tree/tree.dart';
 
-import 'old_frontend/mock_compiler.dart';
-export 'old_frontend/mock_compiler.dart';
-
 import 'memory_compiler.dart';
 
 import 'output_collector.dart';
 export 'output_collector.dart';
 
-enum CompileMode { mock, memory, kernel }
-
-/// Compile [code] and returns either the code for [methodName] or, if [returnAll] is
-/// true, the code for the entire program.
+/// Compile [code] and returns either the code for [methodName] or, if
+/// [returnAll] is true, the code for the entire program.
 ///
 /// If [check] is provided, it is executed on the code for [entry] before
-/// returning. If [useMock] is `true` the [MockCompiler] is used for
-/// compilation, otherwise the memory compiler is used.
+/// returning.
 Future<String> compile(String code,
     {String entry: 'main',
     String methodName,
@@ -58,7 +52,6 @@
     bool analyzeAll: false,
     bool disableInlining: true,
     bool trustJSInteropTypeAnnotations: false,
-    bool useKernel: false,
     void check(String generatedEntry),
     bool returnAll: false}) async {
   OutputCollector outputCollector = returnAll ? new OutputCollector() : null;
@@ -75,9 +68,6 @@
   if (trustJSInteropTypeAnnotations) {
     options.add(Flags.trustJSInteropTypeAnnotations);
   }
-  if (!useKernel) {
-    options.add(Flags.useOldFrontend);
-  }
   if (disableInlining) {
     options.add(Flags.disableInlining);
   }
@@ -110,93 +100,35 @@
 }
 
 Future<String> compileAll(String code,
-    {Map<String, String> coreSource,
-    bool disableInlining: true,
+    {bool disableInlining: true,
     bool trustTypeAnnotations: false,
     bool minify: false,
     int expectedErrors,
-    int expectedWarnings,
-    CompileMode compileMode: CompileMode.mock}) async {
+    int expectedWarnings}) async {
   OutputCollector outputCollector = new OutputCollector();
-  if (compileMode == CompileMode.mock) {
-    Uri uri = new Uri(scheme: 'source');
-    MockCompiler compiler = mockCompilerFor(code, uri,
-        coreSource: coreSource,
-        disableInlining: disableInlining,
-        minify: minify,
-        expectedErrors: expectedErrors,
-        trustTypeAnnotations: trustTypeAnnotations,
-        expectedWarnings: expectedWarnings,
-        outputProvider: outputCollector);
-    compiler.diagnosticHandler = createHandler(compiler, code);
-    bool compilationSucceeded = await compiler.run(uri);
-    Expect.isTrue(
-        compilationSucceeded,
-        'Unexpected compilation error(s): '
-        '${compiler.diagnosticCollector.errors}');
-  } else {
-    DiagnosticCollector diagnosticCollector = new DiagnosticCollector();
-    if (coreSource != null) {
-      throw new UnsupportedError(
-          'coreSource is not supported for $compileMode');
-    }
-    List<String> options = <String>[];
-    if (disableInlining) {
-      options.add(Flags.disableInlining);
-    }
-    if (trustTypeAnnotations) {
-      options.add(Flags.trustTypeAnnotations);
-    }
-    if (minify) {
-      options.add(Flags.minify);
-    }
-    if (compileMode == CompileMode.kernel) {
-      options.add(Flags.useKernel);
-    }
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': code},
-        options: options,
-        outputProvider: outputCollector,
-        diagnosticHandler: diagnosticCollector);
-    Expect.isTrue(
-        result.isSuccess,
-        'Unexpected compilation error(s): '
-        '${diagnosticCollector.errors}');
+  DiagnosticCollector diagnosticCollector = new DiagnosticCollector();
+  List<String> options = <String>[];
+  if (disableInlining) {
+    options.add(Flags.disableInlining);
   }
+  if (trustTypeAnnotations) {
+    options.add(Flags.trustTypeAnnotations);
+  }
+  if (minify) {
+    options.add(Flags.minify);
+  }
+  CompilationResult result = await runCompiler(
+      memorySourceFiles: {'main.dart': code},
+      options: options,
+      outputProvider: outputCollector,
+      diagnosticHandler: diagnosticCollector);
+  Expect.isTrue(
+      result.isSuccess,
+      'Unexpected compilation error(s): '
+      '${diagnosticCollector.errors}');
   return outputCollector.getOutput('', OutputType.js);
 }
 
-Future analyzeAndCheck(
-    String code, String name, check(MockCompiler compiler, Element element),
-    {int expectedErrors, int expectedWarnings}) {
-  Uri uri = new Uri(scheme: 'source');
-  MockCompiler compiler = mockCompilerFor(code, uri,
-      expectedErrors: expectedErrors,
-      expectedWarnings: expectedWarnings,
-      analyzeOnly: true);
-  return compiler.run(uri).then((_) {
-    Element element = findElement(compiler, name);
-    return check(compiler, element);
-  });
-}
-
-Future compileSources(
-    Map<String, String> sources, check(MockCompiler compiler)) {
-  Uri base = new Uri(scheme: 'source', path: '/');
-  Uri mainUri = base.resolve('main.dart');
-  String mainCode = sources['main.dart'];
-  Expect.isNotNull(mainCode, 'No source code found for "main.dart"');
-  MockCompiler compiler = mockCompilerFor(mainCode, mainUri);
-  sources.forEach((String path, String code) {
-    if (path == 'main.dart') return;
-    compiler.registerSource(base.resolve(path), code);
-  });
-
-  return compiler.run(mainUri).then((_) {
-    return check(compiler);
-  });
-}
-
 Element findElement(compiler, String name, [Uri library]) {
   LibraryElement lib = compiler.frontendStrategy.elementEnvironment.mainLibrary;
   if (library != null) {
@@ -228,19 +160,15 @@
   Expect.isFalse(hasNext, "Found more than $nb matches");
 }
 
-Future compileAndMatch(String code, String entry, RegExp regexp,
-    {bool useKernel: false}) {
-  return compile(code, entry: entry, useKernel: useKernel,
-      check: (String generated) {
+Future compileAndMatch(String code, String entry, RegExp regexp) {
+  return compile(code, entry: entry, check: (String generated) {
     Expect.isTrue(
         regexp.hasMatch(generated), '"$generated" does not match /$regexp/');
   });
 }
 
-Future compileAndDoNotMatch(String code, String entry, RegExp regexp,
-    {bool useKernel: false}) {
-  return compile(code, entry: entry, useKernel: useKernel,
-      check: (String generated) {
+Future compileAndDoNotMatch(String code, String entry, RegExp regexp) {
+  return compile(code, entry: entry, check: (String generated) {
     Expect.isFalse(
         regexp.hasMatch(generated), '"$generated" has a match in /$regexp/');
   });
@@ -250,22 +178,17 @@
 
 // Does a compile and then a match where every 'x' is replaced by something
 // that matches any variable, and every space is optional.
-Future compileAndMatchFuzzy(String code, String entry, String regexp,
-    {bool useKernel: false}) {
-  return compileAndMatchFuzzyHelper(code, entry, regexp,
-      shouldMatch: true, useKernel: useKernel);
+Future compileAndMatchFuzzy(String code, String entry, String regexp) {
+  return compileAndMatchFuzzyHelper(code, entry, regexp, shouldMatch: true);
 }
 
-Future compileAndDoNotMatchFuzzy(String code, String entry, String regexp,
-    {bool useKernel: false}) {
-  return compileAndMatchFuzzyHelper(code, entry, regexp,
-      shouldMatch: false, useKernel: useKernel);
+Future compileAndDoNotMatchFuzzy(String code, String entry, String regexp) {
+  return compileAndMatchFuzzyHelper(code, entry, regexp, shouldMatch: false);
 }
 
 Future compileAndMatchFuzzyHelper(String code, String entry, String regexp,
-    {bool shouldMatch, bool useKernel: false}) {
-  return compile(code, entry: entry, useKernel: useKernel,
-      check: (String generated) {
+    {bool shouldMatch}) {
+  return compile(code, entry: entry, check: (String generated) {
     final xRe = new RegExp('\\bx\\b');
     regexp = regexp.replaceAll(xRe, '(?:$anyIdentifier)');
     final spaceRe = new RegExp('\\s+');
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index d7f0004..de4f98d 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -1,15 +1,19 @@
 # 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.
+
 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.
 boolified_operator_test: Fail # Issue 8001
 closure/closure_test: Pass, Slow
 codegen/gvn_dynamic_field_get_test: Fail # Issue 18519
+codegen/list_tracer_length_test: Fail # Issue 33051
 codegen/load_elimination_test: Pass, Slow
 codegen/logical_expression_test: Fail # Issue 17027
+codegen/side_effect_tdiv_regression_test: Fail # Issue 33050
 codegen/simple_function_subtype_test: Fail # simple_function_subtype_test is temporarily(?) disabled due to new method for building function type tests.
+codegen/string_escapes_test: Fail # Issue 33060
 deferred_loading/deferred_loading_test: Slow, Pass
 equivalence/id_equivalence1_test: Pass, Slow
 equivalence/id_equivalence2_test: Pass, Slow
@@ -25,21 +29,9 @@
 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.
-mirrors/library_exports_hidden_test: Fail
-mirrors/library_exports_shown_test: Fail
-mirrors/library_imports_hidden_test: Fail
-mirrors/library_imports_prefixed_show_hide_test: Fail # Issue 32057
-mirrors/library_imports_prefixed_test: Fail
-mirrors/library_imports_shown_test: Fail
 model/subtype_test: Pass, Slow
 no_such_method_enabled_test: Pass, Slow
-old_frontend/bad_loop_test: RuntimeError
-old_frontend/check_elements_invariants_test: Skip # Times out even with Slow marker. Slow due to inlining in the CPS backend
-old_frontend/compile_with_empty_libraries_test: Fail # Issue 24223
-old_frontend/patch_test/bug: RuntimeError # Issue 21132
-old_frontend/resolver_test: RuntimeError # Test must be updated given new parser recovery
 packages/*: Skip # Skip packages folder
-quarantined/http_test: RuntimeError # not supported with CFE, consider deleting.
 rti/rti_emission_test: Pass, Slow
 rti/rti_need0_test: Pass, Slow
 rti/rti_need1_test: Pass, Slow
@@ -56,14 +48,6 @@
 end_to_end/dart2js_batch_test: Pass, Slow
 end_to_end/exit_code_test: Pass, Slow
 in_user_code_test: Pass, Slow
-mirrors/deferred_mirrors_test: Pass, Slow
-mirrors/import_mirrors_test: Pass, Slow
-mirrors/mirror_final_field_inferrer2_test: Crash, Pass, Slow # Issue 15581
-old_frontend/analyze_api_test: Pass, Slow # 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.
-old_frontend/check_elements_invariants_test: Skip # Slow and only needs to be run in one configuration
-old_frontend/check_members_test: Pass, Slow
-old_frontend/duplicate_library_test: Pass, Slow
-old_frontend/message_kind_test: Pass, Slow
 show_package_warnings_test: Pass, Slow
 sourcemaps/source_map_pub_build_validity_test: Pass, Slow
 
@@ -78,12 +62,6 @@
 jsinterop/interop_anonymous_unreachable_test: Pass, Slow
 jsinterop/world_test: Pass, Slow
 kernel/visitor_test: Pass, Slow
-mirrors/deferred_mirrors_test: Pass, Slow
-mirrors/import_mirrors_test: Slow, Pass
-mirrors/mirror_final_field_inferrer2_test: Pass, Slow
-mirrors/preserve_uris_test: Pass, Slow
-old_frontend/analyze_dart2js_helpers_test: Pass, Slow
-old_frontend/duplicate_library_test: Pass, Slow
 output_type_test: Pass, Slow
 sourcemaps/source_map_pub_build_validity_test: Pass, Slow
 sourcemaps/stacktrace_test: Pass, Slow
diff --git a/tests/compiler/dart2js/deferred/closures_test.dart b/tests/compiler/dart2js/deferred/closures_test.dart
index 9e97701..f8d7dcc 100644
--- a/tests/compiler/dart2js/deferred/closures_test.dart
+++ b/tests/compiler/dart2js/deferred/closures_test.dart
@@ -6,7 +6,6 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
 
 import '../memory_compiler.dart';
@@ -14,18 +13,14 @@
 
 void main() {
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
 
-runTest({bool useKernel}) async {
+runTest() async {
   OutputCollector collector = new OutputCollector();
-  var options = useKernel ? [] : [Flags.useOldFrontend];
-  await runCompiler(
-      memorySourceFiles: sources, outputProvider: collector, options: options);
+  await runCompiler(memorySourceFiles: sources, outputProvider: collector);
   String mainOutput = collector.getOutput("", OutputType.js);
   String deferredOutput = collector.getOutput("out_1", OutputType.jsPart);
 
diff --git a/tests/compiler/dart2js/deferred/custom_element_test.dart b/tests/compiler/dart2js/deferred/custom_element_test.dart
index b47edfa..01fb615 100644
--- a/tests/compiler/dart2js/deferred/custom_element_test.dart
+++ b/tests/compiler/dart2js/deferred/custom_element_test.dart
@@ -8,23 +8,19 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
 import '../memory_compiler.dart';
 
 void main() {
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
 
-runTest({bool useKernel}) async {
-  CompilationResult result = await runCompiler(
-      memorySourceFiles: MEMORY_SOURCE_FILES,
-      options: useKernel ? [] : [Flags.useOldFrontend]);
+runTest() async {
+  CompilationResult result =
+      await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
   Compiler compiler = result.compiler;
   var closedWorld = compiler.backendClosedWorldForTesting;
   var outputUnitForEntity = compiler.backend.outputUnitData.outputUnitForEntity;
diff --git a/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart b/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
index 23d692f..33da0d2 100644
--- a/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
+++ b/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
@@ -7,19 +7,16 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:expect/expect.dart';
 import '../memory_compiler.dart';
 import '../output_collector.dart';
 
 void main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     OutputCollector collector = new OutputCollector();
     CompilationResult result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        outputProvider: collector,
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
     Compiler compiler = result.compiler;
     var closedWorld = compiler.backendClosedWorldForTesting;
     var elementEnvironment = closedWorld.elementEnvironment;
@@ -88,10 +85,8 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
 
diff --git a/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart b/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
index 558f585..7b6db2d 100644
--- a/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
+++ b/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
@@ -7,19 +7,16 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:expect/expect.dart';
 import '../memory_compiler.dart';
 import '../output_collector.dart';
 
 void main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     OutputCollector collector = new OutputCollector();
     CompilationResult result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        outputProvider: collector,
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
     Compiler compiler = result.compiler;
     var closedWorld = compiler.backendClosedWorldForTesting;
     var elementEnvironment = closedWorld.elementEnvironment;
@@ -48,10 +45,8 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
 
diff --git a/tests/compiler/dart2js/deferred/emit_type_checks_test.dart b/tests/compiler/dart2js/deferred/emit_type_checks_test.dart
index 370fc30..6b38487 100644
--- a/tests/compiler/dart2js/deferred/emit_type_checks_test.dart
+++ b/tests/compiler/dart2js/deferred/emit_type_checks_test.dart
@@ -7,7 +7,6 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/js_backend/js_backend.dart' show JavaScriptBackend;
 import 'package:expect/expect.dart';
@@ -15,12 +14,10 @@
 import '../output_collector.dart';
 
 void main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     OutputCollector collector = new OutputCollector();
     CompilationResult result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        outputProvider: collector,
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
     Compiler compiler = result.compiler;
     String mainOutput = collector.getOutput('', OutputType.js);
     String deferredOutput = collector.getOutput('out_1', OutputType.jsPart);
@@ -34,10 +31,8 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
 
diff --git a/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart b/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
index 6944dff..4ed0b6d 100644
--- a/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
+++ b/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
@@ -5,17 +5,15 @@
 // Test that constants depended on by other constants are correctly deferred.
 
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/constants/values.dart';
 import 'package:expect/expect.dart';
 import '../memory_compiler.dart';
 
 void main() {
-  runTest({bool useKernel}) async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+  runTest() async {
+    CompilationResult result =
+        await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
     Compiler compiler = result.compiler;
     var outputUnitForConstant =
         compiler.backend.outputUnitData.outputUnitForConstant;
@@ -46,10 +44,8 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
 
diff --git a/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart b/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
index b83812e..f5e7858 100644
--- a/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
+++ b/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
@@ -3,17 +3,15 @@
 // 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/compiler.dart' as dart2js;
 import 'package:expect/expect.dart';
 
 import '../memory_compiler.dart';
 
 void main() {
-  runTest({bool useKernel}) async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+  runTest() async {
+    CompilationResult result =
+        await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
     dart2js.Compiler compiler = result.compiler;
     var closedWorld = compiler.backendClosedWorldForTesting;
     var elementEnvironment = closedWorld.elementEnvironment;
@@ -36,10 +34,8 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
 
diff --git a/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart b/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
index 2ad4c00..67b8c44 100644
--- a/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
+++ b/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
@@ -5,29 +5,25 @@
 // Test that no parts are emitted when deferred loading isn't used.
 
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
 import '../memory_compiler.dart';
 
 main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     DiagnosticCollector diagnostics = new DiagnosticCollector();
     OutputCollector output = new OutputCollector();
     CompilationResult result = await runCompiler(
         memorySourceFiles: MEMORY_SOURCE_FILES,
         diagnosticHandler: diagnostics,
-        outputProvider: output,
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+        outputProvider: output);
     Expect.isFalse(diagnostics.hasRegularMessages);
     Expect.isFalse(output.hasExtraOutput);
     Expect.isTrue(result.isSuccess);
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency.dart b/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency.dart
new file mode 100644
index 0000000..80026e3
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency.dart
@@ -0,0 +1,13 @@
+// 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 '../libs/type_argument_dependency_lib1.dart';
+import '../libs/type_argument_dependency_lib2.dart' deferred as c;
+
+/*element: main:OutputUnit(main, {})*/
+main() async {
+  await c.loadLibrary();
+  c.createA();
+  doCast(<dynamic>[1, 2]);
+}
diff --git a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
index d69452a..37b9fed 100644
--- a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
+++ b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
@@ -34,10 +34,13 @@
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(
         dataDir, computeAstOutputUnitData, computeKernelOutputUnitData,
+        computeClassDataFromAst: computeAstClassOutputUnitData,
+        computeClassDataFromKernel: computeKernelClassOutputUnitData,
         libDirectory: new Directory.fromUri(Platform.script.resolve('libs')),
         skipForKernel: skipForKernel,
         options: compilerOptions,
-        args: args, setUpFunction: () {
+        args: args,
+        testOmit: true, setUpFunction: () {
       importPrefixes.clear();
     });
   });
@@ -107,6 +110,17 @@
   }
 }
 
+void computeAstClassOutputUnitData(
+    Compiler compiler, ClassEntity _cls, Map<Id, ActualData> actualMap,
+    {bool verbose: false}) {
+  ClassElement cls = _cls;
+  OutputUnitData data = compiler.backend.outputUnitData;
+  String value = outputUnitString(data.outputUnitForEntity(cls));
+
+  _registerValue(new ClassId(cls.name), value, cls, cls.sourcePosition,
+      actualMap, compiler.reporter);
+}
+
 /// OutputData for [member] as a kernel based element.
 ///
 /// At this point the compiler has already been run, so it is holding the
@@ -157,6 +171,25 @@
   }
 }
 
+void computeKernelClassOutputUnitData(
+    Compiler compiler, ClassEntity cls, Map<Id, ActualData> actualMap,
+    {bool verbose: false}) {
+  OutputUnitData data = compiler.backend.outputUnitData;
+  String value = outputUnitString(data.outputUnitForEntity(cls));
+
+  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+  ClassDefinition definition = elementMap.getClassDefinition(cls);
+
+  _registerValue(
+      new ClassId(cls.name),
+      value,
+      cls,
+      computeSourceSpanFromTreeNode(definition.node),
+      actualMap,
+      compiler.reporter);
+}
+
 /// Set [actualMap] to hold a key of [id] with the computed data [value]
 /// corresponding to [object] at location [sourceSpan]. We also perform error
 /// checking to ensure that the same [id] isn't added twice.
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_class_library.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_class_library.dart
index 95f54b4..3e359eb 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/deferred_class_library.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_class_library.dart
@@ -6,6 +6,7 @@
 
 library deferred_class_library;
 
+/*class: MyClass:OutputUnit(1, {lib})*/
 class MyClass {
   /*element: MyClass.:OutputUnit(1, {lib})*/
   const MyClass();
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib3.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib3.dart
index 1cb567c9..3935220 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib3.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib3.dart
@@ -4,6 +4,7 @@
 
 library deferred_constants1_lib3;
 
+/*class: C:OutputUnit(main, {})*/
 class C {
   /*element: C.value:OutputUnit(main, {})*/
   final value;
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_constant2_lib.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant2_lib.dart
index dc59b97..33b5017 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/deferred_constant2_lib.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant2_lib.dart
@@ -4,6 +4,7 @@
 
 library deferred_constants2_lib;
 
+/*class: Constant:OutputUnit(1, {lib})*/
 class Constant {
   /*element: Constant.value:OutputUnit(1, {lib})*/
   final value;
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib1.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib1.dart
index e1c3a03..7587f4e 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib1.dart
@@ -4,5 +4,6 @@
 
 import "deferred_overlapping_lib3.dart";
 
+/*class: C1:OutputUnit(1, {lib1})*/
 /*element: C1.:OutputUnit(1, {lib1})*/
 class C1 extends C3 {}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib2.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib2.dart
index 4d7c620..3e49d22 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib2.dart
@@ -4,5 +4,6 @@
 
 import "deferred_overlapping_lib3.dart";
 
+/*class: C2:OutputUnit(3, {lib2})*/
 /*element: C2.:OutputUnit(3, {lib2})*/
 class C2 extends C3 {}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib3.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib3.dart
index 6804b23..5447ff9 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib3.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib3.dart
@@ -2,5 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/*class: C3:OutputUnit(2, {lib1, lib2})*/
 /*element: C3.:OutputUnit(2, {lib1, lib2})*/
 class C3 {}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_typed_map_lib1.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_typed_map_lib1.dart
index 4529ffb..36d7d4a 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/deferred_typed_map_lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_typed_map_lib1.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/*class: M:OutputUnit(1, {lib})*/
 class M {}
 
 typedef dynamic FF({M b});
@@ -9,8 +10,7 @@
 /*element: table:OutputUnit(1, {lib})*/
 const table =
 /*ast.null*/
-/*kernel.OutputUnit(1, {lib})*/
-/*strong.OutputUnit(1, {lib})*/
+/*!ast.OutputUnit(1, {lib})*/
     const <int, FF>{1: f1, 2: f2};
 
 /*element: f1:OutputUnit(1, {lib})*/
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_typedef_lib1.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_typedef_lib1.dart
index 9344b77..9d6d26a 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/deferred_typedef_lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_typedef_lib1.dart
@@ -4,6 +4,7 @@
 
 library deferred_typedef_lib1;
 
+/*class: C:OutputUnit(1, {lib1})*/
 class C {
   /*element: C.a:OutputUnit(1, {lib1})*/
   final a;
diff --git a/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib1.dart b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib1.dart
index 1fefeae..80c37a0 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib1.dart
@@ -17,6 +17,7 @@
 /*element: C2b:OutputUnit(1, {lib1})*/
 const C2b = /*OutputUnit(1, {lib1})*/ const C(1010);
 
+/*class: D:OutputUnit(main, {})*/
 class D {
   /*element: D.C3:OutputUnit(1, {lib1})*/
   static const C3 = "string2";
diff --git a/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_main.dart b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_main.dart
index a68724a..494a35d 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_main.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_main.dart
@@ -8,6 +8,7 @@
 /*element: c:OutputUnit(main, {})*/
 const c = "string3";
 
+/*class: C:OutputUnit(main, {})*/
 class C {
   /*element: C.p:OutputUnit(main, {})*/
   final p;
diff --git a/tests/compiler/dart2js/deferred_loading/libs/shared_constant_c.dart b/tests/compiler/dart2js/deferred_loading/libs/shared_constant_c.dart
index 370c0e1..b6ce057 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/shared_constant_c.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/shared_constant_c.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/*class: C:OutputUnit(1, {s1, s2})*/
 class C {
   /*element: C.:OutputUnit(1, {s1, s2})*/
   const C();
diff --git a/tests/compiler/dart2js/deferred_loading/libs/type_argument_dependency_lib1.dart b/tests/compiler/dart2js/deferred_loading/libs/type_argument_dependency_lib1.dart
new file mode 100644
index 0000000..37095d3
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/type_argument_dependency_lib1.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.
+
+import 'type_argument_dependency_lib2.dart';
+
+/*element: doCast:OutputUnit(main, {})*/
+doCast(List<dynamic> l) => l.cast<B>().map((x) => 1);
diff --git a/tests/compiler/dart2js/deferred_loading/libs/type_argument_dependency_lib2.dart b/tests/compiler/dart2js/deferred_loading/libs/type_argument_dependency_lib2.dart
new file mode 100644
index 0000000..bf70190
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/type_argument_dependency_lib2.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.
+
+/*ast.class: A:OutputUnit(1, {c})*/
+/*kernel.class: A:OutputUnit(1, {c})*/
+/*strong.class: A:OutputUnit(main, {})*/
+/*omit.class: A:OutputUnit(main, {})*/
+class A {
+  /*element: A.:OutputUnit(1, {c})*/
+  A();
+}
+
+/*class: B:OutputUnit(main, {})*/
+class B extends A {}
+
+/*element: createA:OutputUnit(1, {c})*/
+createA() => new A();
diff --git a/tests/compiler/dart2js/dump_info_test.dart b/tests/compiler/dart2js/dump_info_test.dart
index cf1399b..4d57673 100644
--- a/tests/compiler/dart2js/dump_info_test.dart
+++ b/tests/compiler/dart2js/dump_info_test.dart
@@ -97,11 +97,8 @@
 
 typedef void JsonTaking(Map<String, dynamic> json);
 
-jsonTest(String program, JsonTaking testFn, {bool useKernel}) async {
+jsonTest(String program, JsonTaking testFn) async {
   var options = ['--out=out.js', Flags.dumpInfo];
-  if (!useKernel) {
-    options.add(Flags.useOldFrontend);
-  }
   var result = await runCompiler(
       memorySourceFiles: {'main.dart': program}, options: options);
   var compiler = result.compiler;
@@ -118,14 +115,12 @@
 
 main() {
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
 
-runTests({bool useKernel}) async {
+runTests() async {
   await jsonTest(TEST_BASIC, (map) {
     Expect.isTrue(map['elements'].isNotEmpty);
     Expect.isTrue(map['elements']['function'].isNotEmpty);
@@ -139,7 +134,7 @@
     Expect.isTrue(map['elements']['function'].values.any((fun) {
       return fun['name'] == 'f';
     }));
-  }, useKernel: useKernel);
+  });
 
   await jsonTest(TEST_CLOSURES, (map) {
     var functions = map['elements']['function'].values;
@@ -149,7 +144,7 @@
     Expect.isTrue(functions.any((fn) {
       return fn['name'] == 'foo' && fn['children'].length == 10;
     }));
-  }, useKernel: useKernel);
+  });
 
   await jsonTest(TEST_STATICS, (map) {
     var functions = map['elements']['function'].values;
@@ -160,7 +155,7 @@
     Expect.isTrue(classes.any((cls) {
       return cls['name'] == 'ContainsStatics' && cls['children'].length >= 1;
     }));
-  }, useKernel: useKernel);
+  });
 
   await jsonTest(TEST_INLINED_1, (map) {
     var functions = map['elements']['function'].values;
@@ -171,7 +166,7 @@
     Expect.isTrue(classes.any((cls) {
       return cls['name'] == 'Doubler' && cls['children'].length >= 1;
     }));
-  }, useKernel: useKernel);
+  });
 
   await jsonTest(TEST_INLINED_2, (map) {
     var functions = map['elements']['function'].values;
@@ -187,5 +182,5 @@
     Expect.isTrue(deps.containsKey(fn2['id']));
     Expect.isTrue(deps[main_['id']].any((dep) => dep['id'] == fn1['id']));
     Expect.isTrue(deps[fn1['id']].any((dep) => dep['id'] == fn2['id']));
-  }, useKernel: useKernel);
+  });
 }
diff --git a/tests/compiler/dart2js/end_to_end/command_line_test.dart b/tests/compiler/dart2js/end_to_end/command_line_test.dart
index 75db352..88fb3e8 100644
--- a/tests/compiler/dart2js/end_to_end/command_line_test.dart
+++ b/tests/compiler/dart2js/end_to_end/command_line_test.dart
@@ -10,7 +10,6 @@
 import 'package:expect/expect.dart';
 
 import 'package:compiler/compiler_new.dart' as api;
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/dart2js.dart' as entry;
 import 'package:compiler/src/options.dart' show CompilerOptions;
 
@@ -19,8 +18,6 @@
   asyncTest(() async {
     await test([], exitCode: 1);
     await test(['foo.dart']);
-    await test([Flags.useOldFrontend], exitCode: 1);
-    await test([Flags.useOldFrontend, 'foo.dart']);
   });
 }
 
diff --git a/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart b/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
index 0c4ed18..aaef4ea 100644
--- a/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
+++ b/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
@@ -39,7 +39,7 @@
     }
     void F11<Q extends C3<Q>>(Q q) {}
     void F12<P extends C3<P>>(P p) {}
-  """), compileMode: CompileMode.kernel, options: [Flags.strongMode]);
+  """), options: [Flags.strongMode]);
 
     testToString(FunctionType type, String expectedToString) {
       Expect.equals(expectedToString, type.toString());
diff --git a/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart b/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
index 0357757..3d90b38 100644
--- a/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
+++ b/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
@@ -22,13 +22,10 @@
 
 main() {
   asyncTest(() async {
-    TypeEnvironment env = await TypeEnvironment.create(
-        """
+    TypeEnvironment env = await TypeEnvironment.create("""
       ${createTypedefs(signatures, prefix: 't')}
       ${createMethods(signatures, prefix: 'm')}
-    """,
-        compileMode: CompileMode.kernel,
-        options: [Flags.strongMode]);
+    """, options: [Flags.strongMode]);
 
     for (FunctionTypeData data in signatures) {
       FunctionType functionType = env.getElementType('t${data.name}');
diff --git a/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart b/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart
new file mode 100644
index 0000000..6d2478b
--- /dev/null
+++ b/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart
@@ -0,0 +1,97 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/js_emitter/model.dart';
+import 'package:compiler/src/world.dart';
+import 'package:expect/expect.dart';
+import '../helpers/program_lookup.dart';
+import '../memory_compiler.dart';
+
+const String code = '''
+import 'package:meta/dart2js.dart';
+
+// This needs one-arg instantiation.
+@noInline
+T f1a<T>(T t) => t;
+
+// This needs no instantiation because it is not closurized.
+@noInline
+T f1b<T>(T t1, T t2) => t1;
+
+class Class {
+  // This needs two-arg instantiation.
+  @noInline
+  bool f2a<T, S>(T t, S s) => t == s;
+
+  // This needs no instantiation because it is not closurized.
+  @noInline
+  bool f2b<T, S>(T t, S s1, S s2) => t == s1;
+}
+
+@noInline
+int method1(int i, int Function(int) f) => f(i);
+
+@noInline
+bool method2(int a, int b, bool Function(int, int) f) => f(a, b);
+
+@noInline
+int method3(int a, int b, int c, int Function(int, int, int) f) => f(a, b, c);
+
+main() {
+  // This needs three-arg instantiation.
+  T local1<T, S, U>(T t, S s, U u) => t;
+
+  // This needs no instantiation because but a local function is always
+  // closurized so we assume it does.
+  T local2<T, S, U>(T t, S s, U u1, U u2) => t;
+
+  print(method1(42, f1a));
+  print(f1b(42, 87));
+
+  Class c = new Class();
+  print(method2(0, 1, c.f2a));
+  print(c.f2b(42, 87, 123));
+
+  print(method3(0, 1, 2, local1));
+  print(local2(42, 87, 123, 256));
+}
+''';
+
+main() {
+  asyncTest(() async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': code},
+        options: [Flags.strongMode, Flags.omitImplicitChecks]);
+    Expect.isTrue(result.isSuccess);
+    Compiler compiler = result.compiler;
+    ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+    ProgramLookup programLookup = new ProgramLookup(compiler);
+
+    void checkStubs(ClassEntity element, List<String> expectedStubs) {
+      Class cls = programLookup.getClass(element);
+      List<String> actualStubs = <String>[];
+      if (cls != null) {
+        for (StubMethod stub in cls.callStubs) {
+          actualStubs.add(stub.name.key);
+        }
+      }
+      Expect.setEquals(
+          expectedStubs,
+          actualStubs,
+          "Unexpected stubs for $element:\n "
+          "Expected: $expectedStubs\n Actual: $actualStubs");
+    }
+
+    checkStubs(closedWorld.commonElements.instantiation1Class,
+        [r'call$1', r'$signature']);
+    checkStubs(closedWorld.commonElements.instantiation2Class,
+        [r'call$2', r'$signature']);
+    checkStubs(closedWorld.commonElements.instantiation3Class,
+        [r'call$3', r'call$4', r'$signature']);
+  });
+}
diff --git a/tests/compiler/dart2js/inference/list_tracer_test.dart b/tests/compiler/dart2js/inference/list_tracer_test.dart
index 5e682cc..4e3b241 100644
--- a/tests/compiler/dart2js/inference/list_tracer_test.dart
+++ b/tests/compiler/dart2js/inference/list_tracer_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/types/types.dart' show ContainerTypeMask, TypeMask;
-import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
 
 import 'type_mask_test_helper.dart';
@@ -188,38 +187,33 @@
 }
 
 void main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     // Test literal list.
-    await doTest('[]', nullify: false, useKernel: useKernel);
+    await doTest('[]', nullify: false);
     // Test growable list.
-    await doTest('new List()', nullify: false, useKernel: useKernel);
+    await doTest('new List()', nullify: false);
     // Test fixed list.
-    await doTest('new List(1)', nullify: true, useKernel: useKernel);
+    await doTest('new List(1)', nullify: true);
     // Test List.filled.
-    await doTest('new List.filled(1, 0)', nullify: false, useKernel: useKernel);
+    await doTest('new List.filled(1, 0)', nullify: false);
     // Test List.filled.
-    await doTest('new List.filled(1, null)',
-        nullify: true, useKernel: useKernel);
+    await doTest('new List.filled(1, null)', nullify: true);
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
 
-doTest(String allocation, {bool nullify, bool useKernel}) async {
+doTest(String allocation, {bool nullify}) async {
   String source = generateTest(allocation);
-  var result = await runCompiler(
-      memorySourceFiles: {'main.dart': source},
-      options: useKernel ? [] : [Flags.useOldFrontend]);
+  var result = await runCompiler(memorySourceFiles: {'main.dart': source});
   Expect.isTrue(result.isSuccess);
   var compiler = result.compiler;
   var typesInferrer = compiler.globalInference.typesInferrerInternal;
   var closedWorld = typesInferrer.closedWorld;
-  var commonMasks = closedWorld.commonMasks;
+  var commonMasks = closedWorld.abstractValueDomain;
 
   checkType(String name, type) {
     var element = findMember(closedWorld, name);
diff --git a/tests/compiler/dart2js/inference/load_deferred_library_test.dart b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
index 985453c..78a0ea5 100644
--- a/tests/compiler/dart2js/inference/load_deferred_library_test.dart
+++ b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
@@ -7,10 +7,10 @@
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/common/names.dart';
 import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/elements/elements.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/js_model/js_strategy.dart';
 import 'package:compiler/src/kernel/element_map.dart';
+import 'package:compiler/src/types/abstract_value_domain.dart';
 import 'package:compiler/src/types/types.dart';
 import 'package:compiler/src/world.dart';
 import 'package:expect/expect.dart';
@@ -29,8 +29,6 @@
 
 main() async {
   asyncTest(() async {
-    print('--test Dart 1 --use-old-frontend ---------------------------------');
-    await runTest([Flags.useOldFrontend], trust: false, useOldFrontend: true);
     print('--test Dart 1 ----------------------------------------------------');
     await runTest([], trust: false);
     print('--test Dart 1 --trust-type-annotations ---------------------------');
@@ -42,39 +40,36 @@
   });
 }
 
-runTest(List<String> options,
-    {bool trust: true, bool useOldFrontend: false}) async {
+runTest(List<String> options, {bool trust: true}) async {
   CompilationResult result = await runCompiler(
       memorySourceFiles: {'main.dart': source}, options: options);
   Expect.isTrue(result.isSuccess);
   Compiler compiler = result.compiler;
   ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+  AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
   ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
   LibraryEntity helperLibrary =
       elementEnvironment.lookupLibrary(Uris.dart__js_helper);
   FunctionEntity loadDeferredLibrary = elementEnvironment.lookupLibraryMember(
       helperLibrary, 'loadDeferredLibrary');
   TypeMask typeMask;
-  if (useOldFrontend) {
-    MethodElement method = loadDeferredLibrary;
-    typeMask = compiler.globalInference.results
-        .resultOfParameter(method.parameters.first)
-        .type;
-  } else {
-    JsBackendStrategy backendStrategy = compiler.backendStrategy;
-    KernelToLocalsMap localsMap = backendStrategy.globalLocalsMapForTesting
-        .getLocalsMap(loadDeferredLibrary);
-    MemberDefinition definition =
-        backendStrategy.elementMap.getMemberDefinition(loadDeferredLibrary);
-    ir.Procedure procedure = definition.node;
-    typeMask = compiler.globalInference.results
-        .resultOfParameter(localsMap
-            .getLocalVariable(procedure.function.positionalParameters.first))
-        .type;
-  }
+
+  JsBackendStrategy backendStrategy = compiler.backendStrategy;
+  KernelToLocalsMap localsMap = backendStrategy.globalLocalsMapForTesting
+      .getLocalsMap(loadDeferredLibrary);
+  MemberDefinition definition =
+      backendStrategy.elementMap.getMemberDefinition(loadDeferredLibrary);
+  ir.Procedure procedure = definition.node;
+  typeMask = compiler.globalInference.results
+      .resultOfParameter(localsMap
+          .getLocalVariable(procedure.function.positionalParameters.first))
+      .type;
+
   if (trust) {
-    Expect.equals(closedWorld.commonMasks.stringType.nullable(), typeMask);
+    Expect.equals(
+        abstractValueDomain.includeNull(abstractValueDomain.stringType),
+        typeMask);
   } else {
-    Expect.equals(closedWorld.commonMasks.dynamicType, typeMask);
+    Expect.equals(abstractValueDomain.dynamicType, typeMask);
   }
 }
diff --git a/tests/compiler/dart2js/inference/map_tracer_test.dart b/tests/compiler/dart2js/inference/map_tracer_test.dart
index 33e6b10..c450698 100644
--- a/tests/compiler/dart2js/inference/map_tracer_test.dart
+++ b/tests/compiler/dart2js/inference/map_tracer_test.dart
@@ -3,7 +3,6 @@
 // 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/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/inferrer/type_graph_inferrer.dart';
@@ -207,42 +206,34 @@
 }
 
 void main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     // Test empty literal map
-    await doTest('{}', useKernel: useKernel);
+    await doTest('{}');
     // Test preset map of <String,uint32>
     await doTest('{presetKey : anInt}',
-        keyElementName: "presetKey",
-        valueElementName: "anInt",
-        useKernel: useKernel);
+        keyElementName: "presetKey", valueElementName: "anInt");
     // Test preset map of <Double,uint32>
     await doTest('{aDouble : anInt}',
-        keyElementName: "aDouble",
-        valueElementName: "anInt",
-        useKernel: useKernel);
+        keyElementName: "aDouble", valueElementName: "anInt");
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
 
 doTest(String allocation,
-    {String keyElementName, String valueElementName, bool useKernel}) async {
+    {String keyElementName, String valueElementName}) async {
   String source = generateTest(allocation);
-  var result = await runCompiler(
-      memorySourceFiles: {'main.dart': source},
-      options: useKernel ? [] : [Flags.useOldFrontend]);
+  var result = await runCompiler(memorySourceFiles: {'main.dart': source});
   Expect.isTrue(result.isSuccess);
   Compiler compiler = result.compiler;
   TypeMask keyType, valueType;
   TypeGraphInferrer typesInferrer =
       compiler.globalInference.typesInferrerInternal;
   ClosedWorld closedWorld = typesInferrer.closedWorld;
-  CommonMasks commonMasks = closedWorld.commonMasks;
+  CommonMasks commonMasks = closedWorld.abstractValueDomain;
   TypeMask emptyType = new TypeMask.nonNullEmpty();
   MemberEntity aKey = findMember(closedWorld, 'aKey');
   TypeMask aKeyType = typesInferrer.getTypeOfMember(aKey);
diff --git a/tests/compiler/dart2js/inference/type_combination_test.dart b/tests/compiler/dart2js/inference/type_combination_test.dart
index 8a05664..2d84f97 100644
--- a/tests/compiler/dart2js/inference/type_combination_test.dart
+++ b/tests/compiler/dart2js/inference/type_combination_test.dart
@@ -6,7 +6,6 @@
 import 'package:expect/expect.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';
@@ -741,17 +740,14 @@
 
 void main() {
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
 
-runTests({bool useKernel}) async {
-  CompilationResult result = await runCompiler(
-      memorySourceFiles: {
-        'main.dart': r'''
+runTests() async {
+  CompilationResult result = await runCompiler(memorySourceFiles: {
+    'main.dart': r'''
     import 'dart:collection';
     class AList<E> extends ListBase<E> {}
     main() {
@@ -760,9 +756,7 @@
       print('${const []}${const {}}${(){}}${new AList()}');
     }
     '''
-      },
-      options: useKernel ? [] : [Flags.useOldFrontend],
-      beforeRun: (compiler) => compiler.stopAfterTypeInference = true);
+  }, beforeRun: (compiler) => compiler.stopAfterTypeInference = true);
   Expect.isTrue(result.isSuccess);
   Compiler compiler = result.compiler;
   ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
diff --git a/tests/compiler/dart2js/inference/type_mask2_test.dart b/tests/compiler/dart2js/inference/type_mask2_test.dart
index 2f2362a..3cd3137 100644
--- a/tests/compiler/dart2js/inference/type_mask2_test.dart
+++ b/tests/compiler/dart2js/inference/type_mask2_test.dart
@@ -24,16 +24,14 @@
 }
 
 void main() {
-  runTests(CompileMode compileMode) async {
-    await testUnionTypeMaskFlatten(compileMode);
-    await testStringSubtypes(compileMode);
+  runTests() async {
+    await testUnionTypeMaskFlatten();
+    await testStringSubtypes();
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(CompileMode.memory);
     print('--test from kernel------------------------------------------------');
-    await runTests(CompileMode.kernel);
+    await runTests();
   });
 }
 
@@ -92,7 +90,7 @@
   return union;
 }
 
-Future testUnionTypeMaskFlatten(CompileMode compileMode) async {
+Future testUnionTypeMaskFlatten() async {
   TypeEnvironment env = await TypeEnvironment.create(r"""
       class A {}
       class B {}
@@ -107,7 +105,7 @@
         new D();
         new E();
       }
-      """, compileMode: compileMode);
+      """);
 
   ClosedWorld closedWorld = env.closedWorld;
 
@@ -210,14 +208,12 @@
       containedClasses: [A, B, E]);
 }
 
-Future testStringSubtypes(CompileMode compileMode) async {
-  TypeEnvironment env = await TypeEnvironment.create('',
-      mainSource: r"""
+Future testStringSubtypes() async {
+  TypeEnvironment env = await TypeEnvironment.create('', mainSource: r"""
       main() {
         '' is String;
       }
-      """,
-      compileMode: compileMode);
+      """);
   ClosedWorld closedWorld = env.closedWorld;
 
   ClassEntity Object_ = env.getElement("Object");
diff --git a/tests/compiler/dart2js/inference/type_mask_disjoint_test.dart b/tests/compiler/dart2js/inference/type_mask_disjoint_test.dart
index f9d8e70..b520387 100644
--- a/tests/compiler/dart2js/inference/type_mask_disjoint_test.dart
+++ b/tests/compiler/dart2js/inference/type_mask_disjoint_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.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';
@@ -40,10 +39,9 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': CODE},
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+  runTests() async {
+    CompilationResult result =
+        await runCompiler(memorySourceFiles: {'main.dart': CODE});
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
     ClosedWorld world = compiler.backendClosedWorldForTesting;
@@ -202,9 +200,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/inference/type_mask_test.dart b/tests/compiler/dart2js/inference/type_mask_test.dart
index dd77a78..91b1968 100644
--- a/tests/compiler/dart2js/inference/type_mask_test.dart
+++ b/tests/compiler/dart2js/inference/type_mask_test.dart
@@ -6,7 +6,6 @@
 import 'package:expect/expect.dart';
 import 'package:compiler/src/types/types.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/world.dart';
@@ -23,10 +22,9 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': CODE},
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+  runTests() async {
+    CompilationResult result =
+        await runCompiler(memorySourceFiles: {'main.dart': CODE});
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
     ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
@@ -138,9 +136,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/inference/union_type_test.dart b/tests/compiler/dart2js/inference/union_type_test.dart
index 6b0bcdf..1890622 100644
--- a/tests/compiler/dart2js/inference/union_type_test.dart
+++ b/tests/compiler/dart2js/inference/union_type_test.dart
@@ -9,7 +9,7 @@
 import '../type_test_helper.dart';
 
 main() {
-  runTest(CompileMode compileMode) async {
+  runTest() async {
     TypeEnvironment env = await TypeEnvironment.create(r"""
       class A {}
       class B {}
@@ -18,7 +18,7 @@
         new A();
         new B();
       }
-      """, compileMode: compileMode);
+      """);
     ClosedWorld world = env.closedWorld;
     FlatTypeMask mask1 = new FlatTypeMask.exact(env.getClass('A'));
     FlatTypeMask mask2 = new FlatTypeMask.exact(env.getClass('B'));
@@ -28,9 +28,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(CompileMode.memory);
     print('--test from kernel------------------------------------------------');
-    await runTest(CompileMode.kernel);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/inlining/meta_annotations2_test.dart b/tests/compiler/dart2js/inlining/meta_annotations2_test.dart
index 64769bc..ba54022 100644
--- a/tests/compiler/dart2js/inlining/meta_annotations2_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations2_test.dart
@@ -7,7 +7,6 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/compiler_new.dart';
-import 'package:compiler/src/commandline_options.dart';
 import '../memory_compiler.dart';
 
 const MEMORY_SOURCE_FILES = const {
@@ -39,12 +38,10 @@
 };
 
 void main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     OutputCollector collector = new OutputCollector();
     await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        outputProvider: collector,
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
     // Simply check that the constants of the small functions are still in the
     // output, and that we don't see the result of constant folding.
     String jsOutput = collector.getOutput('', OutputType.js);
@@ -68,9 +65,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/inlining/meta_annotations3_test.dart b/tests/compiler/dart2js/inlining/meta_annotations3_test.dart
index 47109f3..e34c263 100644
--- a/tests/compiler/dart2js/inlining/meta_annotations3_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations3_test.dart
@@ -7,7 +7,6 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/compiler_new.dart';
-import 'package:compiler/src/commandline_options.dart';
 import '../memory_compiler.dart';
 
 const MEMORY_SOURCE_FILES = const {
@@ -51,12 +50,10 @@
 };
 
 void main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     OutputCollector collector = new OutputCollector();
     await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        outputProvider: collector,
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
     String jsOutput = collector.getOutput('', OutputType.js);
 
     void has(String text) {
@@ -83,9 +80,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/inlining/meta_annotations_test.dart b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
index 256c28c..e8aa7c3 100644
--- a/tests/compiler/dart2js/inlining/meta_annotations_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:expect/expect.dart';
 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';
@@ -34,10 +33,9 @@
 };
 
 main() {
-  runTests({bool useKernel}) async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+  runTests() async {
+    CompilationResult result =
+        await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
     Compiler compiler = result.compiler;
     ClosedWorld closedWorld =
         compiler.resolutionWorldBuilder.closedWorldForTesting;
@@ -72,9 +70,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/instantiated_classes_test.dart b/tests/compiler/dart2js/instantiated_classes_test.dart
index 11a276a..4c1aab1 100644
--- a/tests/compiler/dart2js/instantiated_classes_test.dart
+++ b/tests/compiler/dart2js/instantiated_classes_test.dart
@@ -12,7 +12,7 @@
 import 'type_test_helper.dart';
 
 void main() {
-  Future runTests({bool useKernel}) async {
+  Future runTests() async {
     Future test(String source, List<String> directlyInstantiatedClasses,
         [List<String> newClasses = const <String>["Class"]]) async {
       StringBuffer mainSource = new StringBuffer();
@@ -22,8 +22,7 @@
       }
       mainSource.write('}');
       dynamic env = await TypeEnvironment.create(source,
-          mainSource: mainSource.toString(),
-          compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+          mainSource: mainSource.toString());
       LibraryEntity mainLibrary =
           env.compiler.frontendStrategy.elementEnvironment.mainLibrary;
       Iterable<ClassEntity> expectedClasses =
@@ -70,24 +69,14 @@
                   class Class extends B with A {}""", ["Class", "A"],
         ["Class", "A"]);
 
-    if (!useKernel) {
-      // TODO(johnniwinther): Avoid registration of `Class` as instantiated.
-      await test("""class A {}
-                    class Class implements A {
-                      factory Class() = A;
-                    }""", ["Class", "A"], ["Class"]);
-    } else {
-      await test("""class A {}
-                    class Class implements A {
-                      factory Class() = A;
-                    }""", ["A"], ["Class"]);
-    }
+    await test("""class A {}
+                  class Class implements A {
+                    factory Class() = A;
+                  }""", ["A"], ["Class"]);
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/js/js_constant_test.dart b/tests/compiler/dart2js/js/js_constant_test.dart
index 22eeedf..f373884 100644
--- a/tests/compiler/dart2js/js/js_constant_test.dart
+++ b/tests/compiler/dart2js/js/js_constant_test.dart
@@ -3,7 +3,6 @@
 // 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/elements/entities.dart';
 import 'package:expect/expect.dart';
 import '../compiler_helper.dart';
@@ -19,16 +18,14 @@
 """;
 
 main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     check(String test) async {
       // Pretend this is a dart2js_native test to allow use of 'native' keyword
       // and import of private libraries.
       String main = 'sdk/tests/compiler/dart2js_native/main.dart';
       Uri entryPoint = Uri.parse('memory:$main');
       var result = await runCompiler(
-          entryPoint: entryPoint,
-          memorySourceFiles: {main: test},
-          options: useKernel ? [] : [Flags.useOldFrontend]);
+          entryPoint: entryPoint, memorySourceFiles: {main: test});
       Expect.isTrue(result.isSuccess);
       var compiler = result.compiler;
       var closedWorld = compiler.backendClosedWorldForTesting;
@@ -44,9 +41,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/js/js_spec_optimization_test.dart b/tests/compiler/dart2js/js/js_spec_optimization_test.dart
index 3608519..8b97114 100644
--- a/tests/compiler/dart2js/js/js_spec_optimization_test.dart
+++ b/tests/compiler/dart2js/js/js_spec_optimization_test.dart
@@ -3,7 +3,6 @@
 // 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/elements/entities.dart';
 import 'package:expect/expect.dart';
 import '../compiler_helper.dart';
@@ -87,15 +86,13 @@
 """;
 
 main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     check(String test) async {
       var checker = checkerForAbsentPresent(test);
       String main = 'sdk/tests/compiler/dart2js_native/main.dart';
       Uri entryPoint = Uri.parse('memory:$main');
       var result = await runCompiler(
-          entryPoint: entryPoint,
-          memorySourceFiles: {main: test},
-          options: useKernel ? [] : [Flags.useOldFrontend]);
+          entryPoint: entryPoint, memorySourceFiles: {main: test});
       Expect.isTrue(result.isSuccess);
       var compiler = result.compiler;
       var closedWorld = compiler.backendClosedWorldForTesting;
@@ -115,9 +112,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/jsinterop/declaration_test.dart b/tests/compiler/dart2js/jsinterop/declaration_test.dart
index 31ad8d3..a53ae1a 100644
--- a/tests/compiler/dart2js/jsinterop/declaration_test.dart
+++ b/tests/compiler/dart2js/jsinterop/declaration_test.dart
@@ -439,22 +439,16 @@
 runTest(Test test) async {
   print('==${test.name}======================================================');
   print(test.source);
-  await runTestInternal(test, useKernel: false);
   if (!test.skipForKernel) {
-    await runTestInternal(test, useKernel: true);
+    await runTestInternal(test);
   }
 }
 
-runTestInternal(Test test, {bool useKernel}) async {
+runTestInternal(Test test) async {
   DiagnosticCollector collector = new DiagnosticCollector();
   List<String> options = <String>[];
-  if (useKernel) {
-    // TODO(redemption): Enable inlining.
-    options.add(Flags.disableInlining);
-  } else {
-    options.add(Flags.useOldFrontend);
-  }
-  print('--useKernel=${useKernel}--------------------------------------------');
+  // TODO(redemption): Enable inlining.
+  options.add(Flags.disableInlining);
   await runCompiler(
       diagnosticHandler: collector,
       options: options,
diff --git a/tests/compiler/dart2js/jsinterop/interop_anonymous_unreachable_test.dart b/tests/compiler/dart2js/jsinterop/interop_anonymous_unreachable_test.dart
index 97b27a6..b1084d2 100644
--- a/tests/compiler/dart2js/jsinterop/interop_anonymous_unreachable_test.dart
+++ b/tests/compiler/dart2js/jsinterop/interop_anonymous_unreachable_test.dart
@@ -8,7 +8,7 @@
 import 'package:expect/expect.dart';
 import '../compiler_helper.dart';
 
-testUnreachableCrash({bool useKernel}) async {
+testUnreachableCrash() async {
   print("-- unreachable code doesn't crash the compiler --");
   // This test is a regression for Issue #24974
   String generated = await compile("""
@@ -19,13 +19,13 @@
           external factory UniqueLongNameForTesting_A();
         }
         main() {}
-    """, returnAll: true, useKernel: useKernel);
+    """, returnAll: true);
 
   // the code should not be included in the output either.
   Expect.isFalse(generated.contains("UniqueLongNameForTesting_A"));
 }
 
-testTreeShakingJsInteropTypes({bool useKernel}) async {
+testTreeShakingJsInteropTypes() async {
   print('-- tree-shaking interop types --');
   String program = """
         import 'package:js/js.dart';
@@ -71,8 +71,7 @@
     """;
 
   print(' - no tree-shaking by default -');
-  String generated1 =
-      await compile(program, returnAll: true, useKernel: useKernel);
+  String generated1 = await compile(program, returnAll: true);
   Expect.isTrue(generated1.contains("UniqueLongNameForTesting_A"));
   Expect.isTrue(generated1.contains("UniqueLongNameForTesting_D"));
 
@@ -82,9 +81,7 @@
 
   print(' - tree-shake when using flag -');
   String generated2 = await compile(program,
-      trustJSInteropTypeAnnotations: true,
-      returnAll: true,
-      useKernel: useKernel);
+      trustJSInteropTypeAnnotations: true, returnAll: true);
   Expect.isTrue(generated2.contains("UniqueLongNameForTesting_A"));
   Expect.isTrue(generated2.contains("UniqueLongNameForTesting_D"));
 
@@ -93,7 +90,7 @@
   Expect.isFalse(generated2.contains("UniqueLongNameForTesting_E"));
 }
 
-testTreeShakingNativeTypes({bool useKernel}) async {
+testTreeShakingNativeTypes() async {
   print('-- tree-shaking other native types --');
 
   String program = """
@@ -116,8 +113,7 @@
     """;
 
   print(' - allocation effect of dynamic excludes native types -');
-  String generated1 =
-      await compile(program, returnAll: true, useKernel: useKernel);
+  String generated1 = await compile(program, returnAll: true);
   Expect.isTrue(generated1.contains("UniqueLongNameForTesting_A"));
   // any js-interop type could be allocated by `get x`
   Expect.isTrue(generated1.contains("UniqueLongNameForTesting_B"));
@@ -127,9 +123,7 @@
   print(' - allocation effect of dynamic excludes native types [flag] -');
   // Trusting types doesn't make a difference.
   String generated2 = await compile(program,
-      trustJSInteropTypeAnnotations: true,
-      returnAll: true,
-      useKernel: useKernel);
+      trustJSInteropTypeAnnotations: true, returnAll: true);
   Expect.isTrue(generated2.contains("UniqueLongNameForTesting_A"));
   Expect.isTrue(generated2.contains("UniqueLongNameForTesting_B"));
   Expect.isFalse(generated2.contains("HTMLAudioElement"));
@@ -149,8 +143,7 @@
         }
     """;
 
-  String generated3 =
-      await compile(program2, returnAll: true, useKernel: useKernel);
+  String generated3 = await compile(program2, returnAll: true);
   Expect.isTrue(generated3.contains("UniqueLongNameForTesting_A"));
   Expect.isTrue(generated3.contains("HTMLAudioElement"));
 
@@ -168,7 +161,7 @@
         }
     """;
 
-  generated3 = await compile(program2, returnAll: true, useKernel: useKernel);
+  generated3 = await compile(program2, returnAll: true);
   Expect.isTrue(generated3.contains("UniqueLongNameForTesting_A"));
   // This extra check is to make sure that we don't include HTMLAudioElement
   // just because of the is-check. It is optimized away in this case because
@@ -177,16 +170,14 @@
 }
 
 main() {
-  runTests({bool useKernel}) async {
-    await testUnreachableCrash(useKernel: useKernel);
-    await testTreeShakingJsInteropTypes(useKernel: useKernel);
-    await testTreeShakingNativeTypes(useKernel: useKernel);
+  runTests() async {
+    await testUnreachableCrash();
+    await testTreeShakingJsInteropTypes();
+    await testTreeShakingNativeTypes();
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/jsinterop/world_test.dart b/tests/compiler/dart2js/jsinterop/world_test.dart
index 94e990a..a691e29 100644
--- a/tests/compiler/dart2js/jsinterop/world_test.dart
+++ b/tests/compiler/dart2js/jsinterop/world_test.dart
@@ -7,7 +7,6 @@
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/common_elements.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart' show ClassEntity;
 import 'package:compiler/src/elements/names.dart';
@@ -18,8 +17,6 @@
 
 void main() {
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await testClasses([Flags.useOldFrontend]);
     print('--test from kernel------------------------------------------------');
     await testClasses([]);
     print('--test from kernel (strong mode)----------------------------------');
diff --git a/tests/compiler/dart2js/mirrors/array_tracing_mirror_test.dart b/tests/compiler/dart2js/mirrors/array_tracing_mirror_test.dart
deleted file mode 100644
index bb819cb..0000000
--- a/tests/compiler/dart2js/mirrors/array_tracing_mirror_test.dart
+++ /dev/null
@@ -1,44 +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.
-
-// Make sure that limiting mirrors through @MirrorsUsed does not
-// affect optimizations done on arrays.
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import '../memory_compiler.dart';
-
-const MEMORY_SOURCE_FILES = const {
-  'main.dart': '''
-
-@MirrorsUsed(targets: 'main')
-import 'dart:mirrors';
-class A {
-  var field;
-}
-
-main() {
-  var a = new A();
-  var mirror = reflect(a);
-  var array = [42, 42];
-  a.field = array;
-  var field = mirror.getField(#field);
-  field.invoke(#clear, []);
-  return array.length;
-}
-''',
-};
-
-main() {
-  asyncTest(() async {
-    var result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        options: [Flags.useOldFrontend]);
-    var compiler = result.compiler;
-    var element = compiler.frontendStrategy.elementEnvironment.mainFunction;
-    var code = compiler.backend.getGeneratedCode(element);
-    Expect.isTrue(code.contains('return 2'), "Unexpected code:\n$code");
-  });
-}
diff --git a/tests/compiler/dart2js/mirrors/data/mirrors_helper.dart b/tests/compiler/dart2js/mirrors/data/mirrors_helper.dart
deleted file mode 100644
index b8de0ac..0000000
--- a/tests/compiler/dart2js/mirrors/data/mirrors_helper.dart
+++ /dev/null
@@ -1,77 +0,0 @@
-// 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.
-
-/**
- * This file is read by 'mirrors_test.dart'.
- */
-
-library mirrors_helper;
-
-typedef E Func<E, F extends Foo>(F f);
-
-main() {}
-
-/// Singleline doc comment.
-@Metadata(null)
-// Singleline comment 1.
-// Singleline comment 2.
-@Metadata(true)
-@Metadata(false)
-@Metadata(0)
-@Metadata(1.5)
-@Metadata("Foo")
-@Metadata(const ["Foo"])
-@Metadata(const {'foo': "Foo"})
-@metadata
-/** Multiline doc comment. */
-/* Multiline comment. */ class Foo {
-  m(@metadata a) {}
-}
-
-abstract class Bar<E> {}
-
-class Baz<E, F extends Foo> implements Bar<E> {
-  Baz();
-  const Baz.named();
-  factory Baz.factory() => new Baz<E, F>();
-
-  static method1(e) {}
-  void method2(E e, [F f = null]) {}
-  Baz<E, F> method3(E func1(F f), Func<E, F> func2) => null;
-
-  bool operator ==(Object other) => false;
-  int operator -() => 0;
-  operator$foo() {}
-}
-
-class Boz extends Foo {
-  var field1;
-  int _field2;
-  final String field3 = "field3";
-
-  int get field2 => _field2;
-  void set field2(int value) {
-    _field2 = value;
-  }
-}
-
-// ignore: UNUSED_ELEMENT
-class _PrivateClass {
-  var _privateField;
-  // ignore: UNUSED_ELEMENT
-  get _privateGetter => _privateField;
-  // ignore: UNUSED_ELEMENT
-  void set _privateSetter(value) => _privateField = value;
-  // ignore: UNUSED_ELEMENT
-  void _privateMethod() {}
-  _PrivateClass._privateConstructor();
-  factory _PrivateClass._privateFactoryConstructor() => null;
-}
-
-const metadata = const Metadata(null);
-
-class Metadata {
-  final data;
-  const Metadata(this.data);
-}
diff --git a/tests/compiler/dart2js/mirrors/deferred_mirrors_test.dart b/tests/compiler/dart2js/mirrors/deferred_mirrors_test.dart
deleted file mode 100644
index bfff8f1..0000000
--- a/tests/compiler/dart2js/mirrors/deferred_mirrors_test.dart
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test of the graph segmentation algorithm used by deferred loading
-// to determine which elements can be deferred and which libraries
-// much be included in the initial download (loaded eagerly).
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import '../memory_compiler.dart';
-
-Future runTest(String mainScript, test) async {
-  CompilationResult result = await runCompiler(
-      entryPoint: Uri.parse(mainScript),
-      memorySourceFiles: MEMORY_SOURCE_FILES,
-      options: [Flags.useOldFrontend]);
-  test(result.compiler);
-}
-
-lookupLibrary(compiler, name) {
-  return compiler.libraryLoader.lookupLibrary(Uri.parse(name));
-}
-
-void main() {
-  asyncTest(runTests);
-}
-
-runTests() async {
-  await runTest('memory:main.dart', (compiler) {
-    var main = compiler.frontendStrategy.elementEnvironment.mainFunction;
-    Expect.isNotNull(main, "Could not find 'main'");
-    var outputUnitForEntity =
-        compiler.backend.outputUnitData.outputUnitForEntity;
-
-    var lib1 = lookupLibrary(compiler, "memory:lib1.dart");
-    var lib2 = lookupLibrary(compiler, "memory:lib2.dart");
-    var mathLib = lookupLibrary(compiler, "dart:math");
-    var sin = mathLib.find('sin');
-    var foo1 = lib1.find("foo1");
-    var foo2 = lib2.find("foo2");
-    var field2 = lib2.find("field2");
-
-    Expect.notEquals(outputUnitForEntity(main), outputUnitForEntity(foo1));
-    Expect.equals(outputUnitForEntity(main), outputUnitForEntity(sin));
-    Expect.equals(outputUnitForEntity(foo2), outputUnitForEntity(field2));
-  });
-  await runTest('memory:main2.dart', (compiler) {
-    // Just check that the compile runs.
-    // This is a regression test.
-    Expect.isTrue(true);
-  });
-  await runTest('memory:main3.dart', (compiler) {
-    var main = compiler.frontendStrategy.elementEnvironment.mainFunction;
-    Expect.isNotNull(main, "Could not find 'main'");
-    var outputUnitForEntity =
-        compiler.backend.outputUnitData.outputUnitForEntity;
-
-    Expect.isFalse(compiler.backend.mirrorsData.hasInsufficientMirrorsUsed);
-    var mainLib = lookupLibrary(compiler, "memory:main3.dart");
-    var lib3 = lookupLibrary(compiler, "memory:lib3.dart");
-    var C = mainLib.find("C");
-    var foo = lib3.find("foo");
-
-    Expect.notEquals(outputUnitForEntity(main), outputUnitForEntity(foo));
-    Expect.equals(outputUnitForEntity(main), outputUnitForEntity(C));
-  });
-  await runTest('memory:main4.dart', (compiler) {
-    var main = compiler.frontendStrategy.elementEnvironment.mainFunction;
-    Expect.isNotNull(main, "Could not find 'main'");
-    var outputUnitForEntity =
-        compiler.backend.outputUnitData.outputUnitForEntity;
-
-    lookupLibrary(compiler, "memory:main4.dart");
-    lookupLibrary(compiler, "memory:lib4.dart");
-    var lib5 = lookupLibrary(compiler, "memory:lib5.dart");
-    var lib6 = lookupLibrary(compiler, "memory:lib6.dart");
-    var foo5 = lib5.find("foo");
-    var foo6 = lib6.find("foo");
-
-    Expect.notEquals(outputUnitForEntity(main), outputUnitForEntity(foo5));
-    Expect.equals(outputUnitForEntity(foo5), outputUnitForEntity(foo6));
-  });
-}
-
-// "lib1.dart" uses mirrors without a MirrorsUsed annotation, so everything
-// should be put in the "lib1" output unit.
-const Map MEMORY_SOURCE_FILES = const {
-  "main.dart": """
-import "dart:math";
-
-import 'lib1.dart' deferred as lib1;
-import 'lib2.dart' deferred as lib2;
-
-void main() {
-  lib1.loadLibrary().then((_) {
-    lib1.foo1();
-  });
-  lib2.loadLibrary().then((_) {
-    lib2.foo2();
-  });
-}
-""",
-  "lib1.dart": """
-library lib1;
-import "dart:mirrors";
-
-const field1 = 42;
-
-void foo1() {
-  var mirror = reflect(field1);
-  mirror.invoke(null, null);
-}
-""",
-  "lib2.dart": """
-library lib2;
-@MirrorsUsed(targets: "field2") import "dart:mirrors";
-
-const field2 = 42;
-
-void foo2() {
-  var mirror = reflect(field2);
-  mirror.invoke(null, null);
-}
-""",
-// The elements C and f are named as targets, but there is no actual use of
-// mirrors.
-  "main2.dart": """
-import "lib.dart" deferred as lib;
-
-@MirrorsUsed(targets: const ["C", "f"])
-import "dart:mirrors";
-
-class C {}
-
-var f = 3;
-
-void main() {
-
-}
-""",
-  "lib.dart": """ """,
-// Lib3 has a MirrorsUsed annotation with a library.
-// Check that that is handled correctly.
-  "main3.dart": """
-library main3;
-
-import "lib3.dart" deferred as lib;
-
-class C {}
-
-class D {}
-
-f() {}
-
-void main() {
-  lib.loadLibrary().then((_) {
-    lib.foo();
-  });
-}
-""",
-  "lib3.dart": """
-@MirrorsUsed(targets: const ["main3.C"])
-import "dart:mirrors";
-
-foo() {
-  currentMirrorSystem().findLibrary(#main3);
-}
-""",
-// Check that exports and imports are handled correctly with mirrors.
-  "main4.dart": """
-library main3;
-
-@MirrorsUsed(targets: const ["lib5.foo","lib6.foo"])
-import "dart:mirrors";
-
-import "lib4.dart" deferred as lib;
-
-void main() {
-  lib.loadLibrary().then((_) {
-    currentMirrorSystem().findLibrary(#lib5);
-  });
-}
-""",
-  "lib4.dart": """
-import "lib5.dart";
-export "lib6.dart";
-
-""",
-  "lib5.dart": """
-library lib5;
-
-foo() {}
-""",
-  "lib6.dart": """
-library lib6;
-
-foo() {}
-""",
-};
diff --git a/tests/compiler/dart2js/mirrors/import_mirrors_test.dart b/tests/compiler/dart2js/mirrors/import_mirrors_test.dart
deleted file mode 100644
index 5a2017f..0000000
--- a/tests/compiler/dart2js/mirrors/import_mirrors_test.dart
+++ /dev/null
@@ -1,376 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that the compiler emits a warning on import of 'dart:mirrors' unless
-// the flag --enable-experimental-mirrors is used.
-
-library dart2js.test.import_mirrors;
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/diagnostics/messages.dart'
-    show MessageKind, MessageTemplate;
-import '../memory_compiler.dart';
-
-const DIRECT_IMPORT = const {
-  '/main.dart': '''
-import 'dart:mirrors';
-
-main() {}
-''',
-  'paths': "main.dart => dart:mirrors",
-};
-
-const INDIRECT_IMPORT1 = const {
-  '/main.dart': '''
-import 'first.dart';
-
-main() {}
-''',
-  '/first.dart': '''
-import 'dart:mirrors';
-''',
-  'paths': "first.dart => dart:mirrors",
-  'verbosePaths': "main.dart => first.dart => dart:mirrors",
-};
-
-const INDIRECT_IMPORT2 = const {
-  '/main.dart': '''
-import 'first.dart';
-
-main() {}
-''',
-  '/first.dart': '''
-import 'second.dart';
-''',
-  '/second.dart': '''
-import 'dart:mirrors';
-''',
-  'paths': "second.dart => dart:mirrors",
-  'verbosePaths': "main.dart => first.dart => second.dart => dart:mirrors",
-};
-
-const INDIRECT_PACKAGE_IMPORT1 = const {
-  '/main.dart': '''
-import 'first.dart';
-
-main() {}
-''',
-  '/first.dart': '''
-import 'package:second/second.dart';
-''',
-  '/pkg/second/second.dart': '''
-import 'dart:mirrors';
-''',
-  'paths': "first.dart => package:second => dart:mirrors",
-  'verbosePaths':
-      "main.dart => first.dart => package:second/second.dart => dart:mirrors",
-};
-
-const INDIRECT_PACKAGE_IMPORT2 = const {
-  '/main.dart': '''
-import 'first.dart';
-
-main() {}
-''',
-  '/first.dart': '''
-import 'package:packagename/second.dart';
-''',
-  '/pkg/packagename/second.dart': '''
-import 'dart:mirrors';
-''',
-  'paths': "first.dart => package:packagename => dart:mirrors",
-  'verbosePaths': "main.dart => first.dart => package:packagename/second.dart "
-      "=> dart:mirrors",
-};
-
-const INDIRECT_PACKAGE_IMPORT3 = const {
-  '/main.dart': '''
-import 'first.dart';
-
-main() {}
-''',
-  '/first.dart': '''
-import 'package:package1/second.dart';
-''',
-  '/pkg/package1/second.dart': '''
-import 'package:package2/third.dart';
-''',
-  '/pkg/package2/third.dart': '''
-import 'dart:mirrors';
-''',
-  'paths': "first.dart => package:package1 => package:package2 => dart:mirrors",
-  'verbosePaths': "main.dart => first.dart => package:package1/second.dart "
-      "=> package:package2/third.dart => dart:mirrors",
-};
-
-const INDIRECT_PACKAGE_IMPORT4 = const {
-  '/main.dart': '''
-import 'first.dart';
-
-main() {}
-''',
-  '/first.dart': '''
-import 'package:package1/second.dart';
-''',
-  '/pkg/package1/second.dart': '''
-import 'sub/third.dart';
-''',
-  '/pkg/package1/sub/third.dart': '''
-import 'package:package2/fourth.dart';
-''',
-  '/pkg/package2/fourth.dart': '''
-import 'lib/src/fifth.dart';
-''',
-  '/pkg/package2/lib/src/fifth.dart': '''
-import 'dart:mirrors';
-''',
-  'paths': "first.dart => package:package1 => package:package2 => dart:mirrors",
-  'verbosePaths': "main.dart => first.dart => package:package1/second.dart "
-      "=> package:package1/sub/third.dart => package:package2/fourth.dart "
-      "=> package:package2/lib/src/fifth.dart => dart:mirrors",
-};
-
-const DUAL_DIRECT_IMPORT = const {
-  '/main.dart': '''
-import 'dart:mirrors';
-import 'dart:mirrors';
-
-main() {}
-''',
-  'paths': "main.dart => dart:mirrors",
-};
-
-const DUAL_INDIRECT_IMPORT1 = const {
-  '/main.dart': '''
-import 'dart:mirrors';
-import 'first.dart';
-
-main() {}
-''',
-  '/first.dart': '''
-import 'dart:mirrors';
-''',
-  'paths': const ["main.dart => dart:mirrors", "first.dart => dart:mirrors"],
-  'verbosePaths': const [
-    "main.dart => dart:mirrors",
-    "main.dart => first.dart => dart:mirrors"
-  ],
-};
-
-const DUAL_INDIRECT_IMPORT2 = const {
-  '/main.dart': '''
-import 'first.dart';
-import 'second.dart';
-
-main() {}
-''',
-  '/first.dart': '''
-import 'dart:mirrors';
-''',
-  '/second.dart': '''
-import 'dart:mirrors';
-''',
-  'paths': const ["first.dart => dart:mirrors", "second.dart => dart:mirrors"],
-  'verbosePaths': const [
-    "main.dart => first.dart => dart:mirrors",
-    "main.dart => second.dart => dart:mirrors"
-  ],
-};
-
-const DUAL_INDIRECT_IMPORT3 = const {
-  '/main.dart': '''
-import 'first.dart';
-import 'second.dart';
-
-main() {}
-''',
-  '/first.dart': '''
-import 'third.dart';
-''',
-  '/second.dart': '''
-import 'third.dart';
-''',
-  '/third.dart': '''
-import 'dart:mirrors';
-''',
-  'paths': "third.dart => dart:mirrors",
-  'verbosePaths': const [
-    "main.dart => first.dart => third.dart => dart:mirrors",
-    "main.dart => second.dart => third.dart => dart:mirrors"
-  ],
-};
-
-const DUAL_INDIRECT_PACKAGE_IMPORT1 = const {
-  '/main.dart': '''
-import 'package:package1/second.dart';
-import 'first.dart';
-
-main() {}
-''',
-  '/first.dart': '''
-import 'package:package2/third.dart';
-''',
-  '/pkg/package1/second.dart': '''
-import 'dart:mirrors';
-''',
-  '/pkg/package2/third.dart': '''
-import 'dart:mirrors';
-''',
-  'paths': const [
-    "main.dart => package:package1 => dart:mirrors",
-    "first.dart => package:package2 => dart:mirrors"
-  ],
-  'verbosePaths': const [
-    "main.dart => package:package1/second.dart => dart:mirrors",
-    "main.dart => first.dart => package:package2/third.dart => dart:mirrors"
-  ]
-};
-
-const DIRECT_EXPORT = const {
-  '/main.dart': '''
-export 'dart:mirrors';
-
-main() {}
-''',
-  'paths': "main.dart => dart:mirrors",
-};
-
-const INDIRECT_EXPORT1 = const {
-  '/main.dart': '''
-import 'first.dart';
-
-main() {}
-''',
-  '/first.dart': '''
-export 'dart:mirrors';
-''',
-  'paths': "first.dart => dart:mirrors",
-  'verbosePaths': "main.dart => first.dart => dart:mirrors",
-};
-
-const INDIRECT_EXPORT2 = const {
-  '/main.dart': '''
-import 'first.dart';
-
-main() {}
-''',
-  '/first.dart': '''
-import 'second.dart';
-''',
-  '/second.dart': '''
-export 'dart:mirrors';
-''',
-  'paths': "second.dart => dart:mirrors",
-  'verbosePaths': "main.dart => first.dart => second.dart => dart:mirrors",
-};
-
-const INDIRECT_PACKAGE_EXPORT1 = const {
-  '/main.dart': '''
-import 'first.dart';
-
-main() {}
-''',
-  '/first.dart': '''
-import 'package:packagename/second.dart';
-''',
-  '/pkg/packagename/second.dart': '''
-export 'dart:mirrors';
-''',
-  'paths': "first.dart => package:packagename => dart:mirrors",
-  'verbosePaths': "main.dart => first.dart => package:packagename/second.dart "
-      "=> dart:mirrors",
-};
-
-const INDIRECT_PACKAGE_EXPORT2 = const {
-  '/main.dart': '''
-import 'first.dart';
-
-main() {}
-''',
-  '/first.dart': '''
-export 'package:packagename/second.dart';
-''',
-  '/pkg/packagename/second.dart': '''
-import 'dart:mirrors';
-''',
-  'paths': "first.dart => package:packagename => dart:mirrors",
-  'verbosePaths': "main.dart => first.dart => package:packagename/second.dart "
-      "=> dart:mirrors",
-};
-
-Future test(Map sourceFiles,
-    {expectedPaths,
-    bool verbose: false,
-    bool enableExperimentalMirrors: false}) async {
-  if (expectedPaths is! List) {
-    expectedPaths = [expectedPaths];
-  }
-  var collector = new DiagnosticCollector();
-  var options = [Flags.useOldFrontend];
-  if (verbose) {
-    options.add('--verbose');
-  }
-  if (enableExperimentalMirrors) {
-    options.add('--enable-experimental-mirrors');
-  }
-  await runCompiler(
-      entryPoint: Uri.parse('memory:/main.dart'),
-      memorySourceFiles: sourceFiles,
-      diagnosticHandler: collector,
-      packageRoot: Uri.parse('memory:/pkg/'),
-      options: options);
-  Expect.equals(0, collector.errors.length, 'Errors: ${collector.errors}');
-  if (enableExperimentalMirrors) {
-    Expect.equals(
-        0, collector.warnings.length, 'Warnings: ${collector.errors}');
-  } else {
-    Expect.equals(
-        1, collector.warnings.length, 'Warnings: ${collector.errors}');
-    Expect.equals(MessageKind.IMPORT_EXPERIMENTAL_MIRRORS,
-        collector.warnings.first.message.kind);
-    Expect.equals(
-        expectedPaths.join(MessageTemplate.IMPORT_EXPERIMENTAL_MIRRORS_PADDING),
-        collector.warnings.first.message.arguments['importChain']);
-  }
-}
-
-Future checkPaths(Map sourceData) {
-  Map sourceFiles = sourceData;
-  var expectedPaths = sourceData['paths'];
-  var expectedVerbosePaths = sourceData['verbosePaths'];
-  if (expectedVerbosePaths == null) {
-    expectedVerbosePaths = expectedPaths;
-  }
-  return test(sourceFiles, expectedPaths: expectedPaths).then((_) {
-    return test(sourceFiles,
-        expectedPaths: expectedVerbosePaths, verbose: true);
-  }).then((_) {
-    return test(sourceFiles, enableExperimentalMirrors: true);
-  });
-}
-
-void main() {
-  asyncTest(() => Future.forEach([
-        DIRECT_IMPORT,
-        INDIRECT_IMPORT1,
-        INDIRECT_IMPORT2,
-        INDIRECT_PACKAGE_IMPORT1,
-        INDIRECT_PACKAGE_IMPORT2,
-        INDIRECT_PACKAGE_IMPORT3,
-        INDIRECT_PACKAGE_IMPORT4,
-        DUAL_DIRECT_IMPORT,
-        DUAL_INDIRECT_IMPORT1,
-        DUAL_INDIRECT_IMPORT2,
-        DUAL_INDIRECT_IMPORT3,
-        DUAL_INDIRECT_PACKAGE_IMPORT1,
-        DIRECT_EXPORT,
-        INDIRECT_EXPORT1,
-        INDIRECT_EXPORT2,
-        INDIRECT_PACKAGE_EXPORT1,
-        INDIRECT_PACKAGE_EXPORT2
-      ], (map) => checkPaths(map)));
-}
diff --git a/tests/compiler/dart2js/mirrors/mirror_final_field_inferrer2_test.dart b/tests/compiler/dart2js/mirrors/mirror_final_field_inferrer2_test.dart
deleted file mode 100644
index 2126ac9..0000000
--- a/tests/compiler/dart2js/mirrors/mirror_final_field_inferrer2_test.dart
+++ /dev/null
@@ -1,40 +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.
-
-// Test that final fields in @MirrorsUsed are still inferred.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'package:compiler/src/commandline_options.dart';
-import '../memory_compiler.dart' show runCompiler;
-import '../compiler_helper.dart' show findElement;
-import '../inference/type_mask_test_helper.dart';
-
-const MEMORY_SOURCE_FILES = const <String, String>{
-  'main.dart': """
-import 'dart:mirrors';
-
-const field = 42;
-
-main() {
-  var mirror = reflect(field);
-  mirror.invoke(null, null);
-}
-"""
-};
-
-void main() {
-  asyncTest(() async {
-    var result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        options: [Flags.useOldFrontend]);
-    var compiler = result.compiler;
-    var element = findElement(compiler, 'field');
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-    var commonMasks = closedWorld.commonMasks;
-    Expect.equals(commonMasks.uint31Type,
-        simplify(typesInferrer.getTypeOfMember(element), closedWorld), 'field');
-  });
-}
diff --git a/tests/compiler/dart2js/mirrors/mirror_final_field_inferrer_test.dart b/tests/compiler/dart2js/mirrors/mirror_final_field_inferrer_test.dart
deleted file mode 100644
index 8583e11..0000000
--- a/tests/compiler/dart2js/mirrors/mirror_final_field_inferrer_test.dart
+++ /dev/null
@@ -1,40 +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.
-
-// Test that final fields in @MirrorsUsed are still inferred.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'package:compiler/src/commandline_options.dart';
-import '../memory_compiler.dart' show runCompiler;
-import '../compiler_helper.dart' show findElement;
-import '../inference/type_mask_test_helper.dart';
-
-const MEMORY_SOURCE_FILES = const <String, String>{
-  'main.dart': """
-@MirrorsUsed(targets: 'field')
-import 'dart:mirrors';
-
-const field = 42;
-
-main() {
-  return field;
-}
-"""
-};
-
-void main() {
-  asyncTest(() async {
-    var result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        options: [Flags.useOldFrontend]);
-    var compiler = result.compiler;
-    var element = findElement(compiler, 'field');
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-    var commonMasks = closedWorld.commonMasks;
-    Expect.equals(commonMasks.uint31Type,
-        simplify(typesInferrer.getTypeOfMember(element), closedWorld), 'field');
-  });
-}
diff --git a/tests/compiler/dart2js/mirrors/mirror_private_name_inheritance_test.dart b/tests/compiler/dart2js/mirrors/mirror_private_name_inheritance_test.dart
deleted file mode 100644
index 830b3b7..0000000
--- a/tests/compiler/dart2js/mirrors/mirror_private_name_inheritance_test.dart
+++ /dev/null
@@ -1,55 +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.
-
-// Test that final fields in @MirrorsUsed are still inferred.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'package:compiler/src/commandline_options.dart';
-import '../memory_compiler.dart' show runCompiler;
-import '../compiler_helper.dart' show findElement;
-
-const MEMORY_SOURCE_FILES = const <String, String>{
-  'main.dart': """
-@MirrorsUsed(targets: 'Super')
-import 'dart:mirrors';
-import 'lib.dart';
-
-
-class Subclass extends Super {
-  int _private;
-
-  int magic() => _private++;
-}
-
-main() {
-  var objects = [new Super(), new Subclass()];
-  reflect(objects[0]); // Trigger mirror usage.
-}
-""",
-  'lib.dart': """
-class Super {
-  int _private;
-
-  int magic() => _private++;
-}
-"""
-};
-
-void main() {
-  asyncTest(() async {
-    var result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        options: [Flags.useOldFrontend]);
-    var compiler = result.compiler;
-
-    dynamic superclass =
-        findElement(compiler, 'Super', Uri.parse('memory:lib.dart'));
-    dynamic subclass = findElement(compiler, 'Subclass');
-    var oracle = compiler.backend.mirrorsData.isMemberAccessibleByReflection;
-    print(superclass.lookupMember('_private'));
-    Expect.isTrue(oracle(superclass.lookupMember('_private')));
-    Expect.isFalse(oracle(subclass.lookupMember('_private')));
-  });
-}
diff --git a/tests/compiler/dart2js/mirrors/mirror_tree_shaking_test.dart b/tests/compiler/dart2js/mirrors/mirror_tree_shaking_test.dart
deleted file mode 100644
index 0afce8b..0000000
--- a/tests/compiler/dart2js/mirrors/mirror_tree_shaking_test.dart
+++ /dev/null
@@ -1,59 +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.
-
-// Test that tree-shaking hasn't been turned off.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/js_backend/js_backend.dart' show JavaScriptBackend;
-import 'package:compiler/src/js_backend/mirrors_analysis.dart';
-import 'package:expect/expect.dart';
-import '../memory_compiler.dart';
-
-main() {
-  DiagnosticCollector collector = new DiagnosticCollector();
-  asyncTest(() async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        diagnosticHandler: collector,
-        options: [Flags.useOldFrontend]);
-    Compiler compiler = result.compiler;
-    JavaScriptBackend backend = compiler.backend;
-    Expect.isTrue(collector.errors.isEmpty);
-    Expect.isTrue(collector.infos.isEmpty);
-    Expect.isFalse(compiler.compilationFailed);
-    MirrorsResolutionAnalysisImpl mirrorsResolutionAnalysis =
-        backend.mirrorsResolutionAnalysis;
-    Expect.isFalse(
-        mirrorsResolutionAnalysis.handler.hasEnqueuedReflectiveElements);
-    Expect.isFalse(
-        mirrorsResolutionAnalysis.handler.hasEnqueuedReflectiveStaticFields);
-    MirrorsCodegenAnalysisImpl mirrorsCodegenAnalysis =
-        backend.mirrorsCodegenAnalysis;
-    Expect
-        .isFalse(mirrorsCodegenAnalysis.handler.hasEnqueuedReflectiveElements);
-    Expect.isFalse(
-        mirrorsCodegenAnalysis.handler.hasEnqueuedReflectiveStaticFields);
-    Expect.isFalse(compiler.disableTypeInference);
-    Expect.isFalse(backend.mirrorsData.hasRetainedMetadata);
-  });
-}
-
-const Map MEMORY_SOURCE_FILES = const {
-  'main.dart': r"""
-import 'dart:mirrors';
-
-class Foo {
-  noSuchMethod(invocation) {
-    print('Invoked ${MirrorSystem.getName(invocation.memberName)}');
-    return reflect('foobar').delegate(invocation);
-  }
-}
-
-void main() {
-  print(new Foo().substring(3));
-}
-""",
-};
diff --git a/tests/compiler/dart2js/mirrors/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors/mirrors_used_test.dart
deleted file mode 100644
index 63c6915..0000000
--- a/tests/compiler/dart2js/mirrors/mirrors_used_test.dart
+++ /dev/null
@@ -1,219 +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.
-
-/// Test that the @MirrorsUsed annotation suppress hints and that only
-/// requested elements are retained for reflection.
-library dart2js.test.mirrors_used_test;
-
-import 'package:compiler/src/js/js.dart' as jsAst;
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-
-import '../memory_compiler.dart' show runCompiler;
-
-import 'package:compiler/src/apiimpl.dart' show CompilerImpl;
-import 'package:compiler/src/commandline_options.dart';
-
-import 'package:compiler/src/constants/values.dart'
-    show ConstantValue, TypeConstantValue;
-
-import 'package:compiler/src/elements/elements.dart'
-    show ClassElement, Elements;
-
-import 'package:compiler/src/js_backend/js_backend.dart' show JavaScriptBackend;
-import 'package:compiler/src/js_backend/mirrors_analysis.dart';
-
-import 'package:compiler/src/js_emitter/full_emitter/emitter.dart' as full
-    show Emitter;
-
-import 'package:compiler/src/old_to_new_api.dart'
-    show LegacyCompilerDiagnostics;
-
-import 'package:compiler/src/universe/world_builder.dart';
-
-void expectOnlyVerboseInfo(Uri uri, int begin, int end, String message, kind) {
-  if (kind.name == 'verbose info') {
-    print(message);
-    return;
-  }
-  if (message.contains('methods retained for use by dart:mirrors out of')) {
-    print(message);
-    return;
-  }
-  if (kind.name == 'info') return;
-
-  // TODO(aprelev@gmail.com): Remove once dartbug.com/13907 is fixed.
-  if (message.contains("Warning: 'typedef' not allowed here")) return;
-
-  throw '$uri:$begin:$end: $kind: $message';
-}
-
-void main() {
-  asyncTest(() async {
-    var result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        diagnosticHandler: new LegacyCompilerDiagnostics(expectOnlyVerboseInfo),
-        options: ['--enable-experimental-mirrors', Flags.useOldFrontend]);
-    CompilerImpl compiler = result.compiler;
-    JavaScriptBackend backend = compiler.backend;
-    print('');
-    List generatedCode =
-        Elements.sortedByPosition(new List.from(backend.generatedCode.keys));
-    for (var element in generatedCode) {
-      print(element);
-    }
-    print('');
-
-    // This assertion can fail for two reasons:
-    // 1. Too many elements retained for reflection.
-    // 2. Some code was refactored, and there are more methods.
-    // Either situation could be problematic, but in situation 2, it is often
-    // acceptable to increase [expectedMethodCount] a little.
-    int expectedMethodCount = 490;
-    Expect.isTrue(
-        generatedCode.length <= expectedMethodCount,
-        'Too many compiled methods: '
-        '${generatedCode.length} > $expectedMethodCount');
-
-    // The following names should be retained:
-    List<jsAst.Name> expectedNames = [
-      'Foo', // The name of class Foo.
-      r'Foo$', // The name of class Foo's constructor.
-      r'get$field' // The (getter) name of Foo.field.
-    ].map(backend.namer.asName).toList();
-    // TODO(ahe): Check for the following names, currently they are not being
-    // recorded correctly, but are being emitted.
-    [
-      'Foo_staticMethod', // The name of Foo.staticMethod.
-      r'instanceMethod$0' // The name of Foo.instanceMethod.
-    ];
-
-    // We always include the names of some native classes.
-    List<ClassElement> nativeClasses = [
-      compiler.resolution.commonElements.intClass,
-      compiler.resolution.commonElements.doubleClass,
-      compiler.resolution.commonElements.numClass,
-      compiler.resolution.commonElements.stringClass,
-      compiler.resolution.commonElements.boolClass,
-      compiler.resolution.commonElements.nullClass,
-      compiler.resolution.commonElements.listClass
-    ];
-    Iterable<jsAst.Name> nativeNames =
-        nativeClasses.map((c) => backend.namer.className(c));
-    expectedNames.addAll(nativeNames);
-
-    // Mirrors only work in the full emitter. We can thus be certain that the
-    // emitter is the full emitter.
-    full.Emitter fullEmitter = backend.emitter.emitter;
-    Set<jsAst.Name> recordedNames = new Set()
-      ..addAll(fullEmitter.recordedMangledNames)
-      ..addAll(fullEmitter.mangledFieldNames.keys)
-      ..addAll(fullEmitter.mangledGlobalFieldNames.keys);
-    Expect.setEquals(new Set.from(expectedNames), recordedNames);
-
-    for (dynamic library in compiler.libraryLoader.libraries) {
-      library.forEachLocalMember((member) {
-        if (member.isClass) {
-          if (library ==
-                  compiler.frontendStrategy.elementEnvironment.mainLibrary &&
-              member.name == 'Foo') {
-            Expect.isTrue(
-                compiler.backend.mirrorsData
-                    .isClassAccessibleByReflection(member),
-                '$member');
-            member.forEachLocalMember((classMember) {
-              Expect.isTrue(
-                  compiler.backend.mirrorsData
-                      .isMemberAccessibleByReflection(classMember),
-                  '$classMember');
-            });
-          } else {
-            Expect.isFalse(
-                compiler.backend.mirrorsData
-                    .isClassAccessibleByReflection(member),
-                '$member');
-          }
-        } else if (member.isTypedef) {
-          Expect.isFalse(
-              compiler.backend.mirrorsData
-                  .isTypedefAccessibleByReflection(member),
-              '$member');
-        } else {
-          Expect.isFalse(
-              compiler.backend.mirrorsData
-                  .isMemberAccessibleByReflection(member),
-              '$member');
-        }
-      });
-    }
-
-    int metadataCount = 0;
-    CodegenWorldBuilderImpl codegenWorldBuilder = compiler.codegenWorldBuilder;
-    Set<ConstantValue> compiledConstants =
-        codegenWorldBuilder.compiledConstants;
-    // Make sure that most of the metadata constants aren't included in the
-    // generated code.
-    MirrorsResolutionAnalysisImpl mirrorsResolutionAnalysis =
-        backend.mirrorsResolutionAnalysis;
-    mirrorsResolutionAnalysis.processMetadata(
-        compiler.enqueuer.resolution.processedEntities, (metadata) {
-      ConstantValue constant =
-          backend.constants.getConstantValueForMetadata(metadata);
-      Expect.isFalse(
-          compiledConstants.contains(constant), constant.toStructuredText());
-      metadataCount++;
-    });
-
-    // There should at least be one metadata constant:
-    // 1. The constructed constant for 'MirrorsUsed'.
-    Expect.isTrue(metadataCount >= 1);
-
-    // The type literal 'Foo' is both used as metadata, and as a plain value in
-    // the program. Make sure that it isn't duplicated.
-    int fooConstantCount = 0;
-    for (ConstantValue constant in compiledConstants) {
-      if (constant is TypeConstantValue &&
-          '${constant.representedType}' == 'Foo') {
-        fooConstantCount++;
-      }
-    }
-    Expect.equals(1, fooConstantCount,
-        "The type literal 'Foo' is duplicated or missing.");
-  });
-}
-
-const MEMORY_SOURCE_FILES = const <String, String>{
-  'main.dart': """
-// The repeated constant value for symbols and targets used to crash dart2js in
-// host-checked mode, and could potentially lead to other problems.
-@MirrorsUsed(symbols: 'Foo', targets: 'Foo', override: '*')
-import 'dart:mirrors';
-
-import 'library.dart';
-
-class Foo {
-  int field;
-  instanceMethod() {}
-  static staticMethod() {}
-}
-
-unusedFunction() {
-}
-
-main() {
-  useReflect(Foo);
-}
-""",
-  'library.dart': """
-library lib;
-
-import 'dart:mirrors';
-
-useReflect(type) {
-  print(new Symbol('Foo'));
-  print(MirrorSystem.getName(reflectClass(type).owner.qualifiedName));
-}
-""",
-};
diff --git a/tests/compiler/dart2js/mixin_typevariable_test.dart b/tests/compiler/dart2js/mixin_typevariable_test.dart
deleted file mode 100644
index b2bcd618..0000000
--- a/tests/compiler/dart2js/mixin_typevariable_test.dart
+++ /dev/null
@@ -1,214 +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.
-
-library mixin_typevariable_test;
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'type_test_helper.dart';
-import 'package:compiler/src/elements/resolution_types.dart';
-import "package:compiler/src/elements/elements.dart" show ClassElement;
-
-void main() {
-  testMixinSupertypes();
-  testNonTrivialSubstitutions();
-}
-
-void testMixinSupertypes() {
-  asyncTest(() => TypeEnvironment.create(r"""
-      class S<S_T> {}
-      class M1<M1_T> {}
-      class M2<M2_T> {}
-      class M3<M3_T> {}
-
-      class C1<C1_T> extends S<C1_T> with M1<C1_T>, M2<C1_T>, M3<C1_T> {}
-      class C2<C2_T> = S<C2_T> with M1<C2_T>, M2<C2_T>, M3<C2_T>;
-      """, expectNoWarningsOrErrors: true).then((env) {
-        ClassElement Object = env.getElement('Object');
-        ClassElement S = env.getElement('S');
-        ClassElement M1 = env.getElement('M1');
-        ClassElement M2 = env.getElement('M2');
-        ClassElement C1 = env.getElement('C1');
-        ClassElement C2 = env.getElement('C2');
-
-        ClassElement C1_S_M1_M2_M3 = C1.superclass;
-        ClassElement C1_S_M1_M2 = C1_S_M1_M2_M3.superclass;
-        ClassElement C1_S_M1 = C1_S_M1_M2.superclass;
-
-        ClassElement C2_S_M1_M2 = C2.superclass;
-        ClassElement C2_S_M1 = C2_S_M1_M2.superclass;
-
-        void testSupertypes(ClassElement element) {
-          if (element != Object) {
-            Expect.isTrue(element.typeVariables.length == 1);
-            Expect.equals(
-                element, element.typeVariables.first.element.enclosingElement);
-          }
-          for (ResolutionInterfaceType supertype
-              in element.allSupertypesAndSelf.types) {
-            if (!supertype.typeArguments.isEmpty) {
-              Expect.listEquals(element.typeVariables, supertype.typeArguments,
-                  "Type argument mismatch on supertype $supertype of $element.");
-            } else {
-              Expect.equals(Object, supertype.element);
-            }
-          }
-        }
-
-        testSupertypes(Object);
-        testSupertypes(S);
-        testSupertypes(M1);
-        testSupertypes(M2);
-        testSupertypes(C1_S_M1);
-        testSupertypes(C1_S_M1_M2);
-        testSupertypes(C1_S_M1_M2_M3);
-        testSupertypes(C1);
-        testSupertypes(C2_S_M1);
-        testSupertypes(C2_S_M1_M2);
-        testSupertypes(C2);
-      }));
-}
-
-void testNonTrivialSubstitutions() {
-  asyncTest(() => TypeEnvironment.create(r"""
-      class _ {}
-      class A<A_T> {}
-      class B<B_T, B_S> {}
-
-      class C1<C1_T> extends A with B {}
-      class C2<C2_T> = A with B;
-
-      class D1<D1_T> extends A<D1_T> with B<D1_T, A<D1_T>> {}
-      class D2<D2_T> = A<D2_T> with B<D2_T, A<D2_T>>;
-
-      class E1<E1_T> extends A<_> with B<_, A<_>> {}
-      class E2<E2_T> = A<_> with B<_, A<_>>;
-
-      class F1<F1_T> extends A<_> with B<_, B<F1_T, _>> {}
-      class F2<F2_T> = A<_> with B<_, B<F2_T, _>>;
-      """, expectNoWarningsOrErrors: true).then((env) {
-        ResolutionDartType _dynamic = env['dynamic'];
-        ResolutionDartType _ = env['_'];
-
-        ClassElement Object = env.getElement('Object');
-        ClassElement A = env.getElement('A');
-        ClassElement B = env.getElement('B');
-        ClassElement C1 = env.getElement('C1');
-        ClassElement C2 = env.getElement('C2');
-        ClassElement D1 = env.getElement('D1');
-        ClassElement D2 = env.getElement('D2');
-        ClassElement E1 = env.getElement('E1');
-        ClassElement E2 = env.getElement('E2');
-        ClassElement F1 = env.getElement('F1');
-        ClassElement F2 = env.getElement('F2');
-
-        void testSupertypes(ClassElement element,
-            Map<ClassElement, List<ResolutionDartType>> typeArguments) {
-          if (element != Object) {
-            Expect.isTrue(element.typeVariables.length == 1);
-            Expect.equals(
-                element, element.typeVariables.first.element.enclosingElement);
-          }
-          for (ResolutionInterfaceType supertype
-              in element.allSupertypesAndSelf.types) {
-            if (typeArguments.containsKey(supertype.element)) {
-              Expect.listEquals(
-                  typeArguments[supertype.element],
-                  supertype.typeArguments,
-                  "Type argument mismatch on supertype $supertype of $element.");
-            } else if (!supertype.typeArguments.isEmpty) {
-              Expect.listEquals(element.typeVariables, supertype.typeArguments,
-                  "Type argument mismatch on supertype $supertype of $element.");
-            } else {
-              Expect.equals(Object, supertype.element);
-            }
-          }
-        }
-
-        testSupertypes(C1, {
-          A: [_dynamic],
-          B: [_dynamic, _dynamic]
-        });
-        testSupertypes(C1.superclass, {
-          A: [_dynamic],
-          B: [_dynamic, _dynamic]
-        });
-        testSupertypes(C2, {
-          A: [_dynamic],
-          B: [_dynamic, _dynamic]
-        });
-
-        ResolutionDartType D1_T = D1.typeVariables.first;
-        testSupertypes(D1, {
-          A: [D1_T],
-          B: [
-            D1_T,
-            instantiate(A, [D1_T])
-          ]
-        });
-        ResolutionDartType D1_superclass_T = D1.superclass.typeVariables.first;
-        testSupertypes(D1.superclass, {
-          A: [D1_superclass_T],
-          B: [
-            D1_superclass_T,
-            instantiate(A, [D1_superclass_T])
-          ]
-        });
-        ResolutionDartType D2_T = D2.typeVariables.first;
-        testSupertypes(D2, {
-          A: [D2_T],
-          B: [
-            D2_T,
-            instantiate(A, [D2_T])
-          ]
-        });
-
-        testSupertypes(E1, {
-          A: [_],
-          B: [
-            _,
-            instantiate(A, [_])
-          ]
-        });
-        testSupertypes(E1.superclass, {
-          A: [_],
-          B: [
-            _,
-            instantiate(A, [_])
-          ]
-        });
-        testSupertypes(E2, {
-          A: [_],
-          B: [
-            _,
-            instantiate(A, [_])
-          ]
-        });
-
-        ResolutionDartType F1_T = F1.typeVariables.first;
-        testSupertypes(F1, {
-          A: [_],
-          B: [
-            _,
-            instantiate(B, [F1_T, _])
-          ]
-        });
-        ResolutionDartType F1_superclass_T = F1.superclass.typeVariables.first;
-        testSupertypes(F1.superclass, {
-          A: [_],
-          B: [
-            _,
-            instantiate(B, [F1_superclass_T, _])
-          ]
-        });
-        ResolutionDartType F2_T = F2.typeVariables.first;
-        testSupertypes(F2, {
-          A: [_],
-          B: [
-            _,
-            instantiate(B, [F2_T, _])
-          ]
-        });
-      }));
-}
diff --git a/tests/compiler/dart2js/model/class_set_test.dart b/tests/compiler/dart2js/model/class_set_test.dart
index f2d7b83..a8216b1 100644
--- a/tests/compiler/dart2js/model/class_set_test.dart
+++ b/tests/compiler/dart2js/model/class_set_test.dart
@@ -18,22 +18,20 @@
 
 void main() {
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await testAll(CompileMode.memory);
     print('--test from kernel------------------------------------------------');
-    await testAll(CompileMode.kernel);
+    await testAll();
     print('--test from kernel (strong)---------------------------------------');
-    await testAll(CompileMode.kernel, strongMode: true);
+    await testAll(strongMode: true);
   });
 }
 
-testAll(CompileMode compileMode, {bool strongMode: false}) async {
-  await testIterators(compileMode);
-  await testForEach(compileMode);
-  await testClosures(compileMode, strongMode);
+testAll({bool strongMode: false}) async {
+  await testIterators();
+  await testForEach();
+  await testClosures(strongMode: strongMode);
 }
 
-testIterators(CompileMode compileMode) async {
+testIterators() async {
   var env = await TypeEnvironment.create(r"""
       ///        A
       ///       / \
@@ -57,7 +55,7 @@
         new F();
         new G();
       }
-      """, compileMode: compileMode);
+      """);
   ClosedWorld world = env.closedWorld;
 
   ClassEntity A = env.getClass("A");
@@ -356,7 +354,7 @@
   Expect.isNull(iterator.current);
 }
 
-testForEach(CompileMode compileMode) async {
+testForEach() async {
   var env = await TypeEnvironment.create(r"""
       ///        A
       ///       / \
@@ -387,7 +385,7 @@
         new H();
         new I();
       }
-      """, compileMode: compileMode);
+      """);
   ClosedWorld world = env.closedWorld;
 
   ClassEntity A = env.getClass("A");
@@ -590,7 +588,7 @@
       find: I, anySubtype: true, expectedResult: true);
 }
 
-testClosures(CompileMode compileMode, bool strongMode) async {
+testClosures({bool strongMode}) async {
   var env = await TypeEnvironment.create(r"""
       class A {
         call() => null;
@@ -603,7 +601,6 @@
         local() {}
       }
       """,
-      compileMode: compileMode,
       options: strongMode ? [Flags.strongMode] : [],
       testBackendWorld: true);
   ClosedWorld world = env.closedWorld;
diff --git a/tests/compiler/dart2js/model/const_exp_test.dart b/tests/compiler/dart2js/model/const_exp_test.dart
deleted file mode 100644
index a8b93f0..0000000
--- a/tests/compiler/dart2js/model/const_exp_test.dart
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import '../type_test_helper.dart';
-
-test(String constantInitializer, [String expectedOutput]) {
-  if (expectedOutput == null) {
-    expectedOutput = constantInitializer;
-  }
-  return () => TypeEnvironment.create("""
-    class Class<T, S> {
-      final a;
-      final b;
-      final c;
-      const Class(this.a, {this.b, this.c: true});
-      const Class.named([this.a, this.b = 0, this.c = 2]);
-
-      static const staticConstant = 0;
-      static staticFunction() {}
-    }
-    const t = true;
-    const f = false;
-    const toplevelConstant = 0;
-    toplevelFunction() {}
-    const constant = $constantInitializer;
-""", expectNoWarningsOrErrors: true).then((env) {
-        dynamic element = env.getElement('constant');
-        Expect.isNotNull(element, "Element 'constant' not found.");
-
-        /// ignore: undefined_getter
-        var constant = element.constant;
-        var value = env.compiler.constants.getConstantValue(constant);
-        Expect.isNotNull(constant, "No constant computed for '$element'.");
-        Expect.equals(
-            expectedOutput,
-            constant.toDartText(),
-            "Unexpected to string '${constant.toDartText()}' for constant "
-            "'$constantInitializer' of value "
-            "${value.toStructuredText()}");
-      });
-}
-
-void main() {
-  asyncTest(() => Future.forEach([
-        test('null'),
-        test('0'),
-        test('1.5'),
-        test('true'),
-        test('false'),
-        test('"f"'),
-        test('"a" "b"', '"ab"'),
-        test('const []'),
-        test('const <int>[0, 1]'),
-        test('const <dynamic>[0, 1]', 'const [0, 1]'),
-        test('const {}'),
-        test('const {0: 1, 2: 3}'),
-        test('const <String, int>{"0": 1, "2": 3}'),
-        test('const <String, dynamic>{"0": 1, "2": 3}'),
-        test('const <dynamic, dynamic>{"0": 1, "2": 3}',
-            'const {"0": 1, "2": 3}'),
-        test('const Class(0)'),
-        test('const Class(0, b: 1)'),
-        test('const Class(0, c: 2)'),
-        test('const Class(0, b: 3, c: 4)'),
-        test('const Class.named()'),
-        test('const Class.named(0)'),
-        test('const Class.named(0, 1)'),
-        test('const Class.named(0, 1, 2)'),
-        test('const Class<String, int>(0)'),
-        test('const Class<String, dynamic>(0)'),
-        test('const Class<dynamic, String>(0)'),
-        test('const Class<dynamic, dynamic>(0)', 'const Class(0)'),
-        test('toplevelConstant'),
-        test('toplevelFunction'),
-        test('Class.staticConstant'),
-        test('Class.staticFunction'),
-        test('#a'),
-        test('1 + 2'),
-        test('1 + 2 + 3'),
-        test('1 + -2'),
-        test('-1 + 2'),
-        test('(1 + 2) + 3', '1 + 2 + 3'),
-        test('1 + (2 + 3)', '1 + 2 + 3'),
-        test('1 * 2'),
-        test('1 * 2 + 3'),
-        test('1 * (2 + 3)'),
-        test('1 + 2 * 3'),
-        test('(1 + 2) * 3'),
-        test('false || identical(0, 1)'),
-        test('!identical(0, 1)'),
-        test('!identical(0, 1) || false'),
-        test('!(identical(0, 1) || false)'),
-        test('identical(0, 1) ? 3 * 4 + 5 : 6 + 7 * 8'),
-        test('t ? f ? 0 : 1 : 2'),
-        test('(t ? t : f) ? f ? 0 : 1 : 2'),
-        test('t ? t : f ? f ? 0 : 1 : 2'),
-        test('t ? t ? t : t : t ? t : t'),
-        test('t ? (t ? t : t) : (t ? t : t)', 't ? t ? t : t : t ? t : t'),
-        test(
-            'const [const <dynamic, dynamic>{0: true, "1": "c" "d"}, '
-            'const Class(const Class<dynamic, dynamic>(toplevelConstant))]',
-            'const [const {0: true, "1": "cd"}, '
-            'const Class(const Class(toplevelConstant))]'),
-      ], (f) => f()));
-}
diff --git a/tests/compiler/dart2js/model/constant_expression_test.dart b/tests/compiler/dart2js/model/constant_expression_test.dart
index efe465e..ae5ec8a 100644
--- a/tests/compiler/dart2js/model/constant_expression_test.dart
+++ b/tests/compiler/dart2js/model/constant_expression_test.dart
@@ -55,7 +55,22 @@
 }
 
 const List<TestData> DATA = const [
-  const TestData('', const [
+  const TestData('''
+class Class<T, S> {
+  final a;
+  final b;
+  final c;
+  const Class(this.a, {this.b, this.c: true});
+  const Class.named([this.a, this.b = 0, this.c = 2]);
+
+  static const staticConstant = 0;
+  static staticFunction() {}
+}
+const t = true;
+const f = false;
+const toplevelConstant = 0;
+toplevelFunction() {}
+''', const [
     const ConstantData('null', ConstantExpressionKind.NULL),
     const ConstantData('false', ConstantExpressionKind.BOOL),
     const ConstantData('true', ConstantExpressionKind.BOOL),
@@ -78,13 +93,24 @@
     const ConstantData('proxy', ConstantExpressionKind.FIELD),
     const ConstantData('Object', ConstantExpressionKind.TYPE),
     const ConstantData('#name', ConstantExpressionKind.SYMBOL),
+    const ConstantData('const []', ConstantExpressionKind.LIST),
     const ConstantData('const [0, 1]', ConstantExpressionKind.LIST,
         strongText: 'const <int>[0, 1]'),
     const ConstantData('const <int>[0, 1]', ConstantExpressionKind.LIST),
+    const ConstantData('const <dynamic>[0, 1]', ConstantExpressionKind.LIST,
+        text: 'const [0, 1]'),
+    const ConstantData('const {}', ConstantExpressionKind.MAP),
     const ConstantData('const {0: 1, 2: 3}', ConstantExpressionKind.MAP,
         strongText: 'const <int, int>{0: 1, 2: 3}'),
     const ConstantData(
         'const <int, int>{0: 1, 2: 3}', ConstantExpressionKind.MAP),
+    const ConstantData(
+        'const <String, int>{"0": 1, "2": 3}', ConstantExpressionKind.MAP),
+    const ConstantData(
+        'const <String, dynamic>{"0": 1, "2": 3}', ConstantExpressionKind.MAP),
+    const ConstantData(
+        'const <dynamic, dynamic>{"0": 1, "2": 3}', ConstantExpressionKind.MAP,
+        text: 'const {"0": 1, "2": 3}'),
     const ConstantData('const bool.fromEnvironment("foo", defaultValue: false)',
         ConstantExpressionKind.BOOL_FROM_ENVIRONMENT),
     const ConstantData('const int.fromEnvironment("foo", defaultValue: 42)',
@@ -92,6 +118,74 @@
     const ConstantData(
         'const String.fromEnvironment("foo", defaultValue: "bar")',
         ConstantExpressionKind.STRING_FROM_ENVIRONMENT),
+    const ConstantData('const Class(0)', ConstantExpressionKind.CONSTRUCTED),
+    const ConstantData(
+        'const Class(0, b: 1)', ConstantExpressionKind.CONSTRUCTED),
+    const ConstantData(
+        'const Class(0, c: 2)', ConstantExpressionKind.CONSTRUCTED),
+    const ConstantData(
+        'const Class(0, b: 3, c: 4)', ConstantExpressionKind.CONSTRUCTED),
+    const ConstantData(
+        'const Class.named()', ConstantExpressionKind.CONSTRUCTED),
+    const ConstantData(
+        'const Class.named(0)', ConstantExpressionKind.CONSTRUCTED),
+    const ConstantData(
+        'const Class.named(0, 1)', ConstantExpressionKind.CONSTRUCTED),
+    const ConstantData(
+        'const Class.named(0, 1, 2)', ConstantExpressionKind.CONSTRUCTED),
+    const ConstantData(
+        'const Class<String, int>(0)', ConstantExpressionKind.CONSTRUCTED),
+    const ConstantData(
+        'const Class<String, dynamic>(0)', ConstantExpressionKind.CONSTRUCTED),
+    const ConstantData(
+        'const Class<dynamic, String>(0)', ConstantExpressionKind.CONSTRUCTED),
+    const ConstantData(
+        'const Class<dynamic, dynamic>(0)', ConstantExpressionKind.CONSTRUCTED,
+        text: 'const Class(0)'),
+    const ConstantData('toplevelConstant', ConstantExpressionKind.FIELD),
+    const ConstantData('toplevelFunction', ConstantExpressionKind.FUNCTION),
+    const ConstantData('Class.staticConstant', ConstantExpressionKind.FIELD),
+    const ConstantData('Class.staticFunction', ConstantExpressionKind.FUNCTION),
+    const ConstantData('1 + 2', ConstantExpressionKind.BINARY),
+    const ConstantData('1 + 2 + 3', ConstantExpressionKind.BINARY),
+    const ConstantData('1 + -2', ConstantExpressionKind.BINARY),
+    const ConstantData('-1 + 2', ConstantExpressionKind.BINARY),
+    const ConstantData('(1 + 2) + 3', ConstantExpressionKind.BINARY,
+        text: '1 + 2 + 3'),
+    const ConstantData('1 + (2 + 3)', ConstantExpressionKind.BINARY,
+        text: '1 + 2 + 3'),
+    const ConstantData('1 * 2', ConstantExpressionKind.BINARY),
+    const ConstantData('1 * 2 + 3', ConstantExpressionKind.BINARY),
+    const ConstantData('1 * (2 + 3)', ConstantExpressionKind.BINARY),
+    const ConstantData('1 + 2 * 3', ConstantExpressionKind.BINARY),
+    const ConstantData('(1 + 2) * 3', ConstantExpressionKind.BINARY),
+    const ConstantData(
+        'false || identical(0, 1)', ConstantExpressionKind.BINARY),
+    const ConstantData('!identical(0, 1)', ConstantExpressionKind.UNARY),
+    const ConstantData(
+        '!identical(0, 1) || false', ConstantExpressionKind.BINARY),
+    const ConstantData(
+        '!(identical(0, 1) || false)', ConstantExpressionKind.UNARY),
+    const ConstantData('identical(0, 1) ? 3 * 4 + 5 : 6 + 7 * 8',
+        ConstantExpressionKind.CONDITIONAL),
+    const ConstantData('t ? f ? 0 : 1 : 2', ConstantExpressionKind.CONDITIONAL),
+    const ConstantData(
+        '(t ? t : f) ? f ? 0 : 1 : 2', ConstantExpressionKind.CONDITIONAL),
+    const ConstantData(
+        't ? t : f ? f ? 0 : 1 : 2', ConstantExpressionKind.CONDITIONAL),
+    const ConstantData(
+        't ? t ? t : t : t ? t : t', ConstantExpressionKind.CONDITIONAL),
+    const ConstantData(
+        't ? (t ? t : t) : (t ? t : t)', ConstantExpressionKind.CONDITIONAL,
+        text: 't ? t ? t : t : t ? t : t'),
+    const ConstantData(
+        'const [const <dynamic, dynamic>{0: true, "1": "c" "d"}, '
+        'const Class(const Class<dynamic, dynamic>(toplevelConstant))]',
+        ConstantExpressionKind.LIST,
+        text: 'const [const {0: true, "1": "cd"}, '
+            'const Class(const Class(toplevelConstant))]',
+        strongText: 'const <Object>[const {0: true, "1": "cd"}, '
+            'const Class(const Class(toplevelConstant))]'),
   ]),
   const TestData('''
 class A {
diff --git a/tests/compiler/dart2js/model/constant_value_test.dart b/tests/compiler/dart2js/model/constant_value_test.dart
index 2e44dba..5d0aa37 100644
--- a/tests/compiler/dart2js/model/constant_value_test.dart
+++ b/tests/compiler/dart2js/model/constant_value_test.dart
@@ -7,7 +7,8 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 import 'package:compiler/src/helpers/helpers.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/constants/values.dart';
 import '../type_test_helper.dart';
 
@@ -23,14 +24,15 @@
       C(this.field1, this.field2);
     }
     ''');
-    ClassElement C = env.getElement('C');
-    FieldElement field1 = C.lookupLocalMember('field1');
-    FieldElement field2 = C.lookupLocalMember('field2');
-    ConstantValue value1 = new ConstructedConstantValue(C.rawType, {
+    ClassEntity C = env.getClass('C');
+    InterfaceType C_raw = env.elementEnvironment.getRawType(C);
+    FieldEntity field1 = env.elementEnvironment.lookupClassMember(C, 'field1');
+    FieldEntity field2 = env.elementEnvironment.lookupClassMember(C, 'field2');
+    ConstructedConstantValue value1 = new ConstructedConstantValue(C_raw, {
       field1: new IntConstantValue(0),
       field2: new IntConstantValue(1),
     });
-    ConstantValue value2 = new ConstructedConstantValue(C.rawType, {
+    ConstantValue value2 = new ConstructedConstantValue(C_raw, {
       field2: new IntConstantValue(1),
       field1: new IntConstantValue(0),
     });
diff --git a/tests/compiler/dart2js/model/future_or_test.dart b/tests/compiler/dart2js/model/future_or_test.dart
index e1598ee..4da2f32 100644
--- a/tests/compiler/dart2js/model/future_or_test.dart
+++ b/tests/compiler/dart2js/model/future_or_test.dart
@@ -11,8 +11,7 @@
 
 main() {
   asyncTest(() async {
-    var env = await TypeEnvironment.create(
-        '''
+    var env = await TypeEnvironment.create('''
 Future<num> futureNum() async => null;
 FutureOr<num> futureOrNum() async => null;
 
@@ -34,9 +33,7 @@
   Future<T> futureT() async => null;
   FutureOr<T> futureOrT() async => null;
 }
-''',
-        compileMode: CompileMode.kernel,
-        options: [Flags.strongMode]);
+''', options: [Flags.strongMode]);
     FunctionType getFunctionType(String name, String expectedType,
         [ClassEntity cls]) {
       FunctionType type = env.getMemberType(name, cls);
diff --git a/tests/compiler/dart2js/model/mixin_typevariable_test.dart b/tests/compiler/dart2js/model/mixin_typevariable_test.dart
new file mode 100644
index 0000000..ff9a9ec
--- /dev/null
+++ b/tests/compiler/dart2js/model/mixin_typevariable_test.dart
@@ -0,0 +1,237 @@
+// 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.
+
+library mixin_typevariable_test;
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/elements/types.dart';
+import 'package:expect/expect.dart';
+import '../type_test_helper.dart';
+
+void main() {
+  asyncTest(() async {
+    await testMixinSupertypes();
+    await testNonTrivialSubstitutions();
+  });
+}
+
+testMixinSupertypes() async {
+  var env = await TypeEnvironment.create(r"""
+      class S<S_T> {}
+      class M1<M1_T> {}
+      class M2<M2_T> {}
+      class M3<M3_T> {}
+
+      class C1<C1_T> extends S<C1_T> with M1<C1_T>, M2<C1_T>, M3<C1_T> {}
+      class C2<C2_T> = S<C2_T> with M1<C2_T>, M2<C2_T>, M3<C2_T>;
+      """, expectNoWarningsOrErrors: true);
+  ClassEntity Object = env.getElement('Object');
+  ClassEntity S = env.getClass('S');
+  ClassEntity M1 = env.getClass('M1');
+  ClassEntity M2 = env.getClass('M2');
+  ClassEntity C1 = env.getClass('C1');
+  ClassEntity C2 = env.getClass('C2');
+
+  ClassEntity C1_S_M1_M2_M3 = env.elementEnvironment.getSuperClass(C1);
+  ClassEntity C1_S_M1_M2 = env.elementEnvironment.getSuperClass(C1_S_M1_M2_M3);
+  ClassEntity C1_S_M1 = env.elementEnvironment.getSuperClass(C1_S_M1_M2);
+
+  ClassEntity C2_S_M1_M2 = env.elementEnvironment.getSuperClass(C2);
+  ClassEntity C2_S_M1 = env.elementEnvironment.getSuperClass(C2_S_M1_M2);
+
+  void testSupertypes(ClassEntity element) {
+    List<DartType> typeVariables = const <DartType>[];
+    if (element != Object) {
+      typeVariables = env.elementEnvironment.getThisType(element).typeArguments;
+      Expect.isTrue(typeVariables.length == 1);
+      TypeVariableType typeVariable = typeVariables.first;
+      Expect.equals(element, typeVariable.element.typeDeclaration);
+    }
+    env.elementEnvironment.forEachSupertype(element, (InterfaceType supertype) {
+      if (!supertype.typeArguments.isEmpty) {
+        Expect.listEquals(typeVariables, supertype.typeArguments,
+            "Type argument mismatch on supertype $supertype of $element.");
+      } else {
+        Expect.equals(Object, supertype.element);
+      }
+    });
+  }
+
+  testSupertypes(Object);
+  testSupertypes(S);
+  testSupertypes(M1);
+  testSupertypes(M2);
+  testSupertypes(C1_S_M1);
+  testSupertypes(C1_S_M1_M2);
+  testSupertypes(C1_S_M1_M2_M3);
+  testSupertypes(C1);
+  testSupertypes(C2_S_M1);
+  testSupertypes(C2_S_M1_M2);
+  testSupertypes(C2);
+}
+
+testNonTrivialSubstitutions() async {
+  var env = await TypeEnvironment.create(r"""
+      class _ {}
+      class A<A_T> {}
+      class B<B_T, B_S> {}
+
+      class C1<C1_T> extends A with B {}
+      class C2<C2_T> = A with B;
+
+      class D1<D1_T> extends A<D1_T> with B<D1_T, A<D1_T>> {}
+      class D2<D2_T> = A<D2_T> with B<D2_T, A<D2_T>>;
+
+      class E1<E1_T> extends A<_> with B<_, A<_>> {}
+      class E2<E2_T> = A<_> with B<_, A<_>>;
+
+      class F1<F1_T> extends A<_> with B<_, B<F1_T, _>> {}
+      class F2<F2_T> = A<_> with B<_, B<F2_T, _>>;
+      """, expectNoWarningsOrErrors: true);
+  DartType _dynamic = env['dynamic'];
+  DartType _ = env['_'];
+
+  ClassEntity Object = env.getElement('Object');
+  ClassEntity A = env.getClass('A');
+  ClassEntity B = env.getClass('B');
+  ClassEntity C1 = env.getClass('C1');
+  ClassEntity C2 = env.getClass('C2');
+  ClassEntity D1 = env.getClass('D1');
+  ClassEntity D2 = env.getClass('D2');
+  ClassEntity E1 = env.getClass('E1');
+  ClassEntity E2 = env.getClass('E2');
+  ClassEntity F1 = env.getClass('F1');
+  ClassEntity F2 = env.getClass('F2');
+
+  void testSupertypes(
+      ClassEntity element, Map<ClassEntity, List<DartType>> typeArguments) {
+    List<DartType> typeVariables = const <DartType>[];
+    if (element != Object) {
+      typeVariables = env.elementEnvironment.getThisType(element).typeArguments;
+      if (env.elementEnvironment.isUnnamedMixinApplication(element)) {
+        // Kernel doesn't add type variables to unnamed mixin applications when
+        // these aren't need for its supertypes.
+        Expect.isTrue(typeVariables.length <= 1);
+      } else {
+        Expect.isTrue(typeVariables.length == 1);
+      }
+      if (typeVariables.isNotEmpty) {
+        TypeVariableType typeVariable = typeVariables.first;
+        Expect.equals(element, typeVariable.element.typeDeclaration);
+      }
+    }
+    env.elementEnvironment.forEachSupertype(element, (InterfaceType supertype) {
+      if (typeArguments.containsKey(supertype.element)) {
+        Expect.listEquals(
+            typeArguments[supertype.element],
+            supertype.typeArguments,
+            "Type argument mismatch on supertype $supertype of $element.");
+      } else if (!supertype.typeArguments.isEmpty) {
+        Expect.listEquals(typeVariables, supertype.typeArguments,
+            "Type argument mismatch on supertype $supertype of $element.");
+      } else if (env.elementEnvironment
+          .isUnnamedMixinApplication(supertype.element)) {
+        // Kernel doesn't add type variables to unnamed mixin applications when
+        // these aren't need for its supertypes.
+        Expect.isTrue(supertype.typeArguments.isEmpty,
+            "Type argument mismatch on supertype $supertype of $element.");
+      } else {
+        Expect.equals(Object, supertype.element,
+            "Type argument mismatch on supertype $supertype of $element.");
+      }
+    });
+  }
+
+  testSupertypes(C1, {
+    A: [_dynamic],
+    B: [_dynamic, _dynamic]
+  });
+  testSupertypes(env.elementEnvironment.getSuperClass(C1), {
+    A: [_dynamic],
+    B: [_dynamic, _dynamic]
+  });
+  testSupertypes(C2, {
+    A: [_dynamic],
+    B: [_dynamic, _dynamic]
+  });
+
+  DartType D1_T = env.elementEnvironment.getThisType(D1).typeArguments.first;
+  testSupertypes(D1, {
+    A: [D1_T],
+    B: [
+      D1_T,
+      instantiate(A, [D1_T])
+    ]
+  });
+  DartType D1_superclass_T = env.elementEnvironment
+      .getThisType(env.elementEnvironment.getSuperClass(D1))
+      .typeArguments
+      .first;
+  testSupertypes(env.elementEnvironment.getSuperClass(D1), {
+    A: [D1_superclass_T],
+    B: [
+      D1_superclass_T,
+      instantiate(A, [D1_superclass_T])
+    ]
+  });
+  DartType D2_T = env.elementEnvironment.getThisType(D2).typeArguments.first;
+  testSupertypes(D2, {
+    A: [D2_T],
+    B: [
+      D2_T,
+      instantiate(A, [D2_T])
+    ]
+  });
+
+  testSupertypes(E1, {
+    A: [_],
+    B: [
+      _,
+      instantiate(A, [_])
+    ]
+  });
+  testSupertypes(env.elementEnvironment.getSuperClass(E1), {
+    A: [_],
+    B: [
+      _,
+      instantiate(A, [_])
+    ]
+  });
+  testSupertypes(E2, {
+    A: [_],
+    B: [
+      _,
+      instantiate(A, [_])
+    ]
+  });
+
+  DartType F1_T = env.elementEnvironment.getThisType(F1).typeArguments.first;
+  testSupertypes(F1, {
+    A: [_],
+    B: [
+      _,
+      instantiate(B, [F1_T, _])
+    ]
+  });
+  DartType F1_superclass_T = env.elementEnvironment
+      .getThisType(env.elementEnvironment.getSuperClass(F1))
+      .typeArguments
+      .first;
+  testSupertypes(env.elementEnvironment.getSuperClass(F1), {
+    A: [_],
+    B: [
+      _,
+      instantiate(B, [F1_superclass_T, _])
+    ]
+  });
+  DartType F2_T = env.elementEnvironment.getThisType(F2).typeArguments.first;
+  testSupertypes(F2, {
+    A: [_],
+    B: [
+      _,
+      instantiate(B, [F2_T, _])
+    ]
+  });
+}
diff --git a/tests/compiler/dart2js/model/subtype_test.dart b/tests/compiler/dart2js/model/subtype_test.dart
index 48445e3..63eaa41 100644
--- a/tests/compiler/dart2js/model/subtype_test.dart
+++ b/tests/compiler/dart2js/model/subtype_test.dart
@@ -15,26 +15,24 @@
 
 void main() {
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(CompileMode.memory);
     print('--test from kernel------------------------------------------------');
-    await runTests(CompileMode.kernel);
+    await runTests();
     print('--test from kernel (strong)---------------------------------------');
-    await runTests(CompileMode.kernel, strongMode: true);
+    await runTests(strongMode: true);
   });
 }
 
-Future runTests(CompileMode compileMode, {bool strongMode: false}) async {
-  await testCallableSubtype(compileMode, strongMode);
-  await testInterfaceSubtype(compileMode, strongMode);
-  await testFunctionSubtyping(compileMode, strongMode);
-  await testTypedefSubtyping(compileMode, strongMode);
-  await testFunctionSubtypingOptional(compileMode, strongMode);
-  await testTypedefSubtypingOptional(compileMode, strongMode);
-  await testFunctionSubtypingNamed(compileMode, strongMode);
-  await testTypedefSubtypingNamed(compileMode, strongMode);
-  await testTypeVariableSubtype(compileMode, strongMode);
-  await testStrongModeSubtyping(compileMode, strongMode);
+Future runTests({bool strongMode: false}) async {
+  await testCallableSubtype(strongMode: strongMode);
+  await testInterfaceSubtype(strongMode: strongMode);
+  await testFunctionSubtyping(strongMode: strongMode);
+  await testTypedefSubtyping(strongMode: strongMode);
+  await testFunctionSubtypingOptional(strongMode: strongMode);
+  await testTypedefSubtypingOptional(strongMode: strongMode);
+  await testFunctionSubtypingNamed(strongMode: strongMode);
+  await testTypedefSubtypingNamed(strongMode: strongMode);
+  await testTypeVariableSubtype(strongMode: strongMode);
+  await testStrongModeSubtyping(strongMode: strongMode);
 }
 
 void testTypes(TypeEnvironment env, DartType subtype, DartType supertype,
@@ -59,16 +57,14 @@
   testTypes(env, subtype, supertype, expectSubtype, expectMoreSpecific);
 }
 
-Future testInterfaceSubtype(CompileMode compileMode, bool strongMode) async {
+Future testInterfaceSubtype({bool strongMode}) async {
   await TypeEnvironment.create(r"""
       class A<T> {}
       class B<T1, T2> extends A<T1> {}
       // TODO(johnniwinther): Inheritance with different type arguments is
       // currently not supported by the implementation.
       class C<T1, T2> extends B<T2, T1> /*implements A<A<T1>>*/ {}
-      """,
-      compileMode: compileMode,
-      options: strongMode ? [Flags.strongMode] : []).then((env) {
+      """, options: strongMode ? [Flags.strongMode] : []).then((env) {
     void expect(bool expectSubtype, DartType T, DartType S,
         {bool expectMoreSpecific}) {
       testTypes(env, T, S, expectSubtype, expectMoreSpecific);
@@ -306,7 +302,7 @@
   });
 }
 
-Future testCallableSubtype(CompileMode compileMode, bool strongMode) async {
+Future testCallableSubtype({bool strongMode}) async {
   await TypeEnvironment.create(r"""
       class U {}
       class V extends U {}
@@ -320,9 +316,7 @@
         int m4(V v, U u) => null;
         void m5(V v, int i) => null;
       }
-      """,
-      compileMode: compileMode,
-      options: strongMode ? [Flags.strongMode] : []).then((env) {
+      """, options: strongMode ? [Flags.strongMode] : []).then((env) {
     void expect(bool expectSubtype, DartType T, DartType S,
         {bool expectMoreSpecific}) {
       testTypes(env, T, S, expectSubtype, expectMoreSpecific);
@@ -369,18 +363,16 @@
       'void', 'inline_void__int', '(void Function(int i) f)'),
 ];
 
-Future testFunctionSubtyping(CompileMode compileMode, bool strongMode) async {
+Future testFunctionSubtyping({bool strongMode}) async {
   await TypeEnvironment
       .create(createMethods(functionTypesData),
-          compileMode: compileMode,
           options: strongMode ? [Flags.strongMode] : [])
       .then(functionSubtypingHelper);
 }
 
-Future testTypedefSubtyping(CompileMode compileMode, bool strongMode) async {
+Future testTypedefSubtyping({bool strongMode}) async {
   await TypeEnvironment
       .create(createTypedefs(functionTypesData),
-          compileMode: compileMode,
           options: strongMode ? [Flags.strongMode] : [])
       .then(functionSubtypingHelper);
 }
@@ -457,20 +449,16 @@
   const FunctionTypeData('void', 'void___Object_int', '([Object o, int i])'),
 ];
 
-Future testFunctionSubtypingOptional(
-    CompileMode compileMode, bool strongMode) async {
+Future testFunctionSubtypingOptional({bool strongMode}) async {
   await TypeEnvironment
       .create(createMethods(optionalFunctionTypesData),
-          compileMode: compileMode,
           options: strongMode ? [Flags.strongMode] : [])
       .then((env) => functionSubtypingOptionalHelper(env, strongMode));
 }
 
-Future testTypedefSubtypingOptional(
-    CompileMode compileMode, bool strongMode) async {
+Future testTypedefSubtypingOptional({bool strongMode}) async {
   await TypeEnvironment
       .create(createTypedefs(optionalFunctionTypesData),
-          compileMode: compileMode,
           options: strongMode ? [Flags.strongMode] : [])
       .then((env) => functionSubtypingOptionalHelper(env, strongMode));
 }
@@ -535,20 +523,16 @@
   const FunctionTypeData('void', 'void___c_int', '({int c})'),
 ];
 
-Future testFunctionSubtypingNamed(
-    CompileMode compileMode, bool strongMode) async {
+Future testFunctionSubtypingNamed({bool strongMode}) async {
   await TypeEnvironment
       .create(createMethods(namedFunctionTypesData),
-          compileMode: compileMode,
           options: strongMode ? [Flags.strongMode] : [])
       .then((env) => functionSubtypingNamedHelper(env, strongMode));
 }
 
-Future testTypedefSubtypingNamed(
-    CompileMode compileMode, bool strongMode) async {
+Future testTypedefSubtypingNamed({bool strongMode}) async {
   await TypeEnvironment
       .create(createTypedefs(namedFunctionTypesData),
-          compileMode: compileMode,
           options: strongMode ? [Flags.strongMode] : [])
       .then((env) => functionSubtypingNamedHelper(env, strongMode));
 }
@@ -589,7 +573,7 @@
   expect(true, 'void___a_int_b_int_c_int', 'void___c_int');
 }
 
-Future testTypeVariableSubtype(CompileMode compileMode, bool strongMode) async {
+Future testTypeVariableSubtype({bool strongMode}) async {
   await TypeEnvironment.create(r"""
       class A<T> {}
       class B<T extends Object> {}
@@ -601,9 +585,7 @@
       class H<T extends S, S extends T> {}
       class I<T extends S, S extends U, U extends T> {}
       class J<T extends S, S extends U, U extends S> {}
-      """,
-      compileMode: compileMode,
-      options: strongMode ? [Flags.strongMode] : []).then((env) {
+      """, options: strongMode ? [Flags.strongMode] : []).then((env) {
     void expect(bool expectSubtype, DartType T, DartType S,
         {bool expectMoreSpecific}) {
       testTypes(env, T, S, expectSubtype, expectMoreSpecific);
@@ -813,7 +795,7 @@
   });
 }
 
-Future testStrongModeSubtyping(CompileMode compileMode, bool strongMode) async {
+Future testStrongModeSubtyping({bool strongMode}) async {
   await TypeEnvironment.create(r"""
       class ClassWithCall {
         void call() {}
@@ -827,9 +809,7 @@
       takeInt(int o) => null;
       takeVoid(void o) => null;
       takeObject(Object o) => null;
-      """,
-      compileMode: compileMode,
-      options: strongMode ? [Flags.strongMode] : []).then((env) {
+      """, options: strongMode ? [Flags.strongMode] : []).then((env) {
     void expect(bool expectSubtype, DartType T, DartType S) {
       Expect.equals(expectSubtype, env.isSubtype(T, S), '$T <: $S');
       if (expectSubtype) {
diff --git a/tests/compiler/dart2js/model/subtypeset_test.dart b/tests/compiler/dart2js/model/subtypeset_test.dart
index cbaf315..af5d652 100644
--- a/tests/compiler/dart2js/model/subtypeset_test.dart
+++ b/tests/compiler/dart2js/model/subtypeset_test.dart
@@ -16,16 +16,14 @@
 
 void main() {
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(CompileMode.memory);
     print('--test from kernel------------------------------------------------');
-    await runTests(CompileMode.kernel);
+    await runTests();
     print('--test from kernel (strong)---------------------------------------');
-    await runTests(CompileMode.kernel, strongMode: true);
+    await runTests(strongMode: true);
   });
 }
 
-runTests(CompileMode compileMode, {bool strongMode: false}) async {
+runTests({bool strongMode: false}) async {
   var env = await TypeEnvironment.create(r"""
       ///        A
       ///       / \
@@ -44,8 +42,7 @@
       class G extends C {}
       abstract class H implements C {}
       abstract class I implements H {}
-      """,
-      mainSource: r"""
+      """, mainSource: r"""
       main() {
         new A().call;
         new C();
@@ -54,9 +51,7 @@
         new F();
         new G();
       }
-      """,
-      compileMode: compileMode,
-      options: strongMode ? [Flags.strongMode] : []);
+      """, options: strongMode ? [Flags.strongMode] : []);
   ClosedWorld world = env.closedWorld;
 
   ClassEntity A = env.getElement("A");
diff --git a/tests/compiler/dart2js/model/type_substitution_test.dart b/tests/compiler/dart2js/model/type_substitution_test.dart
index 72ed70c..a00a701 100644
--- a/tests/compiler/dart2js/model/type_substitution_test.dart
+++ b/tests/compiler/dart2js/model/type_substitution_test.dart
@@ -8,18 +8,17 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/elements/resolution_types.dart';
-import '../compiler_helper.dart';
+import 'package:compiler/src/common_elements.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/elements/types.dart';
 import '../type_test_helper.dart';
 
-ResolutionDartType getType(compiler, String name) {
-  dynamic clazz = findElement(compiler, "Class");
-  clazz.ensureResolved(compiler.resolution);
-  dynamic element = clazz.buildScope().lookup(name);
+DartType getType(ElementEnvironment elementEnvironment, String name) {
+  ClassEntity cls =
+      elementEnvironment.lookupClass(elementEnvironment.mainLibrary, 'Class');
+  FunctionEntity element = elementEnvironment.lookupClassMember(cls, name);
   Expect.isNotNull(element);
-  Expect.equals(element.kind, ElementKind.FUNCTION);
-  element.computeType(compiler.resolution);
-  FunctionSignature signature = element.functionSignature;
+  FunctionType type = elementEnvironment.getFunctionType(element);
 
   // Function signatures are used to be to provide void types (only occurring as
   // as return types) and (inlined) function types (only occurring as method
@@ -27,69 +26,78 @@
   //
   // Only a single type is used from each signature. That is, it is not the
   // intention to check the whole signatures against eachother.
-  if (signature.requiredParameterCount == 0) {
+  if (type.parameterTypes.isEmpty) {
     // If parameters is empty, use return type.
-    return signature.type.returnType;
+    return type.returnType;
   } else {
     // Otherwise use the first argument type.
-    return signature.requiredParameters.first.type;
+    return type.parameterTypes.first;
   }
 }
 
 void main() {
-  testAsInstanceOf();
-  testTypeSubstitution();
+  asyncTest(() async {
+    await testAsInstanceOf();
+    await testTypeSubstitution();
+  });
 }
 
-void testAsInstanceOf() {
-  asyncTest(() => TypeEnvironment.create('''
+testAsInstanceOf() async {
+  var env = await TypeEnvironment.create('''
       class A<T> {}
       class B<T> {}
       class C<T> extends A<T> {}
       class D<T> extends A<int> {}
       class E<T> extends A<A<T>> {}
       class F<T, U> extends B<F<T, String>> implements A<F<B<U>, int>> {}
-      ''').then((env) {
-        ClassElement A = env.getElement("A");
-        ClassElement B = env.getElement("B");
-        ClassElement C = env.getElement("C");
-        ClassElement D = env.getElement("D");
-        ClassElement E = env.getElement("E");
-        ClassElement F = env.getElement("F");
+      ''', mainSource: '''
+      main() {
+        new A();
+        new B();
+        new C();
+        new D();
+        new E();
+        new F();
+      }
+      ''');
+  ClassEntity A = env.getElement("A");
+  ClassEntity B = env.getElement("B");
+  ClassEntity C = env.getElement("C");
+  ClassEntity D = env.getElement("D");
+  ClassEntity E = env.getElement("E");
+  ClassEntity F = env.getElement("F");
 
-        ResolutionDartType intType = env['int'];
-        ResolutionDartType stringType = env['String'];
+  DartType intType = env['int'];
+  DartType stringType = env['String'];
 
-        ResolutionInterfaceType C_int = instantiate(C, [intType]);
-        Expect.equals(instantiate(C, [intType]), C_int);
-        Expect.equals(instantiate(A, [intType]), C_int.asInstanceOf(A));
+  InterfaceType C_int = instantiate(C, [intType]);
+  Expect.equals(instantiate(C, [intType]), C_int);
+  Expect.equals(instantiate(A, [intType]), env.types.asInstanceOf(C_int, A));
 
-        ResolutionInterfaceType D_int = instantiate(D, [stringType]);
-        Expect.equals(instantiate(A, [intType]), D_int.asInstanceOf(A));
+  InterfaceType D_int = instantiate(D, [stringType]);
+  Expect.equals(instantiate(A, [intType]), env.types.asInstanceOf(D_int, A));
 
-        ResolutionInterfaceType E_int = instantiate(E, [intType]);
-        Expect.equals(
-            instantiate(A, [
-              instantiate(A, [intType])
-            ]),
-            E_int.asInstanceOf(A));
+  InterfaceType E_int = instantiate(E, [intType]);
+  Expect.equals(
+      instantiate(A, [
+        instantiate(A, [intType])
+      ]),
+      env.types.asInstanceOf(E_int, A));
 
-        ResolutionInterfaceType F_int_string =
-            instantiate(F, [intType, stringType]);
-        Expect.equals(
-            instantiate(B, [
-              instantiate(F, [intType, stringType])
-            ]),
-            F_int_string.asInstanceOf(B));
-        Expect.equals(
-            instantiate(A, [
-              instantiate(F, [
-                instantiate(B, [stringType]),
-                intType
-              ])
-            ]),
-            F_int_string.asInstanceOf(A));
-      }));
+  InterfaceType F_int_string = instantiate(F, [intType, stringType]);
+  Expect.equals(
+      instantiate(B, [
+        instantiate(F, [intType, stringType])
+      ]),
+      env.types.asInstanceOf(F_int_string, B));
+  Expect.equals(
+      instantiate(A, [
+        instantiate(F, [
+          instantiate(B, [stringType]),
+          intType
+        ])
+      ]),
+      env.types.asInstanceOf(F_int_string, A));
 }
 
 /**
@@ -97,16 +105,20 @@
  * through [name1] is the same as the type found through [name2].
  */
 void testSubstitution(
-    compiler, arguments, parameters, String name1, String name2) {
-  ResolutionDartType type1 = getType(compiler, name1);
-  ResolutionDartType type2 = getType(compiler, name2);
-  ResolutionDartType subst = type1.subst(arguments, parameters);
+    ElementEnvironment elementEnvironment,
+    List<DartType> arguments,
+    List<DartType> parameters,
+    String name1,
+    String name2) {
+  DartType type1 = getType(elementEnvironment, name1);
+  DartType type2 = getType(elementEnvironment, name2);
+  DartType subst = type1.subst(arguments, parameters);
   Expect.equals(
       type2, subst, "$type1.subst($arguments,$parameters)=$subst != $type2");
 }
 
-void testTypeSubstitution() {
-  asyncTest(() => TypeEnvironment.create(r"""
+testTypeSubstitution() async {
+  var env = await TypeEnvironment.create(r"""
       typedef void Typedef1<X,Y>(X x1, Y y2);
       typedef void Typedef2<Z>(Z z1);
 
@@ -158,99 +170,96 @@
         void Typedef1e(Typedef2<S> a) {}
         void Typedef2e(Typedef2<String> b) {}
       }
-      """).then((env) {
-        var compiler = env.compiler;
+      """);
+  InterfaceType Class_T_S = env["Class"];
+  Expect.isNotNull(Class_T_S);
+  Expect.isTrue(Class_T_S.isInterfaceType);
+  Expect.equals(2, Class_T_S.typeArguments.length);
 
-        ResolutionInterfaceType Class_T_S = env["Class"];
-        Expect.isNotNull(Class_T_S);
-        Expect.identical(Class_T_S.kind, ResolutionTypeKind.INTERFACE);
-        Expect.equals(2, Class_T_S.typeArguments.length);
+  DartType T = Class_T_S.typeArguments[0];
+  Expect.isNotNull(T);
+  Expect.isTrue(T.isTypeVariable);
 
-        ResolutionDartType T = Class_T_S.typeArguments[0];
-        Expect.isNotNull(T);
-        Expect.identical(T.kind, ResolutionTypeKind.TYPE_VARIABLE);
+  DartType S = Class_T_S.typeArguments[1];
+  Expect.isNotNull(S);
+  Expect.isTrue(S.isTypeVariable);
 
-        ResolutionDartType S = Class_T_S.typeArguments[1];
-        Expect.isNotNull(S);
-        Expect.identical(S.kind, ResolutionTypeKind.TYPE_VARIABLE);
+  DartType intType = env['int']; //getType(compiler, "int1");
+  Expect.isNotNull(intType);
+  Expect.isTrue(intType.isInterfaceType);
 
-        ResolutionDartType intType = env['int']; //getType(compiler, "int1");
-        Expect.isNotNull(intType);
-        Expect.identical(intType.kind, ResolutionTypeKind.INTERFACE);
+  DartType StringType = env['String']; //getType(compiler, "String1");
+  Expect.isNotNull(StringType);
+  Expect.isTrue(StringType.isInterfaceType);
 
-        ResolutionDartType StringType =
-            env['String']; //getType(compiler, "String1");
-        Expect.isNotNull(StringType);
-        Expect.identical(StringType.kind, ResolutionTypeKind.INTERFACE);
+  List<DartType> parameters = <DartType>[T, S];
+  List<DartType> arguments = <DartType>[intType, StringType];
 
-        List<ResolutionDartType> parameters = <ResolutionDartType>[T, S];
-        List<ResolutionDartType> arguments = <ResolutionDartType>[
-          intType,
-          StringType
-        ];
+  // TODO(johnniwinther): Create types directly from strings to improve
+  // test readability.
 
-        // TODO(johnniwinther): Create types directly from strings to improve
-        // test readability.
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, "void1", "void2");
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, "dynamic1", "dynamic2");
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, "int1", "int2");
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, "String1", "String2");
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, "ListInt1", "ListInt2");
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, "ListT1", "ListT2");
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, "ListS1", "ListS2");
+  testSubstitution(env.elementEnvironment, arguments, parameters, "ListListT1",
+      "ListListT2");
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, "ListRaw1", "ListRaw2");
+  testSubstitution(env.elementEnvironment, arguments, parameters,
+      "ListDynamic1", "ListDynamic2");
+  testSubstitution(env.elementEnvironment, arguments, parameters,
+      "MapIntString1", "MapIntString2");
+  testSubstitution(env.elementEnvironment, arguments, parameters, "MapTString1",
+      "MapTString2");
+  testSubstitution(env.elementEnvironment, arguments, parameters,
+      "MapDynamicString1", "MapDynamicString2");
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, "TypeVarT1", "TypeVarT2");
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, "TypeVarS1", "TypeVarS2");
+  testSubstitution(env.elementEnvironment, arguments, parameters, "Function1a",
+      "Function2a");
+  testSubstitution(env.elementEnvironment, arguments, parameters, "Function1b",
+      "Function2b");
+  testSubstitution(env.elementEnvironment, arguments, parameters, "Function1c",
+      "Function2c");
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, "Typedef1a", "Typedef2a");
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, "Typedef1b", "Typedef2b");
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, "Typedef1c", "Typedef2c");
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, "Typedef1d", "Typedef2d");
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, "Typedef1e", "Typedef2e");
 
-        testSubstitution(compiler, arguments, parameters, "void1", "void2");
-        testSubstitution(
-            compiler, arguments, parameters, "dynamic1", "dynamic2");
-        testSubstitution(compiler, arguments, parameters, "int1", "int2");
-        testSubstitution(compiler, arguments, parameters, "String1", "String2");
-        testSubstitution(
-            compiler, arguments, parameters, "ListInt1", "ListInt2");
-        testSubstitution(compiler, arguments, parameters, "ListT1", "ListT2");
-        testSubstitution(compiler, arguments, parameters, "ListS1", "ListS2");
-        testSubstitution(
-            compiler, arguments, parameters, "ListListT1", "ListListT2");
-        testSubstitution(
-            compiler, arguments, parameters, "ListRaw1", "ListRaw2");
-        testSubstitution(
-            compiler, arguments, parameters, "ListDynamic1", "ListDynamic2");
-        testSubstitution(
-            compiler, arguments, parameters, "MapIntString1", "MapIntString2");
-        testSubstitution(
-            compiler, arguments, parameters, "MapTString1", "MapTString2");
-        testSubstitution(compiler, arguments, parameters, "MapDynamicString1",
-            "MapDynamicString2");
-        testSubstitution(
-            compiler, arguments, parameters, "TypeVarT1", "TypeVarT2");
-        testSubstitution(
-            compiler, arguments, parameters, "TypeVarS1", "TypeVarS2");
-        testSubstitution(
-            compiler, arguments, parameters, "Function1a", "Function2a");
-        testSubstitution(
-            compiler, arguments, parameters, "Function1b", "Function2b");
-        testSubstitution(
-            compiler, arguments, parameters, "Function1c", "Function2c");
-        testSubstitution(
-            compiler, arguments, parameters, "Typedef1a", "Typedef2a");
-        testSubstitution(
-            compiler, arguments, parameters, "Typedef1b", "Typedef2b");
-        testSubstitution(
-            compiler, arguments, parameters, "Typedef1c", "Typedef2c");
-        testSubstitution(
-            compiler, arguments, parameters, "Typedef1d", "Typedef2d");
-        testSubstitution(
-            compiler, arguments, parameters, "Typedef1e", "Typedef2e");
+  // Substitution in unalias.
+  DartType Typedef2_int_String = getType(env.elementEnvironment, "Typedef2a");
+  Expect.isNotNull(Typedef2_int_String);
+  DartType Function_int_String = getType(env.elementEnvironment, "Function2b");
+  Expect.isNotNull(Function_int_String);
+  DartType unalias1 = Typedef2_int_String.unaliased;
+  Expect.equals(Function_int_String, unalias1,
+      '$Typedef2_int_String.unalias=$unalias1 != $Function_int_String');
 
-        // Substitution in unalias.
-        ResolutionDartType Typedef2_int_String = getType(compiler, "Typedef2a");
-        Expect.isNotNull(Typedef2_int_String);
-        ResolutionDartType Function_int_String =
-            getType(compiler, "Function2b");
-        Expect.isNotNull(Function_int_String);
-        ResolutionDartType unalias1 = Typedef2_int_String.unaliased;
-        Expect.equals(Function_int_String, unalias1,
-            '$Typedef2_int_String.unalias=$unalias1 != $Function_int_String');
-
-        ResolutionDartType Typedef1 = getType(compiler, "Typedef1c");
-        Expect.isNotNull(Typedef1);
-        ResolutionDartType Function_dynamic_dynamic =
-            getType(compiler, "Function1c");
-        Expect.isNotNull(Function_dynamic_dynamic);
-        ResolutionDartType unalias2 = Typedef1.unaliased;
-        Expect.equals(Function_dynamic_dynamic, unalias2,
-            '$Typedef1.unalias=$unalias2 != $Function_dynamic_dynamic');
-      }));
+  DartType Typedef1 = getType(env.elementEnvironment, "Typedef1c");
+  Expect.isNotNull(Typedef1);
+  DartType Function_dynamic_dynamic =
+      getType(env.elementEnvironment, "Function1c");
+  Expect.isNotNull(Function_dynamic_dynamic);
+  DartType unalias2 = Typedef1.unaliased;
+  Expect.equals(Function_dynamic_dynamic, unalias2,
+      '$Typedef1.unalias=$unalias2 != $Function_dynamic_dynamic');
 }
diff --git a/tests/compiler/dart2js/model/world_test.dart b/tests/compiler/dart2js/model/world_test.dart
index 70332ce..e56ce30 100644
--- a/tests/compiler/dart2js/model/world_test.dart
+++ b/tests/compiler/dart2js/model/world_test.dart
@@ -14,22 +14,20 @@
 import '../type_test_helper.dart';
 
 void main() {
-  runTests(CompileMode compileMode) async {
-    await testClassSets(compileMode);
-    await testProperties(compileMode);
-    await testNativeClasses(compileMode);
-    await testCommonSubclasses(compileMode);
+  runTests() async {
+    await testClassSets();
+    await testProperties();
+    await testNativeClasses();
+    await testCommonSubclasses();
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(CompileMode.memory);
     print('--test from kernel------------------------------------------------');
-    await runTests(CompileMode.kernel);
+    await runTests();
   });
 }
 
-testClassSets(CompileMode compileMode) async {
+testClassSets() async {
   var env = await TypeEnvironment.create(r"""
       class A implements X {}
       class B {}
@@ -53,7 +51,7 @@
         html.window;
         new html.Worker('');
       }
-      """, compileMode: compileMode);
+      """);
   ClosedWorld closedWorld = env.closedWorld;
   ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
 
@@ -189,7 +187,7 @@
   testMixinUses(X, []);
 }
 
-testProperties(CompileMode compileMode) async {
+testProperties() async {
   var env = await TypeEnvironment.create(r"""
       class A {}
       class A1 extends A {}
@@ -244,7 +242,7 @@
         new G3();
         new H4();
       }
-      """, compileMode: compileMode);
+      """);
   ClosedWorld closedWorld = env.closedWorld;
 
   check(String name, {bool hasStrictSubtype, bool hasOnlySubclasses}) {
@@ -310,9 +308,8 @@
   check("H4", hasStrictSubtype: false, hasOnlySubclasses: true);
 }
 
-testNativeClasses(CompileMode compileMode) async {
-  var env = await TypeEnvironment.create('',
-      mainSource: r"""
+testNativeClasses() async {
+  var env = await TypeEnvironment.create('', mainSource: r"""
       import 'dart:html' as html;
       main() {
         html.window; // Creates 'Window'.
@@ -320,8 +317,7 @@
         new html.CanvasElement() // Creates CanvasElement
             ..getContext(''); // Creates CanvasRenderingContext2D
       }
-      """,
-      compileMode: compileMode);
+      """);
   ClosedWorld closedWorld = env.closedWorld;
   ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
   LibraryEntity dart_html = elementEnvironment.lookupLibrary(Uris.dart_html);
@@ -520,9 +516,8 @@
       instantiatedSubtypeCount: 0);
 }
 
-testCommonSubclasses(CompileMode compileMode) async {
-  var env = await TypeEnvironment.create('',
-      mainSource: r"""
+testCommonSubclasses() async {
+  var env = await TypeEnvironment.create('', mainSource: r"""
       class A {}
       class B {}
       class C extends A {}
@@ -545,8 +540,7 @@
         new I();
         new J();
       }
-      """,
-      compileMode: compileMode);
+      """);
   ClosedWorld closedWorld = env.closedWorld;
 
   ClassEntity A = env.getElement("A");
diff --git a/tests/compiler/dart2js/needs_no_such_method_test.dart b/tests/compiler/dart2js/needs_no_such_method_test.dart
index 01e467e..e216047 100644
--- a/tests/compiler/dart2js/needs_no_such_method_test.dart
+++ b/tests/compiler/dart2js/needs_no_such_method_test.dart
@@ -14,10 +14,8 @@
 
 void main() {
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await testClassSets(CompileMode.memory);
     print('--test from kernel------------------------------------------------');
-    await testClassSets(CompileMode.kernel);
+    await testClassSets();
   });
 }
 
@@ -33,7 +31,7 @@
 }
 """;
 
-testClassSets(CompileMode compileMode) async {
+testClassSets() async {
   Selector foo, bar, baz;
   ClosedWorld closedWorld;
   ClassEntity superclass, subclass, subtype;
@@ -48,8 +46,8 @@
     main.write('}');
     testMode = '$instantiated';
 
-    var env = await TypeEnvironment.create(CLASSES,
-        mainSource: main.toString(), compileMode: compileMode);
+    var env =
+        await TypeEnvironment.create(CLASSES, mainSource: main.toString());
     foo = new Selector.call(const PublicName('foo'), CallStructure.NO_ARGS);
     bar = new Selector.call(const PublicName('bar'), CallStructure.NO_ARGS);
     baz = new Selector.call(const PublicName('baz'), CallStructure.NO_ARGS);
diff --git a/tests/compiler/dart2js/no_such_method_enabled_test.dart b/tests/compiler/dart2js/no_such_method_enabled_test.dart
index 68ff7c5..1142b92 100644
--- a/tests/compiler/dart2js/no_such_method_enabled_test.dart
+++ b/tests/compiler/dart2js/no_such_method_enabled_test.dart
@@ -3,7 +3,6 @@
 // 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';
@@ -206,23 +205,20 @@
 ];
 
 main() {
-  runTests({bool useKernel}) async {
+  runTests() async {
     for (NoSuchMethodTest test in TESTS) {
       print('---- testing -------------------------------------------------');
       print(test.code);
-      CompilationResult result = await runCompiler(
-          memorySourceFiles: {'main.dart': test.code},
-          options: useKernel ? [] : [Flags.useOldFrontend]);
+      CompilationResult result =
+          await runCompiler(memorySourceFiles: {'main.dart': test.code});
       Compiler compiler = result.compiler;
       checkTest(compiler, test);
     }
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
 
diff --git a/tests/compiler/dart2js/old_frontend/analyze_all_test.dart b/tests/compiler/dart2js/old_frontend/analyze_all_test.dart
deleted file mode 100644
index 4936c1c..0000000
--- a/tests/compiler/dart2js/old_frontend/analyze_all_test.dart
+++ /dev/null
@@ -1,112 +0,0 @@
-// 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.
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/diagnostics/messages.dart';
-import 'package:expect/expect.dart';
-import '../memory_compiler.dart';
-
-const String SOURCE = """
-class Foo {
-  // Deliberately not const to ensure compile error.
-  Foo(_);
-}
-
-@Bar()
-class Bar {
-  const Bar();
-}
-
-@Foo('x')
-typedef void VoidFunction();
-
-@Foo('y')
-class MyClass {}
-
-main() {
-}
-""";
-
-Future<DiagnosticCollector> run(String source,
-    {bool analyzeAll, bool expectSuccess}) async {
-  DiagnosticCollector collector = new DiagnosticCollector();
-
-  List<String> options = [Flags.useOldFrontend];
-  if (analyzeAll) {
-    options.add(Flags.analyzeAll);
-  } else {
-    options.add(Flags.analyzeOnly);
-  }
-  CompilationResult result = await runCompiler(
-      memorySourceFiles: {'main.dart': source},
-      diagnosticHandler: collector,
-      options: options);
-  Expect.equals(expectSuccess, result.isSuccess);
-  return collector;
-}
-
-test1() async {
-  DiagnosticCollector collector =
-      await run(SOURCE, analyzeAll: false, expectSuccess: true);
-  Expect.isTrue(
-      collector.warnings.isEmpty, 'Unexpected warnings: ${collector.warnings}');
-  Expect.isTrue(
-      collector.errors.isEmpty, 'Unexpected errors: ${collector.errors}');
-}
-
-test2() async {
-  DiagnosticCollector collector =
-      await run(SOURCE, analyzeAll: true, expectSuccess: false);
-
-  Expect.isTrue(
-      collector.warnings.isEmpty, 'unexpected warnings: ${collector.warnings}');
-  Expect.equals(2, collector.errors.length,
-      'expected exactly two errors, but got ${collector.errors}');
-
-  CollectedMessage first = collector.errors.first;
-  Expect.equals(MessageKind.CONSTRUCTOR_IS_NOT_CONST, first.message.kind);
-  Expect.equals("Foo", SOURCE.substring(first.begin, first.end));
-
-  CollectedMessage second = collector.errors.elementAt(1);
-  Expect.equals(MessageKind.CONSTRUCTOR_IS_NOT_CONST, second.message.kind);
-  Expect.equals("Foo", SOURCE.substring(second.begin, second.end));
-}
-
-// This is a regression test, testing that we can handle annotations on
-// malformed elements. Depending on the order of analysis, annotations on such
-// elements might not be resolved which caused a crash when trying to detect
-// a `@NoInline()` annotation.
-test3() async {
-  String source = '''
-import 'package:expect/expect.dart';
-
-class A {
-  @NoInline
-  m() {
-    => print(0);
-  }
-}
-
-@NoInline()
-main() => new A().m();
-''';
-
-  DiagnosticCollector collector =
-      await run(source, analyzeAll: true, expectSuccess: false);
-
-  Expect.isTrue(
-      collector.warnings.isEmpty, 'unexpected warnings: ${collector.warnings}');
-  Expect.equals(1, collector.errors.length,
-      'expected exactly one error, but got ${collector.errors}');
-}
-
-main() {
-  asyncTest(() async {
-    await test1();
-    await test2();
-    await test3();
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/analyze_api_test.dart b/tests/compiler/dart2js/old_frontend/analyze_api_test.dart
deleted file mode 100644
index 678e798..0000000
--- a/tests/compiler/dart2js/old_frontend/analyze_api_test.dart
+++ /dev/null
@@ -1,38 +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.
-
-library analyze_api;
-
-import 'package:sdk_library_metadata/libraries.dart';
-import 'analyze_helper.dart';
-import 'package:async_helper/async_helper.dart';
-
-/**
- * Map of white-listed warnings and errors.
- *
- * Only add a white-listing together with a bug report to dartbug.com and add
- * the bug issue number as a comment on the white-listing.
- *
- * Use an identifiable suffix of the file uri as key. Use a fixed substring of
- * the error/warning message in the list of white-listings for each file.
- */
-// TODO(johnniwinther): Support canonical URIs as keys.
-const Map<String, List<String>> WHITE_LIST = const {
-  "sdk/lib/io/file.dart": const [
-    "'void' is not a subtype of bound 'Object' for type variable",
-  ],
-  "sdk/lib/io/file_impl.dart": const [
-    "'void' is not a subtype of bound 'Object' for type variable",
-  ],
-};
-
-void main() {
-  var uriList = new List<Uri>();
-  libraries.forEach((String name, LibraryInfo info) {
-    if (info.documented) {
-      uriList.add(new Uri(scheme: 'dart', path: name));
-    }
-  });
-  asyncTest(() => analyze(uriList, WHITE_LIST, mode: AnalysisMode.ALL));
-}
diff --git a/tests/compiler/dart2js/old_frontend/analyze_dart2js_helpers_test.dart b/tests/compiler/dart2js/old_frontend/analyze_dart2js_helpers_test.dart
deleted file mode 100644
index 7ff112a..0000000
--- a/tests/compiler/dart2js/old_frontend/analyze_dart2js_helpers_test.dart
+++ /dev/null
@@ -1,219 +0,0 @@
-// Copyright (c) 2015, 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 dart2js.analyze_helpers.test;
-
-import 'dart:io';
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/compiler_new.dart' show Diagnostic;
-import 'package:compiler/src/apiimpl.dart' show CompilerImpl;
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/constants/expressions.dart'
-    show ConstructedConstantExpression;
-import 'package:compiler/src/elements/resolution_types.dart'
-    show ResolutionInterfaceType;
-import 'package:compiler/src/diagnostics/source_span.dart' show SourceSpan;
-import 'package:compiler/src/elements/elements.dart';
-import 'package:compiler/src/filenames.dart' show nativeToUriPath;
-import 'package:compiler/src/resolution/semantic_visitor.dart';
-import 'package:compiler/src/resolution/tree_elements.dart' show TreeElements;
-import 'package:compiler/src/source_file_provider.dart'
-    show FormattingDiagnosticHandler;
-import 'package:compiler/src/tree/tree.dart';
-import 'package:compiler/src/universe/call_structure.dart' show CallStructure;
-import 'package:expect/expect.dart';
-
-import '../memory_compiler.dart';
-
-main(List<String> arguments) {
-  bool verbose = arguments.contains('-v');
-
-  List<String> options = <String>[
-    Flags.useOldFrontend,
-    Flags.analyzeOnly,
-    Flags.analyzeMain,
-    '--categories=Client,Server'
-  ];
-  if (verbose) {
-    options.add(Flags.verbose);
-  }
-  asyncTest(() async {
-    CompilerImpl compiler =
-        compilerFor(options: options, showDiagnostics: verbose);
-    FormattingDiagnosticHandler diagnostics =
-        new FormattingDiagnosticHandler(compiler.provider);
-    Directory dir =
-        new Directory.fromUri(Uri.base.resolve('pkg/compiler/lib/'));
-    String helpersUriPrefix = dir.uri.resolve('src/helpers/').toString();
-    HelperAnalyzer analyzer = new HelperAnalyzer(diagnostics, helpersUriPrefix);
-    LibraryElement helperLibrary;
-    for (FileSystemEntity entity in dir.listSync(recursive: true)) {
-      if (entity is File && entity.path.endsWith('.dart')) {
-        Uri file = Uri.base.resolve(nativeToUriPath(entity.path));
-        if (verbose) {
-          print('---- analyzing $file ----');
-        }
-        LibraryElement library = await compiler.analyzeUri(file);
-        if (library != null) {
-          if (library.libraryName == 'dart2js.helpers') {
-            helperLibrary = library;
-          }
-          library.forEachLocalMember((Element element) {
-            if (element is ClassElement) {
-              element.forEachLocalMember((_member) {
-                AstElement member = _member;
-                analyzer.analyze(member.resolvedAst);
-              });
-            } else if (element is MemberElement) {
-              analyzer.analyze(element.resolvedAst);
-            }
-          });
-        }
-      }
-    }
-    Expect.isNotNull(helperLibrary, 'Helper library not found');
-    Expect.isTrue(analyzer.isHelper(helperLibrary),
-        "Helper library $helperLibrary is not considered a helper.");
-    Expect.isTrue(analyzer.errors.isEmpty, "Errors found.");
-  });
-}
-
-class HelperAnalyzer extends TraversalVisitor {
-  final FormattingDiagnosticHandler diagnostics;
-  final String helpersUriPrefix;
-  List<SourceSpan> errors = <SourceSpan>[];
-
-  ResolvedAst resolvedAst;
-
-  @override
-  TreeElements get elements => resolvedAst.elements;
-
-  AnalyzableElement get analyzedElement => resolvedAst.element;
-
-  HelperAnalyzer(this.diagnostics, this.helpersUriPrefix) : super(null);
-
-  @override
-  void apply(Node node, [_]) {
-    node.accept(this);
-  }
-
-  void analyze(ResolvedAst resolvedAst) {
-    if (resolvedAst.kind != ResolvedAstKind.PARSED) {
-      // Skip synthesized members.
-      return;
-    }
-    this.resolvedAst = resolvedAst;
-    apply(resolvedAst.node);
-    this.resolvedAst = null;
-  }
-
-  bool isHelper(Element element) {
-    Uri uri = element.library.canonicalUri;
-    return '$uri'.startsWith(helpersUriPrefix);
-  }
-
-  void checkAccess(Node node, MemberElement element) {
-    if (isHelper(element) && !isHelper(analyzedElement)) {
-      Uri uri = analyzedElement.implementation.sourcePosition.uri;
-      SourceSpan span = new SourceSpan.fromNode(uri, node);
-      diagnostics.report(null, span.uri, span.begin, span.end,
-          "Helper used in production code.", Diagnostic.ERROR);
-      errors.add(span);
-    }
-  }
-
-  @override
-  void visitTopLevelFieldInvoke(Send node, FieldElement field,
-      NodeList arguments, CallStructure callStructure, _) {
-    checkAccess(node, field);
-    apply(arguments);
-  }
-
-  @override
-  void visitTopLevelGetterInvoke(Send node, GetterElement getter,
-      NodeList arguments, CallStructure callStructure, _) {
-    checkAccess(node, getter);
-    apply(arguments);
-  }
-
-  @override
-  void visitTopLevelFunctionInvoke(Send node, MethodElement method,
-      NodeList arguments, CallStructure callStructure, _) {
-    checkAccess(node, method);
-    apply(arguments);
-  }
-
-  @override
-  void visitTopLevelFieldGet(Send node, FieldElement field, _) {
-    checkAccess(node, field);
-  }
-
-  @override
-  void visitTopLevelGetterGet(Send node, GetterElement getter, _) {
-    checkAccess(node, getter);
-  }
-
-  @override
-  void visitTopLevelFunctionGet(Send node, MethodElement method, _) {
-    checkAccess(node, method);
-  }
-
-  @override
-  void visitGenerativeConstructorInvoke(
-      NewExpression node,
-      ConstructorElement constructor,
-      ResolutionInterfaceType type,
-      NodeList arguments,
-      CallStructure callStructure,
-      _) {
-    checkAccess(node, constructor);
-    apply(arguments);
-  }
-
-  @override
-  void visitRedirectingGenerativeConstructorInvoke(
-      NewExpression node,
-      ConstructorElement constructor,
-      ResolutionInterfaceType type,
-      NodeList arguments,
-      CallStructure callStructure,
-      _) {
-    checkAccess(node, constructor);
-    apply(arguments);
-  }
-
-  @override
-  void visitFactoryConstructorInvoke(
-      NewExpression node,
-      ConstructorElement constructor,
-      ResolutionInterfaceType type,
-      NodeList arguments,
-      CallStructure callStructure,
-      _) {
-    checkAccess(node, constructor);
-    apply(arguments);
-  }
-
-  @override
-  void visitRedirectingFactoryConstructorInvoke(
-      NewExpression node,
-      ConstructorElement constructor,
-      ResolutionInterfaceType type,
-      ConstructorElement effectiveTarget,
-      ResolutionInterfaceType effectiveTargetType,
-      NodeList arguments,
-      CallStructure callStructure,
-      _) {
-    checkAccess(node, constructor);
-    apply(arguments);
-  }
-
-  @override
-  void visitConstConstructorInvoke(
-      NewExpression node, ConstructedConstantExpression constant, _) {
-    ConstructorElement constructor = constant.target;
-    checkAccess(node, constructor);
-  }
-}
diff --git a/tests/compiler/dart2js/old_frontend/analyze_helper.dart b/tests/compiler/dart2js/old_frontend/analyze_helper.dart
deleted file mode 100644
index 84dc1c1..0000000
--- a/tests/compiler/dart2js/old_frontend/analyze_helper.dart
+++ /dev/null
@@ -1,298 +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.
-
-library analyze_helper;
-
-import 'dart:async';
-import 'dart:io';
-import 'package:compiler/compiler.dart' as api;
-import 'package:compiler/src/apiimpl.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/diagnostics/messages.dart'
-    show Message, MessageKind;
-import 'package:compiler/src/filenames.dart';
-import 'package:compiler/src/options.dart' show CompilerOptions;
-import 'package:compiler/src/source_file_provider.dart';
-import 'package:compiler/src/util/uri_extras.dart';
-import '../diagnostic_helper.dart';
-
-/// Option for hiding whitelisted messages.
-const String HIDE_WHITELISTED = '--hide-whitelisted';
-
-/**
- * Map of whitelisted warnings and errors.
- *
- * Only add a whitelisting together with a bug report to dartbug.com and add
- * the bug issue number as a comment on the whitelisting.
- *
- * Use an identifiable suffix of the file uri as key. Use a fixed substring of
- * the error/warning message in the list of whitelistings for each file.
- */
-// TODO(johnniwinther): Support canonical URIs as keys and message kinds as
-// values.
-
-class CollectingDiagnosticHandler extends FormattingDiagnosticHandler {
-  bool hasWarnings = false;
-  bool hasHint = false;
-  bool hasErrors = false;
-  bool lastWasWhitelisted = false;
-  bool showWhitelisted = true;
-
-  Map<String, Map<dynamic /* String|MessageKind */, int>> whiteListMap =
-      new Map<String, Map<dynamic /* String|MessageKind */, int>>();
-  List<MessageKind> skipList;
-  List<CollectedMessage> collectedMessages = <CollectedMessage>[];
-
-  CollectingDiagnosticHandler(
-      Map<String, List /* <String|MessageKind> */ > whiteList,
-      this.skipList,
-      SourceFileProvider provider)
-      : super(provider) {
-    whiteList
-        .forEach((String file, List /* <String|MessageKind> */ messageParts) {
-      var useMap = new Map<dynamic /* String|MessageKind */, int>();
-      for (var messagePart in messageParts) {
-        useMap[messagePart] = 0;
-      }
-      whiteListMap[file] = useMap;
-    });
-  }
-
-  bool checkResults() {
-    bool validWhiteListUse = checkWhiteListUse();
-    reportWhiteListUse();
-    reportCollectedMessages();
-    return !hasWarnings && !hasHint && !hasErrors && validWhiteListUse;
-  }
-
-  bool checkWhiteListUse() {
-    bool allUsed = true;
-    for (String file in whiteListMap.keys) {
-      for (var messagePart in whiteListMap[file].keys) {
-        if (whiteListMap[file][messagePart] == 0) {
-          print("Whitelisting '$messagePart' is unused in '$file'. "
-              "Remove the whitelisting from the whitelist map.");
-          allUsed = false;
-        }
-      }
-    }
-    return allUsed;
-  }
-
-  void reportCollectedMessages() {
-    if (collectedMessages.isNotEmpty) {
-      print('----------------------------------------------------------------');
-      print('Unexpected messages:');
-      print('----------------------------------------------------------------');
-      for (CollectedMessage message in collectedMessages) {
-        super.report(message.message, message.uri, message.begin, message.end,
-            message.text, message.kind);
-      }
-      print('----------------------------------------------------------------');
-    }
-  }
-
-  void reportWhiteListUse() {
-    for (String file in whiteListMap.keys) {
-      for (var messagePart in whiteListMap[file].keys) {
-        int useCount = whiteListMap[file][messagePart];
-        print("Whitelisted message '$messagePart' suppressed $useCount "
-            "time(s) in '$file'.");
-      }
-    }
-  }
-
-  bool checkWhiteList(Uri uri, Message message, String text) {
-    if (uri == null) {
-      return false;
-    }
-    if (skipList.contains(message.kind)) {
-      return true;
-    }
-    String path = uri.path;
-    for (String file in whiteListMap.keys) {
-      if (path.contains(file)) {
-        for (var messagePart in whiteListMap[file].keys) {
-          bool found = false;
-          if (messagePart is String) {
-            found = text.contains(messagePart);
-          } else {
-            assert(messagePart is MessageKind);
-            found = message.kind == messagePart;
-          }
-          if (found) {
-            whiteListMap[file][messagePart]++;
-            return true;
-          }
-        }
-      }
-    }
-    return false;
-  }
-
-  @override
-  void report(covariant Message message, Uri uri, int begin, int end,
-      String text, api.Diagnostic kind) {
-    if (kind == api.Diagnostic.WARNING) {
-      if (checkWhiteList(uri, message, text)) {
-        // Suppress whitelisted warnings.
-        lastWasWhitelisted = true;
-        if (showWhitelisted || verbose) {
-          print("*already whitelisted*");
-          super.report(message, uri, begin, end, text, kind);
-        }
-        return;
-      }
-      print("*NOT WHITELISTED*");
-      hasWarnings = true;
-    }
-    if (kind == api.Diagnostic.HINT) {
-      if (checkWhiteList(uri, message, text)) {
-        // Suppress whitelisted hints.
-        lastWasWhitelisted = true;
-        if (showWhitelisted || verbose) {
-          print("*already whitelisted*");
-          super.report(message, uri, begin, end, text, kind);
-        }
-        return;
-      }
-      print("*NOT WHITELISTED*");
-      hasHint = true;
-    }
-    if (kind == api.Diagnostic.ERROR) {
-      if (checkWhiteList(uri, message, text)) {
-        // Suppress whitelisted errors.
-        lastWasWhitelisted = true;
-        if (showWhitelisted || verbose) {
-          print("*already whitelisted*");
-          super.report(message, uri, begin, end, text, kind);
-        }
-        return;
-      }
-      print("*NOT WHITELISTED*");
-      hasErrors = true;
-    }
-    if (kind == api.Diagnostic.INFO && lastWasWhitelisted) {
-      return;
-    }
-    lastWasWhitelisted = false;
-    if (kind != api.Diagnostic.VERBOSE_INFO) {
-      collectedMessages
-          .add(new CollectedMessage(message, uri, begin, end, text, kind));
-    }
-    super.report(message, uri, begin, end, text, kind);
-  }
-}
-
-typedef bool CheckResults(
-    CompilerImpl compiler, CollectingDiagnosticHandler handler);
-
-enum AnalysisMode {
-  /// Analyze all declarations in all libraries in one go.
-  ALL,
-
-  /// Analyze all declarations in the main library.
-  MAIN,
-
-  /// Analyze all declarations in the given URIs one at a time. This mode can
-  /// handle URIs for parts (i.e. skips these).
-  URI,
-
-  /// Analyze all declarations reachable from the entry point.
-  TREE_SHAKING,
-}
-
-/// Analyzes the file(s) in [uriList] using the provided [mode] and checks that
-/// no messages (errors, warnings or hints) are emitted.
-///
-/// Messages can be generally allowed using [skipList] or on a per-file basis
-/// using [whiteList].
-Future analyze(
-    List<Uri> uriList, Map<String, List /* <String|MessageKind> */ > whiteList,
-    {AnalysisMode mode: AnalysisMode.ALL,
-    CheckResults checkResults,
-    List<String> options: const <String>[],
-    List<MessageKind> skipList: const <MessageKind>[]}) async {
-  String testFileName =
-      relativize(Uri.base, Platform.script, Platform.isWindows);
-
-  print("""
-
-
-===
-=== NOTE: If this test fails, update [WHITE_LIST] in $testFileName
-===
-
-
-""");
-
-  var libraryRoot = currentDirectory.resolve('sdk/');
-  var packageConfig = currentDirectory.resolve('.packages');
-  var provider = new CompilerSourceFileProvider();
-  var handler = new CollectingDiagnosticHandler(whiteList, skipList, provider);
-  options = <String>[
-    Flags.useOldFrontend,
-    Flags.analyzeOnly,
-    '--categories=Client,Server',
-    Flags.showPackageWarnings
-  ]..addAll(options);
-  switch (mode) {
-    case AnalysisMode.URI:
-    case AnalysisMode.MAIN:
-      options.add(Flags.analyzeMain);
-      break;
-    case AnalysisMode.ALL:
-      options.add(Flags.analyzeAll);
-      break;
-    case AnalysisMode.TREE_SHAKING:
-      break;
-  }
-  if (options.contains(Flags.verbose)) {
-    handler.verbose = true;
-  }
-  if (options.contains(HIDE_WHITELISTED)) {
-    handler.showWhitelisted = false;
-  }
-  var compiler = new CompilerImpl(
-      provider,
-      null,
-      handler,
-      CompilerOptions.parse(options, libraryRoot: libraryRoot)
-        ..packageConfig = packageConfig
-        ..environment = {});
-  String MESSAGE = """
-
-
-===
-=== ERROR: Unexpected result of analysis.
-===
-=== Please update [WHITE_LIST] in $testFileName
-===
-""";
-
-  if (mode == AnalysisMode.URI) {
-    for (Uri uri in uriList) {
-      print('Analyzing uri: $uri');
-      await compiler.analyzeUri(uri);
-    }
-  } else if (mode != AnalysisMode.TREE_SHAKING) {
-    print('Analyzing libraries: $uriList');
-    compiler.librariesToAnalyzeWhenRun = uriList;
-    await compiler.run(null);
-  } else {
-    print('Analyzing entry point: ${uriList.single}');
-    await compiler.run(uriList.single);
-  }
-
-  bool result;
-  if (checkResults != null) {
-    result = checkResults(compiler, handler);
-  } else {
-    result = handler.checkResults();
-  }
-  if (!result) {
-    print(MESSAGE);
-    exit(1);
-  }
-}
diff --git a/tests/compiler/dart2js/old_frontend/analyze_only_test.dart b/tests/compiler/dart2js/old_frontend/analyze_only_test.dart
deleted file mode 100644
index e2e1f3b..0000000
--- a/tests/compiler/dart2js/old_frontend/analyze_only_test.dart
+++ /dev/null
@@ -1,175 +0,0 @@
-// 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.
-
-// Smoke test of the dart2js compiler API.
-library analyze_only;
-
-import 'dart:async';
-
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-
-import 'package:compiler/compiler_new.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/diagnostics/messages.dart'
-    show MessageKind, MessageTemplate;
-import 'package:compiler/src/old_to_new_api.dart';
-import 'package:compiler/src/options.dart';
-
-import '../../dart2js_extra/dummy_compiler_test.dart' as dummy;
-import '../output_collector.dart';
-
-runCompiler(String main, List<String> options,
-    onValue(String code, List errors, List warnings)) {
-  List errors = new List();
-  List warnings = new List();
-
-  Future<String> localProvider(Uri uri) {
-    if (uri.scheme != 'main') return dummy.provider(uri);
-    return new Future<String>.value(main);
-  }
-
-  void localHandler(
-      Uri uri, int begin, int end, String message, Diagnostic kind) {
-    dummy.handler(uri, begin, end, message, kind);
-    if (kind == Diagnostic.ERROR) {
-      errors.add(message);
-    } else if (kind == Diagnostic.WARNING) {
-      warnings.add(message);
-    }
-  }
-
-  options = [Flags.useOldFrontend]..addAll(options);
-  print('-----------------------------------------------');
-  print('main source:\n$main');
-  print('options: $options\n');
-  asyncStart();
-  OutputCollector outputCollector = new OutputCollector();
-  Future<CompilationResult> result = compile(
-      CompilerOptions.parse(options,
-          libraryRoot: new Uri(scheme: 'lib', path: '/'))
-        ..entryPoint = new Uri(scheme: 'main')
-        ..packageRoot = new Uri(scheme: 'package', path: '/'),
-      new LegacyCompilerInput(localProvider),
-      new LegacyCompilerDiagnostics(localHandler),
-      outputCollector);
-  result
-      .then((_) {
-        onValue(outputCollector.getOutput('', OutputType.js), errors, warnings);
-      }, onError: (e, st) {
-        throw 'Compilation failed: ${e} ${st}';
-      })
-      .then(asyncSuccess)
-      .catchError((error, stack) {
-        print('\n\n-----------------------------------------------');
-        print('main source:\n$main');
-        print('options: $options\n');
-        print('threw:\n $error\n$stack');
-        print('-----------------------------------------------\n\n');
-        throw error;
-      });
-}
-
-main() {
-  runCompiler("", [Flags.generateCodeWithCompileTimeErrors],
-      (String code, List errors, List warnings) {
-    Expect.isNotNull(code);
-    Expect.isTrue(errors.isEmpty, 'errors is not empty: $errors');
-    MessageTemplate template =
-        MessageTemplate.TEMPLATES[MessageKind.MISSING_MAIN];
-    Expect.equals("${template.message({'main': 'main'})}", warnings.single);
-  });
-
-  runCompiler("main() {}", [Flags.generateCodeWithCompileTimeErrors],
-      (String code, List errors, List warnings) {
-    Expect.isNotNull(code);
-    Expect.isTrue(errors.isEmpty);
-    Expect.isTrue(warnings.isEmpty);
-  });
-
-  runCompiler("", [Flags.analyzeOnly],
-      (String code, List errors, List warnings) {
-    Expect.isNull(code);
-    Expect.isTrue(errors.isEmpty, 'errors is not empty: $errors');
-    MessageTemplate template =
-        MessageTemplate.TEMPLATES[MessageKind.CONSIDER_ANALYZE_ALL];
-    Expect.equals("${template.message({'main': 'main'})}", warnings.single);
-  });
-
-  runCompiler("main() {}", [Flags.analyzeOnly],
-      (String code, List errors, List warnings) {
-    Expect.isNull(code);
-    Expect.isTrue(errors.isEmpty);
-    Expect.isTrue(warnings.isEmpty);
-  });
-
-  runCompiler("Foo foo; // Unresolved but not analyzed.", [Flags.analyzeOnly],
-      (String code, List errors, List warnings) {
-    Expect.isNull(code);
-    Expect.isTrue(errors.isEmpty, 'errors is not empty: $errors');
-    MessageTemplate template =
-        MessageTemplate.TEMPLATES[MessageKind.CONSIDER_ANALYZE_ALL];
-    Expect.equals("${template.message({'main': 'main'})}", warnings.single);
-  });
-
-  runCompiler("""main() {
-         Foo foo; // Unresolved and analyzed.
-       }""", [Flags.analyzeOnly], (String code, List errors, List warnings) {
-    Expect.isNull(code);
-    Expect.isTrue(errors.isEmpty);
-    Expect.equals(1, warnings.length);
-    Expect.equals("Cannot resolve type 'Foo'.", warnings[0].toString());
-  });
-
-  runCompiler("""main() {
-         Foo foo; // Unresolved and analyzed.
-       }""", [Flags.analyzeOnly, Flags.analyzeSignaturesOnly],
-      (String code, List errors, List warnings) {
-    Expect.isNull(code);
-    Expect.isTrue(errors.isEmpty);
-    Expect.isTrue(warnings.isEmpty);
-  });
-
-  runCompiler("Foo foo; // Unresolved and analyzed.", [
-    Flags.analyzeOnly,
-    Flags.analyzeAll
-  ], (String code, List errors, List warnings) {
-    Expect.isNull(code);
-    Expect.isTrue(errors.isEmpty);
-    Expect.equals("Cannot resolve type 'Foo'.", warnings[0].toString());
-  });
-
-  runCompiler("""Foo foo; // Unresolved and analyzed.
-       main() {}""", [Flags.analyzeOnly, Flags.analyzeAll],
-      (String code, List errors, List warnings) {
-    Expect.isNull(code);
-    Expect.isTrue(errors.isEmpty, 'Unexpected errors: $errors.');
-    Expect.equals(1, warnings.length, 'Unexpected warning count: $warnings.');
-    Expect.equals("Cannot resolve type 'Foo'.", warnings[0].toString());
-  });
-
-  runCompiler("", [Flags.analyzeOnly, Flags.analyzeAll],
-      (String code, List errors, List warnings) {
-    Expect.isNull(code);
-    Expect.isTrue(errors.isEmpty);
-    Expect.isTrue(warnings.isEmpty);
-  });
-
-  // --analyze-signatures-only implies --analyze-only
-  runCompiler("", [Flags.analyzeSignaturesOnly, Flags.analyzeAll],
-      (String code, List errors, List warnings) {
-    Expect.isNull(code);
-    Expect.isTrue(errors.isEmpty);
-    Expect.isTrue(warnings.isEmpty);
-  });
-
-  runCompiler("""main() {}
-      foo() native 'foo';""", [Flags.analyzeOnly],
-      (String code, List errors, List warnings) {
-    Expect.isNull(code);
-    Expect.isTrue(
-        errors.single.startsWith("'native' modifier is not supported."));
-    Expect.isTrue(warnings.isEmpty);
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/analyze_test_test.dart b/tests/compiler/dart2js/old_frontend/analyze_test_test.dart
deleted file mode 100644
index 495ce73..0000000
--- a/tests/compiler/dart2js/old_frontend/analyze_test_test.dart
+++ /dev/null
@@ -1,99 +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.
-
-library dart2js.analyze_test.test;
-
-import 'dart:io';
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/filenames.dart' show nativeToUriPath;
-
-import 'analyze_helper.dart';
-
-/**
- * Map of white-listed warnings and errors.
- *
- * Use an identifiable suffix of the file uri as key. Use a fixed substring of
- * the error/warning message in the list of white-listings for each file.
- */
-// TODO(johnniwinther): Support canonical URIs as keys.
-const Map<String, List /* <String|MessageKind> */ > WHITE_LIST = const {
-  "pkg/kernel/lib/transformations/closure/": const [
-    "Duplicated library name 'kernel.transformations.closure.converter'",
-  ],
-};
-
-const List<String> SKIP_LIST = const <String>[
-  // Helper files:
-  "/data/",
-  "/emission/",
-  "/side_effects/",
-  "quarantined/http_launch_data/",
-  "mirrors_helper.dart",
-  "path%20with%20spaces/",
-  // Broken tests:
-  "quarantined/http_test.dart",
-  // Package directory
-  "packages/",
-];
-
-List<Uri> computeInputUris({String filter}) {
-  List<Uri> uriList = <Uri>[];
-  Directory dir =
-      new Directory.fromUri(Uri.base.resolve('tests/compiler/dart2js/'));
-  for (FileSystemEntity entity in dir.listSync(recursive: true)) {
-    if (entity is File && entity.path.endsWith('.dart')) {
-      Uri file = Uri.base.resolve(nativeToUriPath(entity.path));
-      if (filter != null && !'$file'.contains(filter)) {
-        continue;
-      }
-      if (!SKIP_LIST.any((skip) => file.path.contains(skip))) {
-        uriList.add(file);
-      }
-    }
-  }
-  return uriList;
-}
-
-main(List<String> arguments) {
-  List<String> options = <String>[];
-  List<Uri> uriList = <Uri>[];
-  String filter;
-  bool first = true;
-  for (String argument in arguments) {
-    if (argument.startsWith('-')) {
-      options.add(argument == '-v' ? Flags.verbose : argument);
-    } else if (first) {
-      File file = new File(argument);
-      if (file.existsSync()) {
-        // Read test files from [file].
-        for (String line in file.readAsLinesSync()) {
-          line = line.trim();
-          if (line.startsWith('Analyzing uri: ')) {
-            int filenameOffset = line.indexOf('tests/compiler/dart2js/');
-            if (filenameOffset != -1) {
-              uriList.add(Uri.base
-                  .resolve(nativeToUriPath(line.substring(filenameOffset))));
-            }
-          }
-        }
-      } else {
-        // Use argument as filter on test files.
-        filter = argument;
-      }
-    } else {
-      throw new ArgumentError("Extra argument $argument in $arguments.");
-    }
-    first = false;
-  }
-
-  asyncTest(() async {
-    if (uriList.isEmpty) {
-      uriList = computeInputUris(filter: filter);
-    }
-    await analyze(uriList, WHITE_LIST,
-        mode: AnalysisMode.URI, options: options);
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/async_await_syntax_test.dart b/tests/compiler/dart2js/old_frontend/async_await_syntax_test.dart
deleted file mode 100644
index 16be073..0000000
--- a/tests/compiler/dart2js/old_frontend/async_await_syntax_test.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that dart2js produces the expected static type warnings and
-// compile-time errors for these tests.
-
-import 'frontend_checker.dart';
-
-/// Map of test files to run together with their associated whitelist.
-///
-/// For instance
-///     'language/async_await_syntax_test.dart': const ['a03b', 'a04b']
-/// includes the multitest in 'language/async_await_syntax_test.dart' but
-/// expects the subtests 'a03b' and 'a04c' to fail.
-const Map<String, List<String>> TESTS = const <String, List<String>>{
-  'language_2/async_await_syntax_test.dart': const [
-    'a10a',
-    'b10a',
-    'c10a',
-    'd08b',
-    'd10a',
-  ],
-};
-
-void main(List<String> arguments) {
-  check(TESTS, arguments: arguments, options: []);
-}
diff --git a/tests/compiler/dart2js/old_frontend/bad_loop_test.dart b/tests/compiler/dart2js/old_frontend/bad_loop_test.dart
deleted file mode 100644
index 69d2490..0000000
--- a/tests/compiler/dart2js/old_frontend/bad_loop_test.dart
+++ /dev/null
@@ -1,68 +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 'package:async_helper/async_helper.dart';
-import 'package:compiler/compiler.dart' show Diagnostic;
-import 'package:compiler/src/options.dart' show CompilerOptions;
-import 'package:compiler/src/old_to_new_api.dart';
-import 'package:expect/expect.dart';
-import '../memory_source_file_helper.dart';
-
-main() {
-  Uri script = currentDirectory.resolveUri(Platform.script);
-  Uri libraryRoot = script.resolve('../../../../sdk/');
-  Uri packageRoot = script.resolve('./packages/');
-
-  var provider = new MemorySourceFileProvider(MEMORY_SOURCE_FILES);
-  int warningCount = 0;
-  int errorCount = 0;
-  void diagnosticHandler(
-      Uri uri, int begin, int end, String message, Diagnostic kind) {
-    if (kind == Diagnostic.VERBOSE_INFO) {
-      return;
-    }
-    if (kind == Diagnostic.ERROR) {
-      errorCount++;
-    } else if (kind == Diagnostic.WARNING) {
-      warningCount++;
-    } else {
-      throw 'unexpected diagnostic $kind: $message';
-    }
-  }
-
-  CompilerImpl compiler = new CompilerImpl(
-      provider,
-      new LegacyCompilerOutput(),
-      new LegacyCompilerDiagnostics(diagnosticHandler),
-      new CompilerOptions()
-        ..libraryRoot = libraryRoot
-        ..useKernel = false
-        ..packageRoot = packageRoot);
-  asyncTest(() => compiler.run(Uri.parse('memory:main.dart')).then((_) {
-        Expect.isTrue(compiler.compilationFailed);
-        Expect.equals(5, errorCount);
-        Expect.equals(1, warningCount);
-      }));
-}
-
-const Map MEMORY_SOURCE_FILES = const {
-  'main.dart': """
-main() {
-  for (var x, y in []) {
-  }
-
-  for (var x = 10 in []) {
-  }
-
-  for (x.y in []) { // Also causes a warning "x unresolved".
-  }
-
-  for ((){}() in []) {
-  }
-
-  for (1 in []) {
-  }
-}
-"""
-};
diff --git a/tests/compiler/dart2js/old_frontend/begin_end_token_test.dart b/tests/compiler/dart2js/old_frontend/begin_end_token_test.dart
deleted file mode 100644
index 0a0ce7a..0000000
--- a/tests/compiler/dart2js/old_frontend/begin_end_token_test.dart
+++ /dev/null
@@ -1,174 +0,0 @@
-// 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 'package:compiler/src/tree/tree.dart';
-import 'package:expect/expect.dart';
-import 'parser_helper.dart';
-
-void testNode(Node node, String expected, String text, [bool hard = true]) {
-  var debug = 'text=$text,expected=$expected,node:${node}';
-  Expect.isNotNull(node, debug);
-
-  Token beginToken = node.getBeginToken();
-  Expect.isNotNull(beginToken, debug);
-  Token endToken = node.getEndToken();
-  Expect.isNotNull(endToken, debug);
-
-  int begin = beginToken.charOffset;
-  int end = endToken.charOffset + endToken.charCount;
-  Expect.isTrue(begin <= end, debug);
-
-  if (hard) {
-    Expect.stringEquals(expected, text.substring(begin, end), debug);
-  }
-}
-
-Node testExpression(String text, [String alternate]) {
-  ExpressionStatement statement = parseStatement('$text;');
-  Expression node = statement.expression;
-  testNode(node, alternate == null ? text : alternate, text);
-  return node;
-}
-
-void testUnaryExpression() {
-  testExpression('x++');
-  testExpression('++x');
-}
-
-void testAssignment() {
-  Expression node;
-  SendSet sendSet;
-  String text;
-
-  text = "a = b";
-  node = testExpression(text);
-
-  text = "a = b = c";
-  node = testExpression(text);
-  // Should parse as: a = (b = c).
-  Expect.isNotNull(sendSet = node.asSendSet());
-  testNode(sendSet.arguments.head.asSendSet(), 'b = c', text);
-
-  text = "a = b = c = d";
-  node = testExpression(text);
-  // Should parse as: a = (b = (c = d)).
-  Expect.isNotNull(sendSet = node.asSendSet());
-  testNode(sendSet = sendSet.arguments.head.asSendSet(), 'b = c = d', text);
-  testNode(sendSet = sendSet.arguments.head.asSendSet(), 'c = d', text);
-
-  text = "a.b = c";
-  node = testExpression(text);
-  // Should parse as: receiver = a, selector = b, arguments = c.
-  Expect.isNotNull(sendSet = node.asSendSet());
-  testNode(sendSet.receiver, "a", "a.b = c");
-  testNode(sendSet.selector, "b", "a.b = c");
-  testNode(sendSet.arguments.head, "c", "a.b = c");
-
-  text = "a.b = c.d";
-  node = testExpression(text);
-  // Should parse as: a.b = (c.d).
-  Expect.isNotNull(sendSet = node.asSendSet());
-  Expect.stringEquals("a", sendSet.receiver.toString());
-  Expect.stringEquals("b", sendSet.selector.toString());
-  Expect.stringEquals("c.d", sendSet.arguments.head.toString());
-
-  text = "a.b = c.d = e.f";
-  node = testExpression(text);
-  // Should parse as: a.b = (c.d = (e.f)).
-  Expect.isNotNull(sendSet = node.asSendSet());
-  testNode(sendSet.receiver, "a", text);
-  testNode(sendSet.selector, "b", text);
-  Expect.isNotNull(sendSet = sendSet.arguments.head.asSendSet());
-  testNode(sendSet.receiver, "c", text);
-  testNode(sendSet.selector, "d", text);
-  testNode(sendSet.arguments.head, "e.f", text);
-}
-
-void testIndex() {
-  Expression node;
-  Send send;
-  SendSet sendSet;
-  String text;
-
-  text = "a[b]";
-  node = testExpression(text);
-  // Should parse as: (a)[b].
-  Expect.isNotNull(send = node.asSend());
-  testNode(send.receiver, "a", text);
-  // TODO(johnniwinther): [selector] is the synthetic [] Operator which doesn't
-  // return the right begin/end tokens. In the next line we should have expected
-  // "[b]" instead of "[b".
-  testNode(send.selector, "[b", text);
-  testNode(send.arguments.head, "b", text);
-
-  text = "a[b] = c";
-  node = testExpression(text);
-  // Should parse as: (a)[b] = c.
-  Expect.isNotNull(sendSet = node.asSendSet());
-  testNode(sendSet.receiver, "a", text);
-  testNode(sendSet.selector, "[]", text, false); // Operator token is synthetic.
-  testNode(sendSet.assignmentOperator, "=", text);
-  testNode(sendSet.arguments.head, "b", text);
-  testNode(sendSet.arguments.tail.head, "c", text);
-
-  text = "a.b[c]";
-  node = testExpression(text);
-  // Should parse as: (a.b)[c].
-  Expect.isNotNull(send = node.asSend());
-  testNode(send.receiver, "a.b", text);
-  testNode(send.selector, "[]", text, false); // Operator token is synthetic.
-  testNode(send.arguments.head, "c", text);
-
-  text = "a.b[c] = d";
-  node = testExpression(text);
-  // Should parse as: (a.b)[] = (c, d).
-  Expect.isNotNull(sendSet = node.asSendSet());
-  Expect.isNotNull(send = sendSet.receiver.asSend());
-  testNode(send, "a.b", text);
-  testNode(sendSet.selector, "[]", text, false); // Operator token is synthetic.
-  testNode(sendSet.assignmentOperator, "=", text);
-  testNode(sendSet.arguments.head, "c", text);
-  testNode(sendSet.arguments.tail.head, "d", text);
-}
-
-void testPostfix() {
-  Expression node;
-  SendSet sendSet;
-  String text;
-
-  text = "a.b++";
-  node = testExpression(text);
-  // Should parse as: (a.b)++.
-  Expect.isNotNull(sendSet = node.asSendSet());
-  testNode(sendSet.receiver, "a", text);
-  testNode(sendSet.selector, "b", text);
-  testNode(sendSet.assignmentOperator, "++", text);
-  Expect.isTrue(sendSet.arguments.isEmpty);
-
-  text = "++a[b]";
-  // TODO(johnniwinther): SendSet generates the wrong end token in the following
-  // line. We should have [:testExpression(text):] instead of
-  // [:testExpression(text, "++a"):].
-  node = testExpression(text, "++a");
-  Expect.isNotNull(sendSet = node.asSendSet());
-  testNode(sendSet.receiver, "a", text);
-  testNode(sendSet.selector, "[]", text, false); // Operator token is synthetic.
-  testNode(sendSet.assignmentOperator, "++", text);
-  testNode(sendSet.arguments.head, "b", text);
-
-  text = "a[b]++";
-  node = testExpression(text);
-  Expect.isNotNull(sendSet = node.asSendSet());
-  testNode(sendSet.receiver, "a", text);
-  testNode(sendSet.selector, "[]", text, false); // Operator token is synthetic.
-  testNode(sendSet.assignmentOperator, "++", text);
-  testNode(sendSet.arguments.head, "b", text);
-}
-
-void main() {
-  testUnaryExpression();
-  testAssignment();
-  testIndex();
-  testPostfix();
-}
diff --git a/tests/compiler/dart2js/old_frontend/benign_error_test.dart b/tests/compiler/dart2js/old_frontend/benign_error_test.dart
deleted file mode 100644
index a94a5aa..0000000
--- a/tests/compiler/dart2js/old_frontend/benign_error_test.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that benign error do not prevent compilation.
-
-import '../memory_compiler.dart';
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/diagnostics/messages.dart';
-import 'package:compiler/src/js_backend/js_backend.dart';
-import 'package:expect/expect.dart';
-
-main() {
-  asyncTest(() async {
-    for (MessageKind kind in Compiler.BENIGN_ERRORS) {
-      await testExamples(kind);
-    }
-  });
-}
-
-testExamples(MessageKind kind) async {
-  MessageTemplate template = MessageTemplate.TEMPLATES[kind];
-  for (var example in template.examples) {
-    if (example is! Map) {
-      example = {'main.dart': example};
-    }
-    DiagnosticCollector collector = new DiagnosticCollector();
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: example,
-        diagnosticHandler: collector,
-        options: [Flags.useOldFrontend]);
-    Expect.isTrue(result.isSuccess);
-    Expect
-        .isTrue(collector.errors.any((message) => message.messageKind == kind));
-    Compiler compiler = result.compiler;
-    JavaScriptBackend backend = compiler.backend;
-    Expect.isNotNull(backend.generatedCode[
-        compiler.frontendStrategy.elementEnvironment.mainFunction]);
-  }
-}
diff --git a/tests/compiler/dart2js/old_frontend/categories_test.dart b/tests/compiler/dart2js/old_frontend/categories_test.dart
deleted file mode 100644
index 6b4317c..0000000
--- a/tests/compiler/dart2js/old_frontend/categories_test.dart
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:expect/expect.dart";
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-
-import "../memory_compiler.dart";
-
-runTest(String source, String categories, int expectedErrors) async {
-  var collector = new DiagnosticCollector();
-  await runCompiler(
-      memorySourceFiles: {"main.dart": source},
-      options: ["--categories=$categories", Flags.useOldFrontend],
-      diagnosticHandler: collector);
-  Expect.equals(expectedErrors, collector.errors.length);
-  Expect.equals(0, collector.warnings.length);
-}
-
-void main() {
-  asyncTest(() async {
-    await runTest("import 'dart:async'; main() {}", "Client", 0);
-    await runTest("import 'dart:async'; main() {}", "Server", 0);
-    await runTest("import 'dart:html'; main() {}", "Client", 0);
-    await runTest("import 'dart:html'; main() {}", "Server", 1);
-    // Importing dart:io is temporarily allowed as a stopgap measure for the
-    // lack of config specific imports. Once that is added, this will be
-    // disallowed again.
-    await runTest("import 'dart:io'; main() {}", "Client", 0);
-    await runTest("import 'dart:io'; main() {}", "Server", 0);
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/check_elements_invariants_test.dart b/tests/compiler/dart2js/old_frontend/check_elements_invariants_test.dart
deleted file mode 100644
index f394e6d..0000000
--- a/tests/compiler/dart2js/old_frontend/check_elements_invariants_test.dart
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/apiimpl.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:expect/expect.dart';
-import 'package:compiler/src/elements/entities.dart' show ClassEntity;
-import 'package:compiler/src/resolution/class_members.dart'
-    show ClassMemberMixin;
-import '../memory_compiler.dart';
-
-const String DART2JS_SOURCE = 'pkg/compiler/lib/src/dart2js.dart';
-const List<String> DART2JS_OPTIONS = const <String>[
-  '--categories=Client,Server',
-  '--disable-type-inference',
-  Flags.useOldFrontend
-];
-
-Iterable<ClassEntity> computeLiveClasses(CompilerImpl compiler) {
-  return new Set<ClassEntity>()
-    ..addAll(compiler.resolutionWorldBuilder.directlyInstantiatedClasses)
-    ..addAll(compiler.codegenWorldBuilder.directlyInstantiatedClasses);
-}
-
-void checkClassInvariants(ClassEntity cls) {
-  ClassMemberMixin impl = cls;
-  Expect.isTrue(impl.areAllMembersComputed(),
-      "Not all members have been computed for $cls.");
-}
-
-Future checkElementInvariantsAfterCompiling(Uri uri) async {
-  CompilationResult result =
-      await runCompiler(entryPoint: uri, options: DART2JS_OPTIONS);
-  Expect.isTrue(result.isSuccess, "Compilation of dart2js failed.");
-
-  computeLiveClasses(result.compiler).forEach(checkClassInvariants);
-}
-
-void main() {
-  var uri = Uri.base.resolve(DART2JS_SOURCE);
-  asyncTest(() => checkElementInvariantsAfterCompiling(uri));
-}
diff --git a/tests/compiler/dart2js/old_frontend/check_members_test.dart b/tests/compiler/dart2js/old_frontend/check_members_test.dart
deleted file mode 100644
index 26a5a53..0000000
--- a/tests/compiler/dart2js/old_frontend/check_members_test.dart
+++ /dev/null
@@ -1,76 +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.
-
-// Test that dart2js produces the expected static type warnings for least upper
-// bound language tests. This ensures that the analyzer and dart2js agrees
-// on these tests.
-
-import 'warnings_checker.dart';
-
-/// Map from test files to a map of their expected status. If the status map is
-/// `null` no warnings must be missing or unexpected, otherwise the status map
-/// can contain a list of line numbers for keys 'missing' and 'unexpected' for
-/// the warnings of each category.
-const Map<String, dynamic> TESTS = const {
-  // Instance methods.
-  'language/check_method_override_test.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'override_more_parameters_t01.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'override_more_parameters_t02.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'override_fewer_parameters_t01.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'override_fewer_parameters_t02.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'override_named_parameters_t01.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'override_named_parameters_t02.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'override_named_parameters_t03.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'override_named_parameters_t04.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'override_named_parameters_t05.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'override_named_parameters_t06.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'override_subtype_t01.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'override_subtype_t02.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'override_subtype_t03.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'override_subtype_t04.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'override_subtype_t05.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'override_subtype_t06.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'same_name_static_member_in_superclass_t01.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'same_name_static_member_in_superclass_t02.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'same_name_static_member_in_superclass_t04.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'same_name_static_member_in_superclass_t05.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'same_name_static_member_in_superclass_t06.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'same_name_static_member_in_superclass_t07.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'same_name_static_member_in_superclass_t08.dart': null,
-  'co19/src/Language/Classes/Instance_Methods/'
-      'same_name_static_member_in_superclass_t09.dart': null,
-
-  // Getters.
-  'co19/src/Language/Classes/Getters/override_t01.dart': null,
-  'co19/src/Language/Classes/Getters/override_t02.dart': null,
-  'co19/src/Language/Classes/Getters/override_t03.dart': null,
-  'co19/src/Language/Classes/Getters/override_t04.dart': null,
-};
-
-void main() {
-  checkWarnings(TESTS);
-}
diff --git a/tests/compiler/dart2js/old_frontend/combinator_hint_test.dart b/tests/compiler/dart2js/old_frontend/combinator_hint_test.dart
deleted file mode 100644
index 3ff105c..0000000
--- a/tests/compiler/dart2js/old_frontend/combinator_hint_test.dart
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that the hint on empty combinators works as intended.
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/compiler.dart';
-import '../memory_compiler.dart';
-
-const SOURCE = const {
-  'show_local.dart': """
-import 'lib.dart' show Foo;
-
-main() {}
-""",
-  'hide_local.dart': """
-import 'lib.dart' hide Foo;
-
-main() {}
-""",
-  'show_package.dart': """
-import 'package:pkg/pkg.dart' show Foo;
-
-main() {}
-""",
-  'hide_package.dart': """
-import 'package:pkg/pkg.dart' hide Foo;
-
-main() {}
-""",
-  'lib.dart': '',
-  'pkg/pkg/pkg.dart': '',
-};
-
-Future<Compiler> test(Uri entryPoint,
-    {bool showPackageWarnings: false,
-    bool suppressHints: false,
-    int hints: 0,
-    Compiler cachedCompiler}) async {
-  print('==================================================================');
-  print('test: $entryPoint showPackageWarnings=$showPackageWarnings '
-      'suppressHints=$suppressHints');
-  var options = [Flags.analyzeOnly, Flags.useOldFrontend];
-  if (showPackageWarnings) {
-    options.add(Flags.showPackageWarnings);
-  }
-  if (suppressHints) {
-    options.add(Flags.suppressHints);
-  }
-  var collector = new DiagnosticCollector();
-  CompilationResult result = await runCompiler(
-      entryPoint: entryPoint,
-      memorySourceFiles: SOURCE,
-      options: options,
-      packageRoot: Uri.parse('memory:pkg/'),
-      diagnosticHandler: collector,
-      cachedCompiler: cachedCompiler);
-  Expect.equals(
-      0, collector.errors.length, 'Unexpected errors: ${collector.errors}');
-  Expect.equals(0, collector.warnings.length,
-      'Unexpected warnings: ${collector.warnings}');
-  Expect.equals(
-      hints, collector.hints.length, 'Unexpected hints: ${collector.hints}');
-  Expect.equals(
-      0, collector.infos.length, 'Unexpected infos: ${collector.infos}');
-  print('==================================================================');
-  return result.compiler;
-}
-
-Future<Compiler> testUri(Uri entrypoint,
-    {bool suppressed: false, Compiler cachedCompiler}) async {
-  cachedCompiler = await test(entrypoint,
-      showPackageWarnings: true,
-      suppressHints: false,
-      hints: 1,
-      cachedCompiler: cachedCompiler);
-  cachedCompiler = await test(entrypoint,
-      showPackageWarnings: false,
-      suppressHints: false,
-      hints: suppressed ? 0 : 1,
-      cachedCompiler: cachedCompiler);
-  cachedCompiler = await test(entrypoint,
-      showPackageWarnings: true,
-      suppressHints: true,
-      hints: 0,
-      cachedCompiler: cachedCompiler);
-  cachedCompiler = await test(entrypoint,
-      showPackageWarnings: false,
-      suppressHints: true,
-      hints: 0,
-      cachedCompiler: cachedCompiler);
-  return cachedCompiler;
-}
-
-void main() {
-  asyncTest(() async {
-    Compiler cachedCompiler =
-        await testUri(Uri.parse('memory:show_local.dart'));
-    cachedCompiler = await testUri(Uri.parse('memory:hide_local.dart'),
-        cachedCompiler: cachedCompiler);
-    cachedCompiler = await testUri(Uri.parse('memory:show_package.dart'),
-        cachedCompiler: cachedCompiler);
-    cachedCompiler = await testUri(Uri.parse('memory:hide_package.dart'),
-        suppressed: true, cachedCompiler: cachedCompiler);
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/compile_with_empty_libraries_test.dart b/tests/compiler/dart2js/old_frontend/compile_with_empty_libraries_test.dart
deleted file mode 100644
index d16fe9e..0000000
--- a/tests/compiler/dart2js/old_frontend/compile_with_empty_libraries_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Test that the dart2js compiler can compile an empty script without
-/// references to core library definitions.
-
-import 'package:async_helper/async_helper.dart';
-import 'mock_compiler.dart';
-
-const String TEST = r"main() {}";
-
-main() {
-  Uri uri = new Uri(scheme: 'source');
-  MockCompiler compiler =
-      new MockCompiler.internal(librariesOverride: (_) => '');
-  asyncTest(() => compiler.run(uri));
-}
diff --git a/tests/compiler/dart2js/old_frontend/compiler_test.dart b/tests/compiler/dart2js/old_frontend/compiler_test.dart
deleted file mode 100644
index 82db42a..0000000
--- a/tests/compiler/dart2js/old_frontend/compiler_test.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// 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.
-
-import "dart:async";
-
-import "package:async_helper/async_helper.dart";
-import 'package:compiler/compiler.dart';
-import "package:compiler/src/elements/elements.dart";
-import "package:compiler/src/old_to_new_api.dart";
-import "package:expect/expect.dart";
-
-import "mock_compiler.dart";
-
-Future testErrorHandling() {
-  // Test that compiler.currentElement is set correctly when
-  // reporting errors/warnings.
-  MockCompiler compiler = new MockCompiler.internal();
-  return compiler.init().then((_) {
-    compiler.parseScript('NoSuchPrefix.NoSuchType foo() {}');
-    LibraryElement mainApp = compiler.mainApp;
-    FunctionElement foo = mainApp.find('foo');
-    compiler.diagnosticHandler = new LegacyCompilerDiagnostics(
-        (Uri uri, int begin, int end, String message, Diagnostic kind) {
-      if (kind == Diagnostic.WARNING) {
-        Expect.equals(foo, compiler.currentElement);
-      }
-    });
-    foo.computeType(compiler.resolution);
-    Expect.equals(1, compiler.diagnosticCollector.warnings.length);
-  });
-}
-
-main() {
-  asyncTest(() => testErrorHandling());
-}
diff --git a/tests/compiler/dart2js/old_frontend/data/one_line_dart_program.dart b/tests/compiler/dart2js/old_frontend/data/one_line_dart_program.dart
deleted file mode 100644
index 24a0c96..0000000
--- a/tests/compiler/dart2js/old_frontend/data/one_line_dart_program.dart
+++ /dev/null
@@ -1 +0,0 @@
-String main() => 499
\ No newline at end of file
diff --git a/tests/compiler/dart2js/old_frontend/diagnose_ambiguous_test.dart b/tests/compiler/dart2js/old_frontend/diagnose_ambiguous_test.dart
deleted file mode 100644
index 6e8708b..0000000
--- a/tests/compiler/dart2js/old_frontend/diagnose_ambiguous_test.dart
+++ /dev/null
@@ -1,71 +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.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/compiler_new.dart' show Diagnostic;
-import 'package:expect/expect.dart';
-import '../memory_compiler.dart';
-
-void main() {
-  DiagnosticCollector collector = new DiagnosticCollector();
-  asyncTest(() async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        diagnosticHandler: collector,
-        options: ['--analyze-all', Flags.useOldFrontend]);
-
-    List<String> diagnostics = <String>[];
-    collector.messages.forEach((CollectedMessage message) {
-      if (message.kind == Diagnostic.VERBOSE_INFO) return;
-      diagnostics.add(message.toString());
-    });
-    diagnostics.sort();
-    var expected = [
-      "MessageKind.AMBIGUOUS_LOCATION:"
-          "memory:exporter.dart:43:49:'hest' is defined here.:info",
-      "MessageKind.AMBIGUOUS_LOCATION:"
-          "memory:library.dart:41:47:'hest' is defined here.:info",
-      "MessageKind.DUPLICATE_IMPORT:"
-          "memory:main.dart:86:92:Duplicate import of 'hest'.:warning",
-      "MessageKind.IMPORTED_HERE:"
-          "memory:main.dart:0:22:'hest' is imported here.:info",
-      "MessageKind.IMPORTED_HERE:"
-          "memory:main.dart:23:46:'hest' is imported here.:info",
-    ];
-    print(">>\n$diagnostics\n<<");
-    Expect.listEquals(expected, diagnostics);
-    Expect.isTrue(result.isSuccess);
-  });
-}
-
-const Map MEMORY_SOURCE_FILES = const {
-  'main.dart': """
-import 'library.dart';
-import 'exporter.dart';
-
-main() {
-  Fisk x = null;
-  fisk();
-  hest();
-}
-""",
-  'library.dart': """
-library lib;
-
-class Fisk {
-}
-
-fisk() {}
-
-hest() {}
-""",
-  'exporter.dart': """
-library exporter;
-
-export 'library.dart';
-
-hest() {}
-""",
-};
diff --git a/tests/compiler/dart2js/old_frontend/duplicate_library_test.dart b/tests/compiler/dart2js/old_frontend/duplicate_library_test.dart
deleted file mode 100644
index ea030a3..0000000
--- a/tests/compiler/dart2js/old_frontend/duplicate_library_test.dart
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that duplicate library names result in different messages depending
-// on whether the libraries are based on the same resource.
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/diagnostics/messages.dart' show MessageKind;
-import '../memory_compiler.dart';
-
-void check(String kind, Iterable<CollectedMessage> messages,
-    List<MessageKind> expectedMessageKinds) {
-  Expect.equals(expectedMessageKinds.length, messages.length,
-      "Unexpected $kind count: $messages");
-  int i = 0;
-  messages.forEach((CollectedMessage message) {
-    Expect.equals(expectedMessageKinds[i++], message.messageKind);
-  });
-}
-
-Future test(Map<String, String> source,
-    {List<MessageKind> warnings: const <MessageKind>[],
-    List<MessageKind> hints: const <MessageKind>[]}) async {
-  DiagnosticCollector collector = new DiagnosticCollector();
-  await runCompiler(
-      memorySourceFiles: source,
-      diagnosticHandler: collector,
-      showDiagnostics: true,
-      options: [Flags.analyzeOnly, Flags.analyzeAll, Flags.useOldFrontend],
-      packageRoot: Uri.parse('memory:pkg/'));
-
-  Expect.isTrue(collector.errors.isEmpty);
-  check('warning', collector.warnings, warnings);
-  check('hint', collector.hints, hints);
-  Expect.isTrue(collector.infos.isEmpty);
-}
-
-void main() {
-  asyncTest(runTests);
-}
-
-Future runTests() async {
-  await test({
-    'main.dart': """
-library main;
-
-import 'package:lib/foo.dart';
-import 'pkg/lib/foo.dart';
-""",
-    'pkg/lib/foo.dart': """
-library lib.foo;
-"""
-  }, warnings: [
-    MessageKind.DUPLICATED_LIBRARY_RESOURCE
-  ], hints: []);
-
-  await test({
-    'main.dart': """
-library main;
-
-import 'package:lib/bar.dart';
-import 'pkg/foo.dart';
-""",
-    'pkg/foo.dart': """
-library foo;
-
-import 'lib/bar.dart';
-""",
-    'pkg/lib/bar.dart': """
-library lib.bar;
-"""
-  }, warnings: [
-    MessageKind.DUPLICATED_LIBRARY_RESOURCE
-  ], hints: []);
-
-  await test({
-    'main.dart': """
-library main;
-
-import 'foo.dart';
-import 'pkg/lib/baz.dart';
-""",
-    'foo.dart': """
-library foo;
-
-import 'package:lib/baz.dart';
-""",
-    'pkg/lib/baz.dart': """
-library lib.baz;
-"""
-  }, warnings: [
-    MessageKind.DUPLICATED_LIBRARY_RESOURCE
-  ], hints: []);
-
-  await test({
-    'main.dart': """
-library main;
-
-import 'foo.dart';
-import 'pkg/bar.dart';
-""",
-    'foo.dart': """
-library foo;
-
-import 'package:lib/boz.dart';
-""",
-    'pkg/bar.dart': """
-library bar;
-
-import 'lib/boz.dart';
-""",
-    'pkg/lib/boz.dart': """
-library lib.boz;
-"""
-  }, warnings: [
-    MessageKind.DUPLICATED_LIBRARY_RESOURCE
-  ], hints: []);
-
-  await test({
-    'main.dart': """
-library main;
-
-import 'package:lib/qux.dart';
-import 'pkg/lib/qux.dart';
-""",
-    'pkg/lib/qux.dart': """
-// No library tag.
-"""
-  }, hints: [
-    MessageKind.DUPLICATED_RESOURCE,
-  ]);
-
-  await test({
-    'main.dart': """
-library main;
-
-import 'foo.dart';
-import 'bar.dart';
-""",
-    'foo.dart': """
-library lib;
-""",
-    'bar.dart': """
-library lib;
-"""
-  }, warnings: [
-    MessageKind.DUPLICATED_LIBRARY_NAME,
-    MessageKind.DUPLICATED_LIBRARY_NAME
-  ], hints: []);
-}
diff --git a/tests/compiler/dart2js/old_frontend/embedded_category_api_boundary_test.dart b/tests/compiler/dart2js/old_frontend/embedded_category_api_boundary_test.dart
deleted file mode 100644
index 8fcf124..0000000
--- a/tests/compiler/dart2js/old_frontend/embedded_category_api_boundary_test.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2015, the Fletch 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.
-
-/// Tests that analyzing everything from the libraries that are public from the
-/// embedded category does not cause elements from other libraries to be
-/// processed.
-library embedded_category_boundary_test;
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/elements/elements.dart';
-import 'package:sdk_library_metadata/libraries.dart';
-
-import 'analyze_helper.dart';
-
-main() async {
-  List<Uri> uriList = new List<Uri>();
-  libraries.forEach((String name, LibraryInfo info) {
-    if (info.categories.contains(Category.embedded)) {
-      uriList.add(new Uri(scheme: 'dart', path: name));
-    }
-  });
-  asyncTest(() async {
-    await analyze(uriList, {},
-        checkResults: checkResults, mode: AnalysisMode.MAIN);
-  });
-}
-
-/// These elements are currently escaping from dart:async via
-/// `core._Resource#_readAsStream`.
-Set<String> whiteList = new Set.from([
-  "function(StreamController#addError)",
-  "getter(StreamController#stream)",
-  "setter(StreamController#onListen)"
-]);
-
-bool checkResults(Compiler compiler, CollectingDiagnosticHandler handler) {
-  return compiler.enqueuer.resolution.processedEntities.every((_element) {
-    MemberElement element = _element;
-    if (whiteList.contains("$element")) return true;
-    LibraryInfo info = libraries[element.library.canonicalUri.path];
-    bool isAllowedInEmbedded =
-        info.isInternal || info.categories.contains(Category.embedded);
-    if (!isAllowedInEmbedded) {
-      print(
-          'Disallowed element: $element from ${element.library.canonicalUri}');
-    }
-    return isAllowedInEmbedded;
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/erroneous_element_test.dart b/tests/compiler/dart2js/old_frontend/erroneous_element_test.dart
deleted file mode 100644
index 0fee336..0000000
--- a/tests/compiler/dart2js/old_frontend/erroneous_element_test.dart
+++ /dev/null
@@ -1,15 +0,0 @@
-// 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.
-
-import 'package:expect/expect.dart';
-
-import 'package:compiler/src/diagnostics/messages.dart' show MessageKind;
-import 'package:compiler/src/elements/elements.dart';
-import 'package:compiler/src/elements/modelx.dart' show ErroneousElementX;
-
-void main() {
-  ErroneousElement e = new ErroneousElementX(
-      MessageKind.GENERIC, {'text': 'error'}, 'foo', null);
-  Expect.stringEquals('<foo: error>', '$e');
-}
diff --git a/tests/compiler/dart2js/old_frontend/error_token_test.dart b/tests/compiler/dart2js/old_frontend/error_token_test.dart
deleted file mode 100644
index fb0854e..0000000
--- a/tests/compiler/dart2js/old_frontend/error_token_test.dart
+++ /dev/null
@@ -1,54 +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.
-
-// Test that we don't report invalid modifier on error tokens.
-
-library dart2js.test.error_token;
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import "package:compiler/src/diagnostics/messages.dart";
-import 'package:expect/expect.dart';
-import '../memory_compiler.dart';
-
-Future runTest(String code,
-    {MessageKind error, int expectedWarningCount: 0}) async {
-  DiagnosticCollector diagnostics = new DiagnosticCollector();
-  OutputCollector output = new OutputCollector();
-  await runCompiler(
-      entryPoint: Uri.parse('memory:main.dart'),
-      memorySourceFiles: {'main.dart': code},
-      diagnosticHandler: diagnostics,
-      outputProvider: output,
-      options: [Flags.useOldFrontend]);
-
-  Expect.equals(error != null ? 1 : 0, diagnostics.errors.length);
-  if (error != null)
-    Expect.equals(error, diagnostics.errors.first.message.kind);
-  Expect.equals(expectedWarningCount, diagnostics.warnings.length);
-  Expect.equals(0, diagnostics.hints.length);
-  Expect.equals(0, diagnostics.infos.length);
-}
-
-void main() {
-  asyncTest(() async {
-    await runTest('''
-main() {Foo.bar();}
-class Foo {
-	static void bar() {
-		baz());
-	}
-}
-''', error: MessageKind.MISSING_TOKEN_AFTER_THIS, expectedWarningCount: 1);
-
-    await runTest('''
-main() {new C(v);}
-class C {
-  C(v) {
-    throw '');
-  }
-}''', error: MessageKind.MISSING_TOKEN_AFTER_THIS, expectedWarningCount: 1);
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/find_my_name_test.dart b/tests/compiler/dart2js/old_frontend/find_my_name_test.dart
deleted file mode 100644
index 72063ed..0000000
--- a/tests/compiler/dart2js/old_frontend/find_my_name_test.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-// 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.
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import "package:compiler/src/elements/elements.dart";
-import 'package:compiler/src/elements/entity_utils.dart' as utils;
-import "mock_compiler.dart";
-import "parser_helper.dart";
-import 'package:compiler/src/elements/modelx.dart';
-
-String TEST_0 = '''
-class Foo {
-  Foo();
-  Foo.named();
-  factory Foo._internal() => null;
-  operator+(other) => null;
-}
-''';
-
-String TEST_1 = '''
-class Bar {
-  const Bar();
-  const Bar.named();
-  Map<int, List<int>> baz() => null;
-}
-''';
-
-main() {
-  asyncTest(() => MockCompiler.create((MockCompiler compiler) {
-        testClass(TEST_0, compiler);
-        testClass(TEST_1, compiler);
-      }));
-}
-
-testClass(String code, MockCompiler compiler) {
-  int skip = code.indexOf('{');
-  ClassElementX cls = parseUnit(code, compiler, compiler.mainApp).head;
-  cls.parseNode(compiler.parsingContext);
-  cls.forEachLocalMember((Element e) {
-    String name = e.name;
-    if (e.isConstructor) {
-      ConstructorElement c = e;
-      name = utils.reconstructConstructorName(c).replaceFirst(r'$', '.');
-    }
-    Expect.equals(code.indexOf(name, skip), e.position.charOffset);
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/flatten_test.dart b/tests/compiler/dart2js/old_frontend/flatten_test.dart
deleted file mode 100644
index 5e08375..0000000
--- a/tests/compiler/dart2js/old_frontend/flatten_test.dart
+++ /dev/null
@@ -1,83 +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.
-
-library flatten_test;
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import '../type_test_helper.dart';
-import 'package:compiler/src/elements/resolution_types.dart';
-import "package:compiler/src/elements/elements.dart" show ClassElement;
-
-void main() {
-  asyncTest(() => TypeEnvironment.create(r"""
-      abstract class F<T> implements Future<T> {}
-      abstract class G<T> implements Future<G<T>> {}
-      abstract class H<T> implements Future<H<H<T>>> {}
-      """).then((env) {
-        void check(
-            ResolutionDartType T, ResolutionDartType expectedFlattenedType) {
-          ResolutionDartType flattenedType = env.flatten(T);
-          Expect.equals(
-              expectedFlattenedType,
-              flattenedType,
-              "Unexpected flattening of '$T' = '$flattenedType',"
-              "expected '$expectedFlattenedType'.");
-        }
-
-        ClassElement Future_ = env.getElement('Future');
-        ClassElement F = env.getElement('F');
-        ClassElement G = env.getElement('G');
-        ClassElement H = env.getElement('H');
-        ResolutionDartType int_ = env['int'];
-        ResolutionDartType dynamic_ = env['dynamic'];
-        ResolutionDartType Future_int = instantiate(Future_, [int_]);
-        ResolutionDartType F_int = instantiate(F, [int_]);
-        ResolutionDartType G_int = instantiate(G, [int_]);
-        ResolutionDartType H_int = instantiate(H, [int_]);
-        ResolutionDartType H_H_int = instantiate(H, [H_int]);
-
-        // flatten(int) = int
-        check(int_, int_);
-
-        // flatten(Future) = dynamic
-        check(Future_.rawType, dynamic_);
-
-        // flatten(Future<int>) = int
-        check(Future_int, int_);
-
-        // flatten(Future<Future<int>>) = int
-        check(instantiate(Future_, [Future_int]), int_);
-
-        // flatten(F) = dynamic
-        check(F.rawType, dynamic_);
-
-        // flatten(F<int>) = int
-        check(F_int, int_);
-
-        // flatten(F<Future<int>>) = Future<int>
-        check(instantiate(F, [Future_int]), Future_int);
-
-        // flatten(G) = G
-        check(G.rawType, G.rawType);
-
-        // flatten(G<int>) = G<int>
-        check(G_int, G_int);
-
-        // flatten(H) = H<H>
-        check(H.rawType, instantiate(H, [H.rawType]));
-
-        // flatten(H<int>) = H<H<int>>
-        check(H_int, H_H_int);
-
-        // flatten(Future<F<int>>) = int
-        check(instantiate(Future_, [F_int]), int_);
-
-        // flatten(Future<G<int>>) = int
-        check(instantiate(Future_, [G_int]), G_int);
-
-        // flatten(Future<H<int>>) = int
-        check(instantiate(Future_, [H_int]), H_H_int);
-      }));
-}
diff --git a/tests/compiler/dart2js/old_frontend/frontend_checker.dart b/tests/compiler/dart2js/old_frontend/frontend_checker.dart
deleted file mode 100644
index 7fc1552..0000000
--- a/tests/compiler/dart2js/old_frontend/frontend_checker.dart
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Checks that dart2js produces the expected static type warnings and
-// compile-time errors for the provided multitests.
-
-import 'dart:async';
-import 'dart:io';
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/util/uri_extras.dart' show relativize;
-import '../memory_compiler.dart';
-
-import '../../../../tools/testing/dart/multitest.dart'
-    show extractTestsFromMultitest;
-import '../../../../tools/testing/dart/path.dart' show Path;
-
-/// Check the analysis of the multitests in [testFiles] to result in the
-/// expected static warnings and compile-time errors.
-///
-/// [testFiles] is a map of the test files to be checked together with their
-/// associated white listing.
-///
-/// For instance if [testFiles] contain the mapping
-///     'language/async_await_syntax_test.dart': const ['a03b', 'a04b']
-/// the multitests in 'language/async_await_syntax_test.dart' are checked but
-/// the subtests 'a03b' and 'a04c' are expected to fail.
-void check(Map<String, List<String>> testFiles,
-    {List<String> arguments: const <String>[],
-    List<String> options: const <String>[]}) {
-  bool outcomeMismatch = false;
-  bool verbose = arguments.contains('-v');
-  var cachedCompiler;
-  asyncTest(() => Future.forEach(testFiles.keys, (String testFile) {
-        Map<String, String> testSources = {};
-        Map<String, Set<String>> testOutcomes = {};
-        String fileName = 'tests/$testFile';
-        extractTestsFromMultitest(
-            new Path(fileName), testSources, testOutcomes);
-        return Future.forEach(testSources.keys, (String testName) async {
-          String testFileName = '$fileName/$testName';
-          Set<String> expectedOutcome = testOutcomes[testName];
-          bool expectFailure = testFiles[testFile].contains(testName);
-          DiagnosticCollector collector = new DiagnosticCollector();
-          CompilationResult result = await runCompiler(
-              entryPoint: Uri.parse('memory:$testFileName'),
-              memorySourceFiles: {testFileName: testSources[testName]},
-              diagnosticHandler: collector,
-              options: [Flags.analyzeOnly, Flags.useOldFrontend]
-                ..addAll(options),
-              showDiagnostics: verbose,
-              cachedCompiler: cachedCompiler);
-          var compiler = result.compiler;
-          bool unexpectedResult = false;
-          if (expectedOutcome.contains('compile-time error') ||
-              expectedOutcome.contains('syntax error')) {
-            if (collector.errors.isEmpty) {
-              print('$testFileName: Missing compile-time error.');
-              unexpectedResult = true;
-            }
-          } else if (expectedOutcome.contains('static type warning')) {
-            if (collector.warnings.isEmpty) {
-              print('$testFileName: Missing static type warning.');
-              unexpectedResult = true;
-            }
-          } else {
-            // Expect ok.
-            if (!collector.errors.isEmpty || !collector.warnings.isEmpty) {
-              collector.errors.forEach((message) {
-                print('$testFileName: Unexpected error: ${message.message}');
-              });
-              collector.warnings.forEach((message) {
-                print('$testFileName: Unexpected warning: ${message.message}');
-              });
-              unexpectedResult = true;
-            }
-          }
-          if (expectFailure) {
-            if (unexpectedResult) {
-              unexpectedResult = false;
-            } else {
-              print('$testFileName: The test is white-listed '
-                  'and therefore expected to fail.');
-              unexpectedResult = true;
-            }
-          }
-          if (unexpectedResult) {
-            outcomeMismatch = true;
-          }
-          cachedCompiler = compiler;
-        });
-      }).then((_) {
-        if (outcomeMismatch) {
-          String testFileName =
-              relativize(Uri.base, Platform.script, Platform.isWindows);
-          print('''
-
-===
-=== ERROR: Unexpected result of analysis.
-===
-=== Please update the white-listing in $testFileName
-===
-
-''');
-          exit(1);
-        }
-      }));
-}
diff --git a/tests/compiler/dart2js/old_frontend/generic_method_type_usage_test.dart b/tests/compiler/dart2js/old_frontend/generic_method_type_usage_test.dart
deleted file mode 100644
index 7d352c0..0000000
--- a/tests/compiler/dart2js/old_frontend/generic_method_type_usage_test.dart
+++ /dev/null
@@ -1,127 +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.
-
-/// Dart test verifying that method type variables are considered to denote
-/// the type `dynamic`.
-///
-/// NB: This test is intended to succeed with a `dart2js` with the option
-/// '--generic-method-syntax', but it should fail with a full implementation
-/// of generic method support, and it should fail with every other tool than
-/// `dart2js`.
-
-library dart2js.test.generic_method_type_usage;
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import "package:compiler/src/diagnostics/messages.dart";
-import 'package:expect/expect.dart';
-import '../memory_compiler.dart';
-
-const MEMORY_SOURCE_FILES = const {
-  'type_variable_is_dynamic.dart': '''
-class C {
-  bool aMethod<X>(X x) {
-    // `dynamic` is assignable to both `int` and `String`: no warnings.
-    int i = x;
-    String s = x;
-    try {
-      // Only `dynamic` allows unknown member lookup without a warning.
-      var y = x.undefinedMember;
-    } on NoSuchMethodError catch (_) {
-      return true;
-    }
-    return false;
-  }
-}
-
-bool aFunction<X>(X x) {
-  // `dynamic` is assignable to both `int` and `String`: no warnings.
-  int i = x;
-  String s = x;
-  try {
-    // Only `dynamic` allows unknown member lookup without a warning.
-    var y = x.undefinedMember;
-  } on NoSuchMethodError catch (_) {
-    return true;
-  }
-  return false;
-}
-
-main() {
-  print(new C().aMethod<Set>(null));
-  print(aFunction<Set>(null));
-}
-''',
-  'cannot_new_method_type_variable.dart': '''
-class C {
-  X aMethod<X>() => new X();
-}
-
-main() {
-  new C().aMethod<Set>();
-}
-''',
-  'cannot_new_function_type_variable.dart': '''
-X aFunction<X>() => new X(42);
-
-main() {
-  aFunction<Set>();
-}
-''',
-  'dynamic_as_type_argument.dart': '''
-main() {
-  method<dynamic>();
-}
-method<T>() {}
-''',
-  'malformed_type_argument.dart': '''
-main() {
-  method<Unresolved>();
-}
-method<T>() {}
-''',
-};
-
-Future runTest(Uri main, {MessageKind warning, MessageKind info}) async {
-  print("----\nentry-point: $main\n");
-
-  DiagnosticCollector diagnostics = new DiagnosticCollector();
-  OutputCollector output = new OutputCollector();
-  await runCompiler(
-      entryPoint: main,
-      options: const <String>["--generic-method-syntax", Flags.useOldFrontend],
-      memorySourceFiles: MEMORY_SOURCE_FILES,
-      diagnosticHandler: diagnostics,
-      outputProvider: output);
-
-  Expect.isFalse(output.hasExtraOutput);
-  Expect.equals(0, diagnostics.errors.length, "Unexpected errors.");
-  Expect.equals(warning != null ? 1 : 0, diagnostics.warnings.length);
-  if (warning != null) {
-    Expect.equals(warning, diagnostics.warnings.first.message.kind);
-  }
-  Expect.equals(info != null ? 1 : 0, diagnostics.infos.length);
-  if (info != null) {
-    Expect.equals(info, diagnostics.infos.first.message.kind);
-  }
-  Expect.equals(0, diagnostics.hints.length);
-}
-
-void main() {
-  asyncTest(() async {
-    await runTest(Uri.parse('memory:type_variable_is_dynamic.dart'));
-
-    await runTest(Uri.parse('memory:cannot_new_method_type_variable.dart'),
-        warning: MessageKind.CANNOT_INSTANTIATE_TYPE_VARIABLE);
-
-    await runTest(Uri.parse('memory:cannot_new_function_type_variable.dart'),
-        warning: MessageKind.CANNOT_INSTANTIATE_TYPE_VARIABLE);
-
-    await runTest(Uri.parse('memory:dynamic_as_type_argument.dart'));
-
-    await runTest(Uri.parse('memory:malformed_type_argument.dart'),
-        warning: MessageKind.CANNOT_RESOLVE_TYPE);
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/import_test.dart b/tests/compiler/dart2js/old_frontend/import_test.dart
deleted file mode 100644
index 59f5362..0000000
--- a/tests/compiler/dart2js/old_frontend/import_test.dart
+++ /dev/null
@@ -1,101 +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.
-
-// Test that the compiler can handle missing files used in imports, exports,
-// part tags or as the main source file.
-
-library dart2js.test.import;
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/diagnostics/messages.dart';
-import '../memory_compiler.dart';
-
-const MEMORY_SOURCE_FILES = const {
-  'main.dart': '''
-
-library main;
-
-import 'dart:thisLibraryShouldNotExist';
-import 'package:thisPackageShouldNotExist/thisPackageShouldNotExist.dart';
-export 'foo.dart';
-
-part 'bar.dart';
-
-main() {
-  int i = "";
-}
-''',
-  'part.dart': '''
-part of lib;
-
-main() {}
-''',
-  'lib.dart': '''
-library lib;
-
-import 'part.dart';
-
-part 'part.dart';
-''',
-};
-
-testEntryPointIsPart() async {
-  var collector = new DiagnosticCollector();
-  await runCompiler(
-      entryPoint: Uri.parse('memory:part.dart'),
-      memorySourceFiles: MEMORY_SOURCE_FILES,
-      diagnosticHandler: collector,
-      options: [Flags.useOldFrontend]);
-
-  collector.checkMessages([const Expected.error(MessageKind.MAIN_HAS_PART_OF)]);
-}
-
-testImportPart() async {
-  var collector = new DiagnosticCollector();
-  await runCompiler(
-      entryPoint: Uri.parse('memory:lib.dart'),
-      memorySourceFiles: MEMORY_SOURCE_FILES,
-      diagnosticHandler: collector,
-      options: [Flags.useOldFrontend]);
-
-  collector.checkMessages([
-    const Expected.error(MessageKind.IMPORT_PART_OF),
-    const Expected.info(MessageKind.IMPORT_PART_OF_HERE)
-  ]);
-}
-
-testMissingImports() async {
-  var collector = new DiagnosticCollector();
-  await runCompiler(
-      memorySourceFiles: MEMORY_SOURCE_FILES,
-      diagnosticHandler: collector,
-      options: [Flags.useOldFrontend]);
-
-  collector.checkMessages([
-    const Expected.error(MessageKind.READ_URI_ERROR),
-    const Expected.error(MessageKind.LIBRARY_NOT_FOUND),
-    const Expected.error(MessageKind.LIBRARY_NOT_FOUND),
-    const Expected.error(MessageKind.READ_URI_ERROR),
-    const Expected.warning(MessageKind.NOT_ASSIGNABLE)
-  ]);
-}
-
-testMissingMain() async {
-  var collector = new DiagnosticCollector();
-  await runCompiler(
-      entryPoint: Uri.parse('memory:missing.dart'),
-      diagnosticHandler: collector,
-      options: [Flags.useOldFrontend]);
-  collector.checkMessages([const Expected.error(MessageKind.READ_SELF_ERROR)]);
-}
-
-void main() {
-  asyncTest(() async {
-    await testEntryPointIsPart();
-    await testImportPart();
-    await testMissingImports();
-    await testMissingMain();
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/least_upper_bound_language_test.dart b/tests/compiler/dart2js/old_frontend/least_upper_bound_language_test.dart
deleted file mode 100644
index 53d5900..0000000
--- a/tests/compiler/dart2js/old_frontend/least_upper_bound_language_test.dart
+++ /dev/null
@@ -1,22 +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.
-
-// Test that dart2js produces the expected static type warnings for least upper
-// bound language tests. This ensures that the analyzer and dart2js agrees
-// on these tests.
-
-import 'warnings_checker.dart';
-
-/// Map from test files to a map of their expected status. If the status map is
-/// `null` no warnings must be missing or unexpected, otherwise the status map
-/// can contain a list of line numbers for keys 'missing' and 'unexpected' for
-/// the warnings of each category.
-const Map<String, dynamic> TESTS = const {
-  'language/least_upper_bound_test.dart': null,
-  'language/least_upper_bound_expansive_test.dart': null,
-};
-
-void main() {
-  checkWarnings(TESTS);
-}
diff --git a/tests/compiler/dart2js/old_frontend/least_upper_bound_test.dart b/tests/compiler/dart2js/old_frontend/least_upper_bound_test.dart
deleted file mode 100644
index bb2f12d..0000000
--- a/tests/compiler/dart2js/old_frontend/least_upper_bound_test.dart
+++ /dev/null
@@ -1,851 +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.
-
-library least_upper_bound_test;
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/elements/resolution_types.dart';
-import 'package:compiler/src/elements/elements.dart' show ClassElement;
-
-import '../type_test_helper.dart';
-
-void main() {
-  testInterface1();
-  testInterface2();
-  testGeneric();
-  testMixin();
-  testFunction();
-  testTypeVariable();
-}
-
-void testInterface1() {
-  asyncTest(() => TypeEnvironment.create(r"""
-      class A {} // A and B have equal depth.
-      class B {}
-      class I implements A, B {}
-      class J implements A, B {}
-      """).then((env) {
-        ResolutionDartType Object_ = env['Object'];
-        ResolutionDartType A = env['A'];
-        ResolutionDartType B = env['B'];
-        ResolutionDartType I = env['I'];
-        ResolutionDartType J = env['J'];
-
-        checkLub(ResolutionDartType a, ResolutionDartType b,
-            ResolutionDartType expect) {
-          ResolutionDartType lub = env.computeLeastUpperBound(a, b);
-          Expect.equals(
-              expect, lub, 'Unexpected lub($a,$b) = $lub, expected $expect.');
-        }
-
-        checkLub(Object_, Object_, Object_);
-        checkLub(Object_, A, Object_);
-        checkLub(Object_, B, Object_);
-        checkLub(Object_, I, Object_);
-        checkLub(Object_, J, Object_);
-
-        checkLub(A, Object_, Object_);
-        checkLub(A, A, A);
-        checkLub(A, B, Object_);
-        checkLub(A, I, A);
-        checkLub(A, J, A);
-
-        checkLub(B, Object_, Object_);
-        checkLub(B, A, Object_);
-        checkLub(B, B, B);
-        checkLub(B, I, B);
-        checkLub(B, J, B);
-
-        checkLub(I, Object_, Object_);
-        checkLub(I, A, A);
-        checkLub(I, B, B);
-        checkLub(I, I, I);
-        checkLub(I, J, Object_);
-
-        checkLub(J, Object_, Object_);
-        checkLub(J, A, A);
-        checkLub(J, B, B);
-        checkLub(J, I, Object_);
-        checkLub(J, J, J);
-      }));
-}
-
-void testInterface2() {
-  asyncTest(() => TypeEnvironment.create(r"""
-      class A {}
-      class B {}
-      class C extends B {} // This makes C have higher depth than A.
-      class I implements A, C {}
-      class J implements A, C {}
-      """).then((env) {
-        ResolutionDartType Object_ = env['Object'];
-        ResolutionDartType A = env['A'];
-        ResolutionDartType B = env['B'];
-        ResolutionDartType C = env['C'];
-        ResolutionDartType I = env['I'];
-        ResolutionDartType J = env['J'];
-
-        checkLub(ResolutionDartType a, ResolutionDartType b,
-            ResolutionDartType expectedLub) {
-          ResolutionDartType lub = env.computeLeastUpperBound(a, b);
-          Expect.equals(expectedLub, lub,
-              'Unexpected lub($a,$b) = $lub, expected $expectedLub');
-        }
-
-        checkLub(Object_, Object_, Object_);
-        checkLub(Object_, A, Object_);
-        checkLub(Object_, B, Object_);
-        checkLub(Object_, C, Object_);
-        checkLub(Object_, I, Object_);
-        checkLub(Object_, J, Object_);
-
-        checkLub(A, Object_, Object_);
-        checkLub(A, A, A);
-        checkLub(A, B, Object_);
-        checkLub(A, C, Object_);
-        checkLub(A, I, A);
-        checkLub(A, J, A);
-
-        checkLub(B, Object_, Object_);
-        checkLub(B, A, Object_);
-        checkLub(B, B, B);
-        checkLub(B, C, B);
-        checkLub(B, I, B);
-        checkLub(B, J, B);
-
-        checkLub(C, Object_, Object_);
-        checkLub(C, A, Object_);
-        checkLub(C, B, B);
-        checkLub(C, C, C);
-        checkLub(C, I, C);
-        checkLub(C, J, C);
-
-        checkLub(I, Object_, Object_);
-        checkLub(I, A, A);
-        checkLub(I, B, B);
-        checkLub(I, C, C);
-        checkLub(I, I, I);
-        checkLub(I, J, C);
-
-        checkLub(J, Object_, Object_);
-        checkLub(J, A, A);
-        checkLub(J, B, B);
-        checkLub(J, C, C);
-        checkLub(J, I, C);
-        checkLub(J, J, J);
-      }));
-}
-
-void testGeneric() {
-  asyncTest(() => TypeEnvironment.create(r"""
-      class A {}
-      class B {}
-      class C extends B {}
-      class I<T> {}
-      """).then((env) {
-        ResolutionDartType Object_ = env['Object'];
-        ResolutionDartType A = env['A'];
-        ResolutionDartType B = env['B'];
-        ResolutionDartType C = env['C'];
-        ClassElement I = env.getElement('I');
-        ResolutionDartType I_A = instantiate(I, [A]);
-        ResolutionDartType I_B = instantiate(I, [B]);
-        ResolutionDartType I_C = instantiate(I, [C]);
-
-        checkLub(ResolutionDartType a, ResolutionDartType b,
-            ResolutionDartType expectedLub) {
-          ResolutionDartType lub = env.computeLeastUpperBound(a, b);
-          Expect.equals(expectedLub, lub,
-              'Unexpected lub($a,$b) = $lub, expected $expectedLub');
-        }
-
-        checkLub(Object_, Object_, Object_);
-        checkLub(Object_, A, Object_);
-        checkLub(Object_, B, Object_);
-        checkLub(Object_, C, Object_);
-        checkLub(Object_, I_A, Object_);
-        checkLub(Object_, I_B, Object_);
-        checkLub(Object_, I_C, Object_);
-
-        checkLub(A, Object_, Object_);
-        checkLub(A, A, A);
-        checkLub(A, B, Object_);
-        checkLub(A, C, Object_);
-        checkLub(A, I_A, Object_);
-        checkLub(A, I_B, Object_);
-        checkLub(A, I_C, Object_);
-
-        checkLub(B, Object_, Object_);
-        checkLub(B, A, Object_);
-        checkLub(B, B, B);
-        checkLub(B, C, B);
-        checkLub(B, I_A, Object_);
-        checkLub(B, I_B, Object_);
-        checkLub(B, I_C, Object_);
-
-        checkLub(C, Object_, Object_);
-        checkLub(C, A, Object_);
-        checkLub(C, B, B);
-        checkLub(C, C, C);
-        checkLub(C, I_A, Object_);
-        checkLub(C, I_B, Object_);
-        checkLub(C, I_C, Object_);
-
-        checkLub(I_A, Object_, Object_);
-        checkLub(I_A, A, Object_);
-        checkLub(I_A, B, Object_);
-        checkLub(I_A, C, Object_);
-        checkLub(I_A, I_A, I_A);
-        checkLub(I_A, I_B, Object_);
-        checkLub(I_A, I_C, Object_);
-
-        checkLub(I_B, Object_, Object_);
-        checkLub(I_B, A, Object_);
-        checkLub(I_B, B, Object_);
-        checkLub(I_B, C, Object_);
-        checkLub(I_B, I_A, Object_);
-        checkLub(I_B, I_B, I_B);
-        checkLub(I_B, I_C, Object_);
-
-        checkLub(I_C, Object_, Object_);
-        checkLub(I_C, A, Object_);
-        checkLub(I_C, B, Object_);
-        checkLub(I_C, C, Object_);
-        checkLub(I_C, I_A, Object_);
-        checkLub(I_C, I_B, Object_);
-        checkLub(I_C, I_C, I_C);
-      }));
-}
-
-void testMixin() {
-  asyncTest(() => TypeEnvironment.create(r"""
-      class A {}
-      class B {}
-      class C extends B {}
-      class D extends C {} // This makes D have higher depth than Object+A.
-      class I extends Object with A, B implements A, D {}
-      class I2 extends Object with A, B implements A, D {}
-      class J extends Object with B, A implements A, D {}
-      """).then((env) {
-        ResolutionDartType Object_ = env['Object'];
-        ResolutionDartType A = env['A'];
-        ResolutionDartType B = env['B'];
-        ResolutionDartType C = env['C'];
-        ResolutionDartType D = env['D'];
-        ResolutionDartType I = env['I'];
-        ResolutionDartType I2 = env['I2'];
-        ResolutionDartType J = env['J'];
-
-        checkLub(ResolutionDartType a, ResolutionDartType b,
-            ResolutionDartType expectedLub) {
-          ResolutionDartType lub = env.computeLeastUpperBound(a, b);
-          Expect.equals(expectedLub, lub,
-              'Unexpected lub($a,$b) = $lub, expected $expectedLub');
-        }
-
-        checkLub(Object_, Object_, Object_);
-        checkLub(Object_, A, Object_);
-        checkLub(Object_, B, Object_);
-        checkLub(Object_, C, Object_);
-        checkLub(Object_, D, Object_);
-        checkLub(Object_, I, Object_);
-        checkLub(Object_, I2, Object_);
-        checkLub(Object_, J, Object_);
-
-        checkLub(A, Object_, Object_);
-        checkLub(A, A, A);
-        checkLub(A, B, Object_);
-        checkLub(A, C, Object_);
-        checkLub(A, D, Object_);
-        checkLub(A, I, A);
-        checkLub(A, I2, A);
-        checkLub(A, J, A);
-
-        checkLub(B, Object_, Object_);
-        checkLub(B, A, Object_);
-        checkLub(B, B, B);
-        checkLub(B, C, B);
-        checkLub(B, D, B);
-        checkLub(B, I, B);
-        checkLub(B, I2, B);
-        checkLub(B, J, B);
-
-        checkLub(C, Object_, Object_);
-        checkLub(C, A, Object_);
-        checkLub(C, B, B);
-        checkLub(C, C, C);
-        checkLub(C, D, C);
-        checkLub(C, I, C);
-        checkLub(C, I2, C);
-        checkLub(C, J, C);
-
-        checkLub(D, Object_, Object_);
-        checkLub(D, A, Object_);
-        checkLub(D, B, B);
-        checkLub(D, C, C);
-        checkLub(D, D, D);
-        checkLub(D, I, D);
-        checkLub(D, I2, D);
-        checkLub(D, J, D);
-
-        checkLub(I, Object_, Object_);
-        checkLub(I, A, A);
-        checkLub(I, B, B);
-        checkLub(I, C, C);
-        checkLub(I, D, D);
-        checkLub(I, I, I);
-        checkLub(I, I2, D);
-        checkLub(I, J, D);
-
-        checkLub(I2, Object_, Object_);
-        checkLub(I2, A, A);
-        checkLub(I2, B, B);
-        checkLub(I2, C, C);
-        checkLub(I2, D, D);
-        checkLub(I2, I, D);
-        checkLub(I2, I2, I2);
-        checkLub(I2, J, D);
-
-        checkLub(J, Object_, Object_);
-        checkLub(J, A, A);
-        checkLub(J, B, B);
-        checkLub(J, C, C);
-        checkLub(J, D, D);
-        checkLub(J, I, D);
-        checkLub(J, I2, D);
-        checkLub(J, J, J);
-      }));
-}
-
-void testFunction() {
-  asyncTest(() => TypeEnvironment.create(r"""
-      class A {}
-      class B {}
-      class C extends B {}
-
-      typedef dynamic__();
-      typedef void void__();
-      typedef A A__();
-      typedef B B__();
-      typedef C C__();
-
-      typedef void void__A_B(A a, B b);
-      typedef void void__A_C(A a, C b);
-      typedef void void__B_A(B a, A b);
-      typedef void void__B_C(B a, C b);
-
-      typedef void void___B([B a]);
-      typedef void void___B_C([B a, C b]);
-      typedef void void___C_C([C a, C b]);
-
-      typedef void void____B({B a});
-      typedef void void____B_C({B a, C b});
-      typedef void void____C_C({C a, C b});
-      """).then((env) {
-        ResolutionDartType Object_ = env['Object'];
-        ResolutionDartType Function_ = env['Function'];
-        ResolutionDartType dynamic__ = env['dynamic__'];
-        ResolutionDartType void__ = env['void__'];
-        ResolutionDartType A__ = env['A__'];
-        ResolutionDartType B__ = env['B__'];
-        ResolutionDartType C__ = env['C__'];
-        ResolutionDartType void__A_B = env['void__A_B'];
-        ResolutionDartType void__A_C = env['void__A_C'];
-        ResolutionDartType void__B_A = env['void__B_A'];
-        ResolutionDartType void__B_C = env['void__B_C'];
-        ResolutionDartType void___B = env['void___B'];
-        ResolutionDartType void___B_C = env['void___B_C'];
-        ResolutionDartType void___C_C = env['void___C_C'];
-        ResolutionDartType void____B = env['void____B'];
-        ResolutionDartType void____B_C = env['void____B_C'];
-        ResolutionDartType void____C_C = env['void____C_C'];
-
-        // Types used only for checking results.
-        ResolutionDartType void_ = env['void'];
-        ResolutionDartType B = env['B'];
-        ResolutionDartType C = env['C'];
-        ResolutionFunctionType Object__ = env.functionType(Object_, []);
-        ResolutionFunctionType void__Object_Object =
-            env.functionType(void_, [Object_, Object_]);
-        ResolutionFunctionType void__Object_B =
-            env.functionType(void_, [Object_, B]);
-        ResolutionFunctionType void__Object_C =
-            env.functionType(void_, [Object_, C]);
-        ResolutionFunctionType void__B_Object =
-            env.functionType(void_, [B, Object_]);
-
-        checkLub(ResolutionDartType a, ResolutionDartType b,
-            ResolutionDartType expectedLub) {
-          ResolutionDartType lub = env.computeLeastUpperBound(a, b);
-          if (a != b) {
-            expectedLub = expectedLub.unaliased;
-            lub = lub.unaliased;
-          }
-          Expect.equals(
-              expectedLub,
-              lub,
-              'Unexpected lub(${a.unaliased},'
-              '${b.unaliased} = '
-              '${lub}, expected ${expectedLub}');
-        }
-
-        checkLub(Object_, Object_, Object_);
-        checkLub(Object_, Function_, Object_);
-        checkLub(Object_, dynamic__, Object_);
-        checkLub(Object_, void__, Object_);
-        checkLub(Object_, A__, Object_);
-        checkLub(Object_, B__, Object_);
-        checkLub(Object_, C__, Object_);
-        checkLub(Object_, void__A_B, Object_);
-        checkLub(Object_, void__A_C, Object_);
-        checkLub(Object_, void__B_A, Object_);
-        checkLub(Object_, void__B_C, Object_);
-        checkLub(Object_, void___B, Object_);
-        checkLub(Object_, void___B_C, Object_);
-        checkLub(Object_, void___C_C, Object_);
-        checkLub(Object_, void____B, Object_);
-        checkLub(Object_, void____B_C, Object_);
-        checkLub(Object_, void____C_C, Object_);
-
-        checkLub(Function_, Object_, Object_);
-        checkLub(Function_, Function_, Function_);
-        checkLub(Function_, dynamic__, Function_);
-        checkLub(Function_, void__, Function_);
-        checkLub(Function_, A__, Function_);
-        checkLub(Function_, B__, Function_);
-        checkLub(Function_, C__, Function_);
-        checkLub(Function_, void__A_B, Function_);
-        checkLub(Function_, void__A_C, Function_);
-        checkLub(Function_, void__B_A, Function_);
-        checkLub(Function_, void__B_C, Function_);
-        checkLub(Function_, void___B, Function_);
-        checkLub(Function_, void___B_C, Function_);
-        checkLub(Function_, void___C_C, Function_);
-        checkLub(Function_, void____B, Function_);
-        checkLub(Function_, void____B_C, Function_);
-        checkLub(Function_, void____C_C, Function_);
-
-        checkLub(dynamic__, Object_, Object_);
-        checkLub(dynamic__, Function_, Function_);
-        checkLub(dynamic__, dynamic__, dynamic__);
-        checkLub(dynamic__, void__, dynamic__);
-        checkLub(dynamic__, A__, dynamic__);
-        checkLub(dynamic__, B__, dynamic__);
-        checkLub(dynamic__, C__, dynamic__);
-        checkLub(dynamic__, void__A_B, Function_);
-        checkLub(dynamic__, void__A_C, Function_);
-        checkLub(dynamic__, void__B_A, Function_);
-        checkLub(dynamic__, void__B_C, Function_);
-        checkLub(dynamic__, void___B, dynamic__);
-        checkLub(dynamic__, void___B_C, dynamic__);
-        checkLub(dynamic__, void___C_C, dynamic__);
-        checkLub(dynamic__, void____B, dynamic__);
-        checkLub(dynamic__, void____B_C, dynamic__);
-        checkLub(dynamic__, void____C_C, dynamic__);
-
-        checkLub(void__, Object_, Object_);
-        checkLub(void__, Function_, Function_);
-        checkLub(void__, dynamic__, dynamic__);
-        checkLub(void__, void__, void__);
-        checkLub(void__, A__, void__);
-        checkLub(void__, B__, void__);
-        checkLub(void__, C__, void__);
-        checkLub(void__, void__A_B, Function_);
-        checkLub(void__, void__A_C, Function_);
-        checkLub(void__, void__B_A, Function_);
-        checkLub(void__, void__B_C, Function_);
-        checkLub(void__, void___B, void__);
-        checkLub(void__, void___B_C, void__);
-        checkLub(void__, void___C_C, void__);
-        checkLub(void__, void____B, void__);
-        checkLub(void__, void____B_C, void__);
-        checkLub(void__, void____C_C, void__);
-
-        checkLub(A__, Object_, Object_);
-        checkLub(A__, Function_, Function_);
-        checkLub(A__, dynamic__, dynamic__);
-        checkLub(A__, void__, void__);
-        checkLub(A__, A__, A__);
-        checkLub(A__, B__, Object__);
-        checkLub(A__, C__, Object__);
-        checkLub(A__, void__A_B, Function_);
-        checkLub(A__, void__A_C, Function_);
-        checkLub(A__, void__B_A, Function_);
-        checkLub(A__, void__B_C, Function_);
-        checkLub(A__, void___B, void__);
-        checkLub(A__, void___B_C, void__);
-        checkLub(A__, void___C_C, void__);
-        checkLub(A__, void____B, void__);
-        checkLub(A__, void____B_C, void__);
-        checkLub(A__, void____C_C, void__);
-
-        checkLub(B__, Object_, Object_);
-        checkLub(B__, Function_, Function_);
-        checkLub(B__, dynamic__, dynamic__);
-        checkLub(B__, void__, void__);
-        checkLub(B__, A__, Object__);
-        checkLub(B__, B__, B__);
-        checkLub(B__, C__, B__);
-        checkLub(B__, void__A_B, Function_);
-        checkLub(B__, void__A_C, Function_);
-        checkLub(B__, void__B_A, Function_);
-        checkLub(B__, void__B_C, Function_);
-        checkLub(B__, void___B, void__);
-        checkLub(B__, void___B_C, void__);
-        checkLub(B__, void___C_C, void__);
-        checkLub(B__, void____B, void__);
-        checkLub(B__, void____B_C, void__);
-        checkLub(B__, void____C_C, void__);
-
-        checkLub(C__, Object_, Object_);
-        checkLub(C__, Function_, Function_);
-        checkLub(C__, dynamic__, dynamic__);
-        checkLub(C__, void__, void__);
-        checkLub(C__, A__, Object__);
-        checkLub(C__, B__, B__);
-        checkLub(C__, C__, C__);
-        checkLub(C__, void__A_B, Function_);
-        checkLub(C__, void__A_C, Function_);
-        checkLub(C__, void__B_A, Function_);
-        checkLub(C__, void__B_C, Function_);
-        checkLub(C__, void___B, void__);
-        checkLub(C__, void___B_C, void__);
-        checkLub(C__, void___C_C, void__);
-        checkLub(C__, void____B, void__);
-        checkLub(C__, void____B_C, void__);
-        checkLub(C__, void____C_C, void__);
-
-        checkLub(void__A_B, Object_, Object_);
-        checkLub(void__A_B, Function_, Function_);
-        checkLub(void__A_B, dynamic__, Function_);
-        checkLub(void__A_B, void__, Function_);
-        checkLub(void__A_B, A__, Function_);
-        checkLub(void__A_B, B__, Function_);
-        checkLub(void__A_B, C__, Function_);
-        checkLub(void__A_B, void__A_B, void__A_B);
-        checkLub(void__A_B, void__A_C, void__A_B);
-        checkLub(void__A_B, void__B_A, void__Object_Object);
-        checkLub(void__A_B, void__B_C, void__Object_B);
-        checkLub(void__A_B, void___B, Function_);
-        checkLub(void__A_B, void___B_C, Function_);
-        checkLub(void__A_B, void___C_C, Function_);
-        checkLub(void__A_B, void____B, Function_);
-        checkLub(void__A_B, void____B_C, Function_);
-        checkLub(void__A_B, void____C_C, Function_);
-
-        checkLub(void__A_C, Object_, Object_);
-        checkLub(void__A_C, Function_, Function_);
-        checkLub(void__A_C, dynamic__, Function_);
-        checkLub(void__A_C, void__, Function_);
-        checkLub(void__A_C, A__, Function_);
-        checkLub(void__A_C, B__, Function_);
-        checkLub(void__A_C, C__, Function_);
-        checkLub(void__A_C, void__A_B, void__A_B);
-        checkLub(void__A_C, void__A_C, void__A_C);
-        checkLub(void__A_C, void__B_A, void__Object_Object);
-        checkLub(void__A_C, void__B_C, void__Object_C);
-        checkLub(void__A_C, void___B, Function_);
-        checkLub(void__A_C, void___B_C, Function_);
-        checkLub(void__A_C, void___C_C, Function_);
-        checkLub(void__A_C, void____B, Function_);
-        checkLub(void__A_C, void____B_C, Function_);
-        checkLub(void__A_C, void____C_C, Function_);
-
-        checkLub(void__B_A, Object_, Object_);
-        checkLub(void__B_A, Function_, Function_);
-        checkLub(void__B_A, dynamic__, Function_);
-        checkLub(void__B_A, void__, Function_);
-        checkLub(void__B_A, A__, Function_);
-        checkLub(void__B_A, B__, Function_);
-        checkLub(void__B_A, C__, Function_);
-        checkLub(void__B_A, void__A_B, void__Object_Object);
-        checkLub(void__B_A, void__A_C, void__Object_Object);
-        checkLub(void__B_A, void__B_A, void__B_A);
-        checkLub(void__B_A, void__B_C, void__B_Object);
-        checkLub(void__B_A, void___B, Function_);
-        checkLub(void__B_A, void___B_C, Function_);
-        checkLub(void__B_A, void___C_C, Function_);
-        checkLub(void__B_A, void____B, Function_);
-        checkLub(void__B_A, void____B_C, Function_);
-        checkLub(void__B_A, void____C_C, Function_);
-
-        checkLub(void__B_C, Object_, Object_);
-        checkLub(void__B_C, Function_, Function_);
-        checkLub(void__B_C, dynamic__, Function_);
-        checkLub(void__B_C, void__, Function_);
-        checkLub(void__B_C, A__, Function_);
-        checkLub(void__B_C, B__, Function_);
-        checkLub(void__B_C, C__, Function_);
-        checkLub(void__B_C, void__A_B, void__Object_B);
-        checkLub(void__B_C, void__A_C, void__Object_C);
-        checkLub(void__B_C, void__B_A, void__B_Object);
-        checkLub(void__B_C, void__B_C, void__B_C);
-        checkLub(void__B_C, void___B, Function_);
-        checkLub(void__B_C, void___B_C, Function_);
-        checkLub(void__B_C, void___C_C, Function_);
-        checkLub(void__B_C, void____B, Function_);
-        checkLub(void__B_C, void____B_C, Function_);
-        checkLub(void__B_C, void____C_C, Function_);
-
-        checkLub(void___B, Object_, Object_);
-        checkLub(void___B, Function_, Function_);
-        checkLub(void___B, dynamic__, dynamic__);
-        checkLub(void___B, void__, void__);
-        checkLub(void___B, A__, void__);
-        checkLub(void___B, B__, void__);
-        checkLub(void___B, C__, void__);
-        checkLub(void___B, void__A_B, Function_);
-        checkLub(void___B, void__A_C, Function_);
-        checkLub(void___B, void__B_A, Function_);
-        checkLub(void___B, void__B_C, Function_);
-        checkLub(void___B, void___B, void___B);
-        checkLub(void___B, void___B_C, void___B);
-        checkLub(void___B, void___C_C, void___B);
-        checkLub(void___B, void____B, void__);
-        checkLub(void___B, void____B_C, void__);
-        checkLub(void___B, void____C_C, void__);
-
-        checkLub(void___B_C, Object_, Object_);
-        checkLub(void___B_C, Function_, Function_);
-        checkLub(void___B_C, dynamic__, dynamic__);
-        checkLub(void___B_C, void__, void__);
-        checkLub(void___B_C, A__, void__);
-        checkLub(void___B_C, B__, void__);
-        checkLub(void___B_C, C__, void__);
-        checkLub(void___B_C, void__A_B, Function_);
-        checkLub(void___B_C, void__A_C, Function_);
-        checkLub(void___B_C, void__B_A, Function_);
-        checkLub(void___B_C, void__B_C, Function_);
-        checkLub(void___B_C, void___B, void___B);
-        checkLub(void___B_C, void___B_C, void___B_C);
-        checkLub(void___B_C, void___C_C, void___B_C);
-        checkLub(void___B_C, void____B, void__);
-        checkLub(void___B_C, void____B_C, void__);
-        checkLub(void___B_C, void____C_C, void__);
-
-        checkLub(void___C_C, Object_, Object_);
-        checkLub(void___C_C, Function_, Function_);
-        checkLub(void___C_C, dynamic__, dynamic__);
-        checkLub(void___C_C, void__, void__);
-        checkLub(void___C_C, A__, void__);
-        checkLub(void___C_C, B__, void__);
-        checkLub(void___C_C, C__, void__);
-        checkLub(void___C_C, void__A_B, Function_);
-        checkLub(void___C_C, void__A_C, Function_);
-        checkLub(void___C_C, void__B_A, Function_);
-        checkLub(void___C_C, void__B_C, Function_);
-        checkLub(void___C_C, void___B, void___B);
-        checkLub(void___C_C, void___B_C, void___B_C);
-        checkLub(void___C_C, void___C_C, void___C_C);
-        checkLub(void___C_C, void____B, void__);
-        checkLub(void___C_C, void____B_C, void__);
-        checkLub(void___C_C, void____C_C, void__);
-
-        checkLub(void____B, Object_, Object_);
-        checkLub(void____B, Function_, Function_);
-        checkLub(void____B, dynamic__, dynamic__);
-        checkLub(void____B, void__, void__);
-        checkLub(void____B, A__, void__);
-        checkLub(void____B, B__, void__);
-        checkLub(void____B, C__, void__);
-        checkLub(void____B, void__A_B, Function_);
-        checkLub(void____B, void__A_C, Function_);
-        checkLub(void____B, void__B_A, Function_);
-        checkLub(void____B, void__B_C, Function_);
-        checkLub(void____B, void___B, void__);
-        checkLub(void____B, void___B_C, void__);
-        checkLub(void____B, void___C_C, void__);
-        checkLub(void____B, void____B, void____B);
-        checkLub(void____B, void____B_C, void____B);
-        checkLub(void____B, void____C_C, void____B);
-
-        checkLub(void____B_C, Object_, Object_);
-        checkLub(void____B_C, Function_, Function_);
-        checkLub(void____B_C, dynamic__, dynamic__);
-        checkLub(void____B_C, void__, void__);
-        checkLub(void____B_C, A__, void__);
-        checkLub(void____B_C, B__, void__);
-        checkLub(void____B_C, C__, void__);
-        checkLub(void____B_C, void__A_B, Function_);
-        checkLub(void____B_C, void__A_C, Function_);
-        checkLub(void____B_C, void__B_A, Function_);
-        checkLub(void____B_C, void__B_C, Function_);
-        checkLub(void____B_C, void___B, void__);
-        checkLub(void____B_C, void___B_C, void__);
-        checkLub(void____B_C, void___C_C, void__);
-        checkLub(void____B_C, void____B, void____B);
-        checkLub(void____B_C, void____B_C, void____B_C);
-        checkLub(void____B_C, void____C_C, void____B_C);
-
-        checkLub(void____C_C, Object_, Object_);
-        checkLub(void____C_C, Function_, Function_);
-        checkLub(void____C_C, dynamic__, dynamic__);
-        checkLub(void____C_C, void__, void__);
-        checkLub(void____C_C, A__, void__);
-        checkLub(void____C_C, B__, void__);
-        checkLub(void____C_C, C__, void__);
-        checkLub(void____C_C, void__A_B, Function_);
-        checkLub(void____C_C, void__A_C, Function_);
-        checkLub(void____C_C, void__B_A, Function_);
-        checkLub(void____C_C, void__B_C, Function_);
-        checkLub(void____C_C, void___B, void__);
-        checkLub(void____C_C, void___B_C, void__);
-        checkLub(void____C_C, void___C_C, void__);
-        checkLub(void____C_C, void____B, void____B);
-        checkLub(void____C_C, void____B_C, void____B_C);
-        checkLub(void____C_C, void____C_C, void____C_C);
-      }));
-}
-
-void testTypeVariable() {
-  asyncTest(() => TypeEnvironment.create(r"""
-      class A {}
-      class B {}
-      class C extends B {}
-      class I<S extends A,
-              T extends B,
-              U extends C,
-              V extends T,
-              W extends V,
-              X extends T> {}
-      """).then((env) {
-        //  A     B
-        //  |    / \
-        //  S   T   C
-        //     / \   \
-        //    V   X   U
-        //   /
-        //  W
-
-        ResolutionDartType Object_ = env['Object'];
-        ResolutionDartType A = env['A'];
-        ResolutionDartType B = env['B'];
-        ResolutionDartType C = env['C'];
-        ClassElement I = env.getElement('I');
-        ResolutionDartType S = I.typeVariables[0];
-        ResolutionDartType T = I.typeVariables[1];
-        ResolutionDartType U = I.typeVariables[2];
-        ResolutionDartType V = I.typeVariables[3];
-        ResolutionDartType W = I.typeVariables[4];
-        ResolutionDartType X = I.typeVariables[5];
-
-        checkLub(ResolutionDartType a, ResolutionDartType b,
-            ResolutionDartType expectedLub) {
-          ResolutionDartType lub = env.computeLeastUpperBound(a, b);
-          Expect.equals(expectedLub, lub,
-              'Unexpected lub($a,$b) = $lub, expected $expectedLub');
-        }
-
-        checkLub(Object_, Object_, Object_);
-        checkLub(Object_, A, Object_);
-        checkLub(Object_, B, Object_);
-        checkLub(Object_, C, Object_);
-        checkLub(Object_, S, Object_);
-        checkLub(Object_, T, Object_);
-        checkLub(Object_, U, Object_);
-        checkLub(Object_, V, Object_);
-        checkLub(Object_, W, Object_);
-        checkLub(Object_, X, Object_);
-
-        checkLub(A, Object_, Object_);
-        checkLub(A, A, A);
-        checkLub(A, B, Object_);
-        checkLub(A, C, Object_);
-        checkLub(A, S, A);
-        checkLub(A, T, Object_);
-        checkLub(A, U, Object_);
-        checkLub(A, V, Object_);
-        checkLub(A, W, Object_);
-        checkLub(A, X, Object_);
-
-        checkLub(B, Object_, Object_);
-        checkLub(B, A, Object_);
-        checkLub(B, B, B);
-        checkLub(B, C, B);
-        checkLub(B, S, Object_);
-        checkLub(B, T, B);
-        checkLub(B, U, B);
-        checkLub(B, V, B);
-        checkLub(B, W, B);
-        checkLub(B, X, B);
-
-        checkLub(C, Object_, Object_);
-        checkLub(C, A, Object_);
-        checkLub(C, B, B);
-        checkLub(C, C, C);
-        checkLub(C, S, Object_);
-        checkLub(C, T, B);
-        checkLub(C, U, C);
-        checkLub(C, V, B);
-        checkLub(C, W, B);
-        checkLub(C, X, B);
-
-        checkLub(S, Object_, Object_);
-        checkLub(S, A, A);
-        checkLub(S, B, Object_);
-        checkLub(S, C, Object_);
-        checkLub(S, S, S);
-        checkLub(S, T, Object_);
-        checkLub(S, U, Object_);
-        checkLub(S, V, Object_);
-        checkLub(S, W, Object_);
-        checkLub(S, X, Object_);
-
-        checkLub(T, Object_, Object_);
-        checkLub(T, A, Object_);
-        checkLub(T, B, B);
-        checkLub(T, C, B);
-        checkLub(T, S, Object_);
-        checkLub(T, T, T);
-        checkLub(T, U, B);
-        checkLub(T, V, T);
-        checkLub(T, W, T);
-        checkLub(T, X, T);
-
-        checkLub(U, Object_, Object_);
-        checkLub(U, A, Object_);
-        checkLub(U, B, B);
-        checkLub(U, C, C);
-        checkLub(U, S, Object_);
-        checkLub(U, T, B);
-        checkLub(U, U, U);
-        checkLub(U, V, B);
-        checkLub(U, W, B);
-        checkLub(U, X, B);
-
-        checkLub(V, Object_, Object_);
-        checkLub(V, A, Object_);
-        checkLub(V, B, B);
-        checkLub(V, C, B);
-        checkLub(V, S, Object_);
-        checkLub(V, T, T);
-        checkLub(V, U, B);
-        checkLub(V, V, V);
-        checkLub(V, W, V);
-        checkLub(V, X, T);
-
-        checkLub(W, Object_, Object_);
-        checkLub(W, A, Object_);
-        checkLub(W, B, B);
-        checkLub(W, C, B);
-        checkLub(W, S, Object_);
-        checkLub(W, T, T);
-        checkLub(W, U, B);
-        checkLub(W, V, V);
-        checkLub(W, W, W);
-        checkLub(W, X, T);
-
-        checkLub(X, Object_, Object_);
-        checkLub(X, A, Object_);
-        checkLub(X, B, B);
-        checkLub(X, C, B);
-        checkLub(X, S, Object_);
-        checkLub(X, T, T);
-        checkLub(X, U, B);
-        checkLub(X, V, T);
-        checkLub(X, W, T);
-        checkLub(X, X, X);
-      }));
-}
diff --git a/tests/compiler/dart2js/old_frontend/library_resolution_test.dart b/tests/compiler/dart2js/old_frontend/library_resolution_test.dart
deleted file mode 100644
index 86250d2..0000000
--- a/tests/compiler/dart2js/old_frontend/library_resolution_test.dart
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Check that relative URIs are resolved against the canonical name of a
-/// library. This only matters for dart:-libraries, so this test mocks up two
-/// dart:-libraries.
-
-import "dart:async";
-
-import "../memory_source_file_helper.dart";
-
-import "package:async_helper/async_helper.dart";
-
-import 'package:expect/expect.dart' show Expect;
-
-import 'package:compiler/compiler_new.dart';
-
-import 'package:compiler/src/diagnostics/messages.dart'
-    show MessageKind, MessageTemplate;
-
-import 'package:compiler/src/library_loader.dart' show LoadedLibraries;
-
-import 'package:compiler/src/null_compiler_output.dart' show NullCompilerOutput;
-
-import 'package:compiler/src/old_to_new_api.dart'
-    show LegacyCompilerDiagnostics, LegacyCompilerInput;
-import 'package:compiler/src/options.dart' show CompilerOptions;
-
-Uri sdkRoot = Uri.base.resolve("sdk/");
-Uri mock1LibraryUri = sdkRoot.resolve("lib/mock1.dart");
-Uri mock2LibraryUri = sdkRoot.resolve("lib/mock2.dart");
-
-class CustomCompiler extends CompilerImpl {
-  CustomCompiler(provider, handler, libraryRoot, packageConfig)
-      : super(
-            provider,
-            const NullCompilerOutput(),
-            handler,
-            new CompilerOptions()
-              ..libraryRoot = libraryRoot
-              ..useKernel = false
-              ..packageConfig = packageConfig);
-}
-
-main() async {
-  Uri packageConfig = Uri.base.resolve('.packages');
-
-  var provider = new MemorySourceFileProvider(MEMORY_SOURCE_FILES);
-  var handler = new FormattingDiagnosticHandler(provider);
-
-  Future wrappedProvider(Uri uri) async {
-    if (uri == mock1LibraryUri) {
-      uri = Uri.parse('memory:mock1.dart');
-    }
-    if (uri == mock2LibraryUri) {
-      uri = Uri.parse('memory:mock2.dart');
-    }
-    Input input = await provider.readBytesFromUri(uri, InputKind.UTF8);
-    return input.data;
-  }
-
-  String expectedMessage = MessageTemplate
-      .TEMPLATES[MessageKind.LIBRARY_NOT_FOUND]
-      .message({'resolvedUri': 'dart:mock2.dart'}).computeMessage();
-
-  int actualMessageCount = 0;
-
-  wrappedHandler(Uri uri, int begin, int end, String message, kind) {
-    if (message == expectedMessage) {
-      actualMessageCount++;
-    } else {
-      return handler(uri, begin, end, message, kind);
-    }
-  }
-
-  checkLibraries(LoadedLibraries libraries) {
-    Expect.equals(1, actualMessageCount);
-  }
-
-  CompilerImpl compiler = new CustomCompiler(
-      new LegacyCompilerInput(wrappedProvider),
-      new LegacyCompilerDiagnostics(wrappedHandler),
-      sdkRoot,
-      packageConfig);
-
-  asyncStart();
-  await compiler.setupSdk();
-  // TODO(het): Find cleaner way to do this
-  compiler.resolvedUriTranslator.sdkLibraries['m_o_c_k_1'] = mock1LibraryUri;
-  compiler.resolvedUriTranslator.sdkLibraries['m_o_c_k_2'] = mock2LibraryUri;
-  var libraries =
-      await compiler.libraryLoader.loadLibrary(Uri.parse("dart:m_o_c_k_1"));
-  await checkLibraries(libraries);
-  asyncSuccess(null);
-}
-
-const Map MEMORY_SOURCE_FILES = const {
-  "mock1.dart": "library mock1; import 'mock2.dart';",
-  "mock2.dart": "library mock2;",
-};
diff --git a/tests/compiler/dart2js/old_frontend/lookup_member_test.dart b/tests/compiler/dart2js/old_frontend/lookup_member_test.dart
deleted file mode 100644
index 30d58c7..0000000
--- a/tests/compiler/dart2js/old_frontend/lookup_member_test.dart
+++ /dev/null
@@ -1,79 +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.
-
-library lookup_member_test;
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import '../type_test_helper.dart';
-import 'package:compiler/src/elements/resolution_types.dart';
-import "package:compiler/src/elements/elements.dart"
-    show ClassElement, MemberSignature;
-import "package:compiler/src/elements/names.dart";
-
-void main() {
-  test();
-}
-
-void test() {
-  asyncTest(() => TypeEnvironment.create(r"""
-      class A<T> {
-        T foo;
-      }
-      class B<S> extends A<A<S>> {
-        S bar;
-      }
-      class C<U> extends B<String> with D<B<U>> {
-        U baz;
-      }
-      class D<V> {
-        V boz;
-      }
-      """).then((env) {
-        void expect(ResolutionInterfaceType receiverType, String memberName,
-            ResolutionDartType expectedType) {
-          MemberSignature member =
-              receiverType.lookupInterfaceMember(new PublicName(memberName));
-          Expect.isNotNull(member);
-          ResolutionDartType memberType = member.type;
-          Expect.equals(expectedType, memberType,
-              'Wrong member type for $receiverType.$memberName.');
-        }
-
-        ResolutionDartType int_ = env['int'];
-        ResolutionDartType String_ = env['String'];
-
-        ClassElement A = env.getElement('A');
-        ResolutionDartType T = A.typeVariables.first;
-        ResolutionDartType A_T = A.thisType;
-        expect(A_T, 'foo', T);
-
-        ResolutionDartType A_int = instantiate(A, [int_]);
-        expect(A_int, 'foo', int_);
-
-        ClassElement B = env.getElement('B');
-        ResolutionDartType S = B.typeVariables.first;
-        ResolutionDartType B_S = B.thisType;
-        expect(B_S, 'foo', instantiate(A, [S]));
-        expect(B_S, 'bar', S);
-
-        ResolutionDartType B_int = instantiate(B, [int_]);
-        expect(B_int, 'foo', A_int);
-        expect(B_int, 'bar', int_);
-
-        ClassElement C = env.getElement('C');
-        ResolutionDartType U = C.typeVariables.first;
-        ResolutionDartType C_U = C.thisType;
-        expect(C_U, 'foo', instantiate(A, [String_]));
-        expect(C_U, 'bar', String_);
-        expect(C_U, 'baz', U);
-        expect(C_U, 'boz', instantiate(B, [U]));
-
-        ResolutionDartType C_int = instantiate(C, [int_]);
-        expect(C_int, 'foo', instantiate(A, [String_]));
-        expect(C_int, 'bar', String_);
-        expect(C_int, 'baz', int_);
-        expect(C_int, 'boz', instantiate(B, [int_]));
-      }));
-}
diff --git a/tests/compiler/dart2js/old_frontend/malformed_uri_test.dart b/tests/compiler/dart2js/old_frontend/malformed_uri_test.dart
deleted file mode 100644
index d5affd7..0000000
--- a/tests/compiler/dart2js/old_frontend/malformed_uri_test.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that the compiler can handle missing files used in imports, exports,
-// part tags or as the main source file.
-
-library dart2js.test.malformed_uri;
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'package:compiler/src/commandline_options.dart';
-import '../memory_compiler.dart';
-
-const MEMORY_SOURCE_FILES = const {
-  'main.dart': '''
-import '../../Udyn[mic ils/expect.dart';
-
-main () { print("Hi"); }
-''',
-};
-
-testMalformedUri() {
-  asyncTest(() async {
-    var collector = new DiagnosticCollector();
-    await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        diagnosticHandler: collector,
-        options: [Flags.useOldFrontend]);
-    Expect.equals(1, collector.errors.length);
-  });
-}
-
-void main() {
-  testMalformedUri();
-}
diff --git a/tests/compiler/dart2js/old_frontend/members_test.dart b/tests/compiler/dart2js/old_frontend/members_test.dart
deleted file mode 100644
index 2ca4b90..0000000
--- a/tests/compiler/dart2js/old_frontend/members_test.dart
+++ /dev/null
@@ -1,754 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library members_test;
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import '../type_test_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/elements/resolution_types.dart';
-import "package:compiler/src/elements/elements.dart"
-    show ClassElement, MemberSignature;
-import "package:compiler/src/elements/names.dart";
-import "package:compiler/src/resolution/class_members.dart"
-    show MembersCreator, DeclaredMember, ErroneousMember, SyntheticMember;
-
-void main() {
-  testClassMembers();
-  testInterfaceMembers();
-  testClassVsInterfaceMembers();
-  testMixinMembers();
-  testMixinMembersWithoutImplements();
-}
-
-MemberSignature getMember(ResolutionInterfaceType cls, String name,
-    {bool isSetter: false, int checkType: CHECK_INTERFACE}) {
-  Name memberName = new Name(name, cls.element.library, isSetter: isSetter);
-  MemberSignature member = checkType == CHECK_CLASS
-      ? cls.element.lookupClassMember(memberName)
-      : cls.element.lookupInterfaceMember(memberName);
-  if (member != null) {
-    Expect.equals(memberName, member.name);
-  }
-  return member;
-}
-
-/// Check interface member only.
-const int CHECK_INTERFACE = 0;
-
-/// Check class member only.
-const int CHECK_CLASS = 1;
-
-/// Check that there is no class member for the interface member.
-const int NO_CLASS_MEMBER = 2;
-
-/// Check that the interface member is also a class member.
-const int ALSO_CLASS_MEMBER = 3;
-
-/**
- * Checks [member] or interface member [name] of the declaration of [cls].
- *
- * If [inheritFrom] is set, the member from [cls] must be identical to the
- * member from [inheritedFrom].
- *
- * Otherwise, the properties of member are checked against the values of
- * [isStatic], [isSetter], [isGetter], [declarer], [type] and
- * [functionType].
- *
- * If [synthesizedFrom] or [erroneousFrom] is not `null`, the member is checked
- * to be synthesized for the corresponding members found on the type is
- * [synthesizedFrom] or  or [erroneousFrom], respectively.
- * Otherwise, if [declarer] is `null`, the declarer is checked to be [cls], and
- * if [declarer] is not `null`, the declarer is checked to be [declarer].
- * If [type] is `null` it is checked that the type of the member is also the
- * member type, otherwise the type is checked to be [type].
- *
- * If [isClassMember] is `true` it is checked that the member is also a class
- * member.
- */
-MemberSignature checkMember(ResolutionInterfaceType cls, String name,
-    {bool isStatic: false,
-    bool isSetter: false,
-    bool isGetter: false,
-    ResolutionInterfaceType declarer,
-    ResolutionDartType type,
-    ResolutionFunctionType functionType,
-    ResolutionInterfaceType inheritedFrom,
-    List<ResolutionInterfaceType> synthesizedFrom,
-    List<ResolutionInterfaceType> erroneousFrom,
-    int checkType: ALSO_CLASS_MEMBER}) {
-  String memberKind = checkType == CHECK_CLASS ? 'class' : 'interface';
-  MemberSignature member =
-      getMember(cls, name, isSetter: isSetter, checkType: checkType);
-  Expect.isNotNull(member, "No $memberKind member '$name' in $cls.");
-  Name memberName = member.name;
-  if (checkType == ALSO_CLASS_MEMBER) {
-    MemberSignature classMember = cls.element.lookupClassMember(memberName);
-    Expect.isNotNull(classMember, "No class member '$memberName' in $cls.");
-    Expect.equals(member, classMember);
-  } else if (checkType == NO_CLASS_MEMBER) {
-    Expect.isNull(cls.element.lookupClassMember(memberName));
-  }
-
-  if (inheritedFrom != null) {
-    DeclaredMember inherited = checkType == CHECK_CLASS
-        ? inheritedFrom.element.lookupClassMember(memberName)
-        : inheritedFrom.element.lookupInterfaceMember(memberName);
-    Expect.isNotNull(
-        inherited, "No $memberKind member '$memberName' in $inheritedFrom.");
-    Expect.equals(inherited.inheritFrom(inheritedFrom), member);
-  } else {
-    if (erroneousFrom != null || synthesizedFrom != null) {
-      Expect.notEquals(
-          checkType,
-          CHECK_CLASS,
-          "Arguments 'erroneousFrom' and 'synthesizedFrom' only apply "
-          "to interface members.");
-      if (synthesizedFrom != null) {
-        Expect.isTrue(
-            member is SyntheticMember, "Member '$member' is not synthesized.");
-      } else {
-        Expect.isTrue(
-            member is ErroneousMember, "Member '$member' is not erroneous.");
-      }
-      Set<MemberSignature> members = new Set<MemberSignature>();
-      List from = synthesizedFrom != null ? synthesizedFrom : erroneousFrom;
-      for (ResolutionInterfaceType type in from) {
-        DeclaredMember inheritedMember =
-            type.element.lookupInterfaceMember(memberName);
-        Expect.isNotNull(inheritedMember);
-        members.add(inheritedMember.inheritFrom(type));
-      }
-      Expect.setEquals(members, member.declarations);
-    } else if (declarer != null) {
-      DeclaredMember declared = member;
-      Expect.equals(
-          declarer,
-          declared.declarer,
-          "Unexpected declarer '${declared.declarer}' of $memberKind member "
-          "'$member'. Expected '${declarer}'.");
-    } else {
-      DeclaredMember declared = member;
-      Expect.equals(cls.element, declared.element.enclosingClass);
-      Expect.equals(cls, declared.declarer);
-    }
-    Expect.equals(isSetter, member.isSetter);
-    Expect.equals(isGetter, member.isGetter);
-    if (type != null) {
-      Expect.equals(type, member.type,
-          "Unexpected type of $memberKind member '$member'.");
-    }
-    if (functionType != null) {
-      if (type == null) {
-        Expect.equals(member.type, member.functionType,
-            "Unexpected type of $memberKind member '$member'.");
-      }
-      Expect.equals(functionType, member.functionType,
-          "Unexpected member type of $memberKind member '$member'.");
-    }
-  }
-  return member;
-}
-
-void checkMemberCount(ResolutionInterfaceType cls, int expectedCount,
-    {bool interfaceMembers: true}) {
-  int count = 0;
-  if (interfaceMembers) {
-    cls.element.forEachInterfaceMember((_) => count++);
-  } else {
-    cls.element.forEachClassMember((_) => count++);
-  }
-  Expect.equals(expectedCount, count);
-}
-
-void testClassMembers() {
-  asyncTest(() => TypeEnvironment.create(r"""
-    abstract class A {
-      int field;
-      final finalField = 0;
-      static var staticField;
-
-      int get getter => 0;
-      get abstractGetter;
-      void set setter(int _) {}
-      set abstractSetter(_);
-
-      method() {}
-      abstractMethod();
-      static staticMethod() {}
-    }
-    class B<T> {
-      T field;
-      void method(T t) {}
-      static staticMethod() {}
-      toString([T t]) {}
-    }
-    class C<S> extends B<S> {}
-    class D extends C<int> {}
-    class E extends D {}
-    """,
-          options: [Flags.useOldFrontend],
-          compileMode: CompileMode.memory).then((env) {
-        ResolutionInterfaceType bool_ = env['bool'];
-        ResolutionInterfaceType String_ = env['String'];
-        ResolutionInterfaceType int_ = env['int'];
-        ResolutionDynamicType dynamic_ = env['dynamic'];
-        ResolutionVoidType void_ = env['void'];
-        ResolutionInterfaceType Type_ = env['Type'];
-        ResolutionInterfaceType Invocation_ = env['Invocation'];
-
-        ResolutionInterfaceType Object_ = env['Object'];
-        checkMemberCount(Object_, 5 /*declared*/, interfaceMembers: true);
-        checkMemberCount(Object_, 5 /*declared*/, interfaceMembers: false);
-
-        checkMember(Object_, '==',
-            functionType: env.functionType(bool_, [dynamic_]));
-        checkMember(Object_, 'hashCode',
-            isGetter: true,
-            type: int_,
-            functionType: env.functionType(int_, []));
-        checkMember(Object_, 'noSuchMethod',
-            functionType: env.functionType(dynamic_, [Invocation_]));
-        checkMember(Object_, 'runtimeType',
-            isGetter: true,
-            type: Type_,
-            functionType: env.functionType(Type_, []));
-        checkMember(Object_, 'toString',
-            functionType: env.functionType(String_, []));
-
-        ResolutionInterfaceType A = env['A'];
-        MembersCreator.computeAllClassMembers(env.resolution, A.element);
-
-        checkMemberCount(A, 5 /*inherited*/ + 9 /*non-static declared*/,
-            interfaceMembers: true);
-        checkMemberCount(
-            A,
-            5 /*inherited*/ +
-                9 /*non-abstract declared*/ +
-                3 /* abstract declared */,
-            interfaceMembers: false);
-
-        checkMember(A, '==', inheritedFrom: Object_);
-        checkMember(A, 'hashCode', inheritedFrom: Object_);
-        checkMember(A, 'noSuchMethod', inheritedFrom: Object_);
-        checkMember(A, 'runtimeType', inheritedFrom: Object_);
-        checkMember(A, 'toString', inheritedFrom: Object_);
-
-        checkMember(A, 'field',
-            isGetter: true,
-            type: int_,
-            functionType: env.functionType(int_, []));
-        checkMember(A, 'field',
-            isSetter: true,
-            type: int_,
-            functionType: env.functionType(void_, [int_]));
-        checkMember(A, 'finalField',
-            isGetter: true,
-            type: dynamic_,
-            functionType: env.functionType(dynamic_, []));
-        checkMember(A, 'staticField',
-            isGetter: true,
-            isStatic: true,
-            checkType: CHECK_CLASS,
-            type: dynamic_,
-            functionType: env.functionType(dynamic_, []));
-        checkMember(A, 'staticField',
-            isSetter: true,
-            isStatic: true,
-            checkType: CHECK_CLASS,
-            type: dynamic_,
-            functionType: env.functionType(void_, [dynamic_]));
-
-        checkMember(A, 'getter',
-            isGetter: true,
-            type: int_,
-            functionType: env.functionType(int_, []));
-        checkMember(A, 'abstractGetter',
-            isGetter: true,
-            type: dynamic_,
-            functionType: env.functionType(dynamic_, []));
-        checkMember(A, 'setter',
-            isSetter: true,
-            type: int_,
-            functionType: env.functionType(void_, [int_]));
-        checkMember(A, 'abstractSetter',
-            isSetter: true,
-            type: dynamic_,
-            functionType: env.functionType(dynamic_, [dynamic_]));
-
-        checkMember(A, 'method', functionType: env.functionType(dynamic_, []));
-        checkMember(A, 'abstractMethod',
-            functionType: env.functionType(dynamic_, []));
-        checkMember(A, 'staticMethod',
-            checkType: CHECK_CLASS,
-            isStatic: true,
-            functionType: env.functionType(dynamic_, []));
-
-        ClassElement B = env.getElement('B');
-        MembersCreator.computeAllClassMembers(env.resolution, B);
-        ResolutionInterfaceType B_this = B.thisType;
-        ResolutionTypeVariableType B_T = B_this.typeArguments.first;
-        checkMemberCount(B_this, 4 /*inherited*/ + 4 /*non-static declared*/,
-            interfaceMembers: true);
-        checkMemberCount(B_this, 4 /*inherited*/ + 5 /*declared*/,
-            interfaceMembers: false);
-
-        checkMember(B_this, '==', inheritedFrom: Object_);
-        checkMember(B_this, 'hashCode', inheritedFrom: Object_);
-        checkMember(B_this, 'noSuchMethod', inheritedFrom: Object_);
-        checkMember(B_this, 'runtimeType', inheritedFrom: Object_);
-
-        checkMember(B_this, 'field',
-            isGetter: true, type: B_T, functionType: env.functionType(B_T, []));
-        checkMember(B_this, 'field',
-            isSetter: true,
-            type: B_T,
-            functionType: env.functionType(void_, [B_T]));
-        checkMember(B_this, 'method',
-            functionType: env.functionType(void_, [B_T]));
-        checkMember(B_this, 'staticMethod',
-            checkType: CHECK_CLASS,
-            isStatic: true,
-            functionType: env.functionType(dynamic_, []));
-        checkMember(B_this, 'toString',
-            functionType:
-                env.functionType(dynamic_, [], optionalParameters: [B_T]));
-
-        ClassElement C = env.getElement('C');
-        MembersCreator.computeAllClassMembers(env.resolution, C);
-        ResolutionInterfaceType C_this = C.thisType;
-        ResolutionTypeVariableType C_S = C_this.typeArguments.first;
-        checkMemberCount(C_this, 8 /*inherited*/, interfaceMembers: true);
-        checkMemberCount(C_this, 8 /*inherited*/, interfaceMembers: false);
-        ResolutionInterfaceType B_S = instantiate(B, [C_S]);
-
-        checkMember(C_this, '==', inheritedFrom: Object_);
-        checkMember(C_this, 'hashCode', inheritedFrom: Object_);
-        checkMember(C_this, 'noSuchMethod', inheritedFrom: Object_);
-        checkMember(C_this, 'runtimeType', inheritedFrom: Object_);
-
-        checkMember(C_this, 'field',
-            isGetter: true,
-            declarer: B_S,
-            type: C_S,
-            functionType: env.functionType(C_S, []));
-        checkMember(C_this, 'field',
-            isSetter: true,
-            declarer: B_S,
-            type: C_S,
-            functionType: env.functionType(void_, [C_S]));
-        checkMember(C_this, 'method',
-            declarer: B_S, functionType: env.functionType(void_, [C_S]));
-        checkMember(C_this, 'toString',
-            declarer: B_S,
-            functionType:
-                env.functionType(dynamic_, [], optionalParameters: [C_S]));
-
-        ResolutionInterfaceType D = env['D'];
-        MembersCreator.computeAllClassMembers(env.resolution, D.element);
-        checkMemberCount(D, 8 /*inherited*/, interfaceMembers: true);
-        checkMemberCount(D, 8 /*inherited*/, interfaceMembers: false);
-        ResolutionInterfaceType B_int = instantiate(B, [int_]);
-
-        checkMember(D, '==', inheritedFrom: Object_);
-        checkMember(D, 'hashCode', inheritedFrom: Object_);
-        checkMember(D, 'noSuchMethod', inheritedFrom: Object_);
-        checkMember(D, 'runtimeType', inheritedFrom: Object_);
-
-        checkMember(D, 'field',
-            isGetter: true,
-            declarer: B_int,
-            type: int_,
-            functionType: env.functionType(int_, []));
-        checkMember(D, 'field',
-            isSetter: true,
-            declarer: B_int,
-            type: int_,
-            functionType: env.functionType(void_, [int_]));
-        checkMember(D, 'method',
-            declarer: B_int, functionType: env.functionType(void_, [int_]));
-        checkMember(D, 'toString',
-            declarer: B_int,
-            functionType:
-                env.functionType(dynamic_, [], optionalParameters: [int_]));
-
-        ResolutionInterfaceType E = env['E'];
-        MembersCreator.computeAllClassMembers(env.resolution, E.element);
-        checkMemberCount(E, 8 /*inherited*/, interfaceMembers: true);
-        checkMemberCount(E, 8 /*inherited*/, interfaceMembers: false);
-
-        checkMember(E, '==', inheritedFrom: Object_);
-        checkMember(E, 'hashCode', inheritedFrom: Object_);
-        checkMember(E, 'noSuchMethod', inheritedFrom: Object_);
-        checkMember(E, 'runtimeType', inheritedFrom: Object_);
-
-        checkMember(E, 'field',
-            isGetter: true,
-            declarer: B_int,
-            type: int_,
-            functionType: env.functionType(int_, []));
-        checkMember(E, 'field',
-            isSetter: true,
-            declarer: B_int,
-            type: int_,
-            functionType: env.functionType(void_, [int_]));
-        checkMember(E, 'method',
-            declarer: B_int, functionType: env.functionType(void_, [int_]));
-        checkMember(E, 'toString',
-            declarer: B_int,
-            functionType:
-                env.functionType(dynamic_, [], optionalParameters: [int_]));
-      }));
-}
-
-void testInterfaceMembers() {
-  asyncTest(() => TypeEnvironment.create(r"""
-    abstract class A {
-      num method1();
-      void method2();
-      void method3();
-      void method4();
-      method5(a);
-      method6(a);
-      method7(a);
-      method8(a, b);
-      method9(a, b, c);
-      method10(a, {b, c});
-      method11(a, {b, c});
-      num get getter1;
-      num get getter2;
-      void set setter1(num _);
-      void set setter2(num _);
-      void set setter3(num _);
-      get getterAndMethod;
-    }
-    abstract class B {
-      int method1();
-      int method2();
-      num method3();
-      num method4();
-      method5([a]);
-      method6([a, b]);
-      method7(a, [b]);
-      method8([a]);
-      method9(a, [b]);
-      method10(a, {c, d});
-      method11(a, b, {c, d});
-      num get getter1;
-      int get getter2;
-      void set setter1(num _);
-      set setter2(num _);
-      void set setter3(int _);
-      getterAndMethod();
-    }
-    abstract class C {
-      int method3();
-      num method4();
-    }
-    abstract class D implements A, B, C {}
-    """, options: [Flags.useOldFrontend]).then((env) {
-        ResolutionDynamicType dynamic_ = env['dynamic'];
-        ResolutionVoidType void_ = env['void'];
-        ResolutionInterfaceType num_ = env['num'];
-
-        ResolutionInterfaceType A = env['A'];
-        ResolutionInterfaceType B = env['B'];
-        ResolutionInterfaceType C = env['C'];
-        ResolutionInterfaceType D = env['D'];
-
-        // Ensure that members have been computed on all classes.
-        MembersCreator.computeAllClassMembers(env.resolution, D.element);
-
-        // A: num method1()
-        // B: int method1()
-        // D: dynamic method1() -- synthesized from A and B.
-        checkMember(D, 'method1',
-            synthesizedFrom: [A, B],
-            functionType: env.functionType(dynamic_, []),
-            checkType: NO_CLASS_MEMBER);
-
-        // A: void method2()
-        // B: int method2()
-        // D: int method2() -- inherited from B
-        checkMember(D, 'method2', inheritedFrom: B, checkType: NO_CLASS_MEMBER);
-
-        // A: void method3()
-        // B: num method3()
-        // C: int method3()
-        // D: dynamic method3() -- synthesized from A, B, and C.
-        checkMember(D, 'method3',
-            synthesizedFrom: [A, B, C],
-            functionType: env.functionType(dynamic_, []),
-            checkType: NO_CLASS_MEMBER);
-
-        // A: void method4()
-        // B: num method4()
-        // C: num method4()
-        // D: num method4() -- synthesized from B and C.
-        checkMember(D, 'method4',
-            synthesizedFrom: [B, C],
-            functionType: env.functionType(num_, []),
-            checkType: NO_CLASS_MEMBER);
-
-        // A: method5(a)
-        // B: method5([a])
-        // D: method5([a]) -- inherited from B
-        checkMember(D, 'method5', inheritedFrom: B, checkType: NO_CLASS_MEMBER);
-
-        // A: method6(a)
-        // B: method6([a, b])
-        // D: method6([a, b]) -- inherited from B
-        checkMember(D, 'method6', inheritedFrom: B, checkType: NO_CLASS_MEMBER);
-
-        // A: method7(a)
-        // B: method7(a, [b])
-        // D: method7(a, [b]) -- inherited from B
-        checkMember(D, 'method7', inheritedFrom: B, checkType: NO_CLASS_MEMBER);
-
-        // A: method8(a, b)
-        // B: method8([a])
-        // D: method8([a, b]) -- synthesized from A and B.
-        checkMember(D, 'method8',
-            synthesizedFrom: [A, B],
-            functionType: env.functionType(dynamic_, [],
-                optionalParameters: [dynamic_, dynamic_]),
-            checkType: NO_CLASS_MEMBER);
-
-        // A: method9(a, b, c)
-        // B: method9(a, [b])
-        // D: method9(a, [b, c]) -- synthesized from A and B.
-        checkMember(D, 'method9',
-            synthesizedFrom: [A, B],
-            functionType: env.functionType(dynamic_, [dynamic_],
-                optionalParameters: [dynamic_, dynamic_]),
-            checkType: NO_CLASS_MEMBER);
-
-        // A: method10(a, {b, c})
-        // B: method10(a, {c, d})
-        // D: method10(a, {b, c, d}) -- synthesized from A and B.
-        checkMember(D, 'method10',
-            synthesizedFrom: [A, B],
-            functionType: env.functionType(dynamic_, [dynamic_],
-                namedParameters: {'b': dynamic_, 'c': dynamic_, 'd': dynamic_}),
-            checkType: NO_CLASS_MEMBER);
-
-        // A: method11(a, {b, c})
-        // B: method11(a, b, {c, d})
-        // D: method11(a, [b], {c, d}) -- synthesized from A and B.
-        // TODO(johnniwinther): Change to check synthesized member when function
-        // types with both optional and named parameters are supported.
-        Expect.isNull(getMember(D, 'method11'));
-        /*checkMember(D, 'method11',
-        synthesizedFrom: [A, B],
-        functionType: env.functionType(dynamic_, [dynamic_],
-                                       optionalParameters: [dynamic_],
-                                       namedParameters: {'c': dynamic_,
-                                                         'd': dynamic_,}),
-        checkType: NO_CLASS_MEMBER);*/
-
-        // A: num get getter1
-        // B: num get getter1
-        // D: num get getter1 -- synthesized from A and B.
-        checkMember(D, 'getter1',
-            isGetter: true,
-            synthesizedFrom: [A, B],
-            type: num_,
-            functionType: env.functionType(num_, []),
-            checkType: NO_CLASS_MEMBER);
-
-        // A: num get getter2
-        // B: int get getter2
-        // D: dynamic get getter2 -- synthesized from A and B.
-        checkMember(D, 'getter2',
-            isGetter: true,
-            synthesizedFrom: [A, B],
-            type: dynamic_,
-            functionType: env.functionType(dynamic_, []),
-            checkType: NO_CLASS_MEMBER);
-
-        // A: void set setter1(num _)
-        // B: void set setter1(num _)
-        // D: void set setter1(num _) -- synthesized from A and B.
-        checkMember(D, 'setter1',
-            isSetter: true,
-            synthesizedFrom: [A, B],
-            type: num_,
-            functionType: env.functionType(void_, [num_]),
-            checkType: NO_CLASS_MEMBER);
-
-        // A: void set setter2(num _)
-        // B: set setter2(num _)
-        // D: dynamic set setter2(dynamic _) -- synthesized from A and B.
-        checkMember(D, 'setter2',
-            isSetter: true,
-            synthesizedFrom: [A, B],
-            type: dynamic_,
-            functionType: env.functionType(dynamic_, [dynamic_]),
-            checkType: NO_CLASS_MEMBER);
-
-        // A: void set setter3(num _)
-        // B: void set setter3(int _)
-        // D: dynamic set setter3(dynamic _) -- synthesized from A and B.
-        checkMember(D, 'setter3',
-            isSetter: true,
-            synthesizedFrom: [A, B],
-            type: dynamic_,
-            functionType: env.functionType(dynamic_, [dynamic_]),
-            checkType: NO_CLASS_MEMBER);
-
-        // A: get getterAndMethod
-        // B: getterAndMethod()
-        // D: nothing inherited
-        checkMember(D, 'getterAndMethod',
-            erroneousFrom: [A, B], checkType: NO_CLASS_MEMBER);
-      }));
-}
-
-void testClassVsInterfaceMembers() {
-  asyncTest(() => TypeEnvironment.create(r"""
-    class A {
-      method1() {}
-      method2() {}
-    }
-    abstract class B {
-      method1();
-      method2(a);
-    }
-    abstract class C extends A implements B {}
-    """, options: [Flags.useOldFrontend]).then((env) {
-        ResolutionDynamicType dynamic_ = env['dynamic'];
-
-        ResolutionInterfaceType A = env['A'];
-        ResolutionInterfaceType B = env['B'];
-        ResolutionInterfaceType C = env['C'];
-
-        // Ensure that members have been computed on all classes.
-        MembersCreator.computeAllClassMembers(env.resolution, C.element);
-
-        // A: method1()
-        // B: method1()
-        // C class: method1() -- inherited from A.
-        // C interface: dynamic method1() -- synthesized from A and B.
-        MemberSignature interfaceMember = checkMember(C, 'method1',
-            checkType: CHECK_INTERFACE,
-            synthesizedFrom: [A, B],
-            functionType: env.functionType(dynamic_, []));
-        MemberSignature classMember =
-            checkMember(C, 'method1', checkType: CHECK_CLASS, inheritedFrom: A);
-        Expect.notEquals(interfaceMember, classMember);
-
-        // A: method2()
-        // B: method2(a)
-        // C class: method2() -- inherited from A.
-        // C interface: dynamic method2([a]) -- synthesized from A and B.
-        interfaceMember = checkMember(C, 'method2',
-            checkType: CHECK_INTERFACE,
-            synthesizedFrom: [A, B],
-            functionType:
-                env.functionType(dynamic_, [], optionalParameters: [dynamic_]));
-        classMember =
-            checkMember(C, 'method2', checkType: CHECK_CLASS, inheritedFrom: A);
-        Expect.notEquals(interfaceMember, classMember);
-      }));
-}
-
-void testMixinMembers() {
-  asyncTest(() => TypeEnvironment.create(r"""
-    class A<T> {
-      method1() {}
-      method2() {}
-      method3(T a) {}
-      method4(T a) {}
-    }
-    abstract class B<S> {
-      method1();
-      method2(a);
-      method3(S a) {}
-    }
-    abstract class C<U, V> extends Object with A<U> implements B<V> {}
-    """, options: [Flags.useOldFrontend]).then((env) {
-        ResolutionDynamicType dynamic_ = env['dynamic'];
-
-        ClassElement A = env.getElement('A');
-        ClassElement B = env.getElement('B');
-        ClassElement C = env.getElement('C');
-        ResolutionInterfaceType C_this = C.thisType;
-        ResolutionTypeVariableType C_U = C_this.typeArguments[0];
-        ResolutionTypeVariableType C_V = C_this.typeArguments[1];
-        ResolutionInterfaceType A_U = instantiate(A, [C_U]);
-        ResolutionInterfaceType B_V = instantiate(B, [C_V]);
-
-        // Ensure that members have been computed on all classes.
-        MembersCreator.computeAllClassMembers(env.resolution, C);
-
-        // A: method1()
-        // B: method1()
-        // C class: method1() -- inherited from A.
-        // C interface: dynamic method1() -- synthesized from A and B.
-        MemberSignature interfaceMember = checkMember(C_this, 'method1',
-            checkType: CHECK_INTERFACE,
-            synthesizedFrom: [A_U, B_V],
-            functionType: env.functionType(dynamic_, []));
-        MemberSignature classMember = checkMember(C_this, 'method1',
-            checkType: CHECK_CLASS, inheritedFrom: A_U);
-        Expect.notEquals(interfaceMember, classMember);
-
-        // A: method2()
-        // B: method2(a)
-        // C class: method2() -- inherited from A.
-        // C interface: dynamic method2([a]) -- synthesized from A and B.
-        interfaceMember = checkMember(C_this, 'method2',
-            checkType: CHECK_INTERFACE,
-            synthesizedFrom: [A_U, B_V],
-            functionType:
-                env.functionType(dynamic_, [], optionalParameters: [dynamic_]));
-        classMember = checkMember(C_this, 'method2',
-            checkType: CHECK_CLASS, inheritedFrom: A_U);
-        Expect.notEquals(interfaceMember, classMember);
-
-        // A: method3(U a)
-        // B: method3(V a)
-        // C class: method3(U a) -- inherited from A.
-        // C interface: dynamic method3(a) -- synthesized from A and B.
-        interfaceMember = checkMember(C_this, 'method3',
-            checkType: CHECK_INTERFACE,
-            synthesizedFrom: [A_U, B_V],
-            functionType: env.functionType(dynamic_, [dynamic_]));
-        classMember = checkMember(C_this, 'method3',
-            checkType: CHECK_CLASS, inheritedFrom: A_U);
-        Expect.notEquals(interfaceMember, classMember);
-
-        // A: method4(U a)
-        // B: --
-        // C class: method4(U a) -- inherited from A.
-        // C interface: method4(U a) -- inherited from A.
-        checkMember(C_this, 'method4',
-            checkType: ALSO_CLASS_MEMBER, inheritedFrom: A_U);
-      }));
-}
-
-void testMixinMembersWithoutImplements() {
-  asyncTest(() => TypeEnvironment.create(r"""
-    abstract class A {
-      m();
-    }
-    abstract class B implements A {
-    }
-    abstract class C extends Object with B {}
-    """, options: [Flags.useOldFrontend]).then((env) {
-        ResolutionDynamicType dynamic_ = env['dynamic'];
-
-        ResolutionInterfaceType A = env['A'];
-        ResolutionInterfaceType C = env['C'];
-
-        // Ensure that members have been computed on all classes.
-        MembersCreator.computeAllClassMembers(env.resolution, C.element);
-
-        checkMember(C, 'm',
-            checkType: NO_CLASS_MEMBER,
-            inheritedFrom: A,
-            functionType: env.functionType(dynamic_, []));
-      }));
-}
diff --git a/tests/compiler/dart2js/old_frontend/message_kind_helper.dart b/tests/compiler/dart2js/old_frontend/message_kind_helper.dart
deleted file mode 100644
index f869e39..0000000
--- a/tests/compiler/dart2js/old_frontend/message_kind_helper.dart
+++ /dev/null
@@ -1,156 +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.
-
-library dart2js.test.message_kind_helper;
-
-import 'package:expect/expect.dart';
-import 'dart:async';
-
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/compiler.dart' show Compiler;
-import 'package:compiler/src/diagnostics/messages.dart'
-    show MessageKind, MessageTemplate;
-import 'package:compiler/compiler_new.dart' show Diagnostic;
-
-import '../memory_compiler.dart';
-
-const String ESCAPE_REGEXP = r'[[\]{}()*+?.\\^$|]';
-
-/// Most examples generate a single diagnostic.
-/// Add an exception here if a single diagnostic cannot be produced.
-/// However, consider that a single concise diagnostic is easier to understand,
-/// so try to change error reporting logic before adding an exception.
-final Set<MessageKind> kindsWithExtraMessages = new Set<MessageKind>.from([
-  // See http://dartbug.com/18361:
-  MessageKind.CANNOT_EXTEND_MALFORMED,
-  MessageKind.CANNOT_IMPLEMENT_MALFORMED,
-  MessageKind.CANNOT_MIXIN,
-  MessageKind.CANNOT_MIXIN_MALFORMED,
-  MessageKind.CANNOT_INSTANTIATE_ENUM,
-  MessageKind.CYCLIC_TYPEDEF_ONE,
-  MessageKind.DUPLICATE_DEFINITION,
-  MessageKind.EQUAL_MAP_ENTRY_KEY,
-  MessageKind.FINAL_FUNCTION_TYPE_PARAMETER,
-  MessageKind.FORMAL_DECLARED_CONST,
-  MessageKind.FORMAL_DECLARED_STATIC,
-  MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT,
-  MessageKind.HIDDEN_IMPLICIT_IMPORT,
-  MessageKind.HIDDEN_IMPORT,
-  MessageKind.INHERIT_GETTER_AND_METHOD,
-  MessageKind.UNIMPLEMENTED_METHOD,
-  MessageKind.UNIMPLEMENTED_METHOD_ONE,
-  MessageKind.VAR_FUNCTION_TYPE_PARAMETER,
-  MessageKind.UNMATCHED_TOKEN,
-]);
-
-/// Most messages can be tested without causing a fatal error. Add an exception
-/// here if a fatal error is unavoidable and leads to pending classes.
-/// Try to avoid adding exceptions here; a fatal error causes the compiler to
-/// stop before analyzing all input, and it isn't safe to reuse it.
-final Set<MessageKind> kindsWithPendingClasses = new Set<MessageKind>.from([
-  // If you add something here, please file a *new* bug report.
-]);
-
-Future<Compiler> check(MessageTemplate template, Compiler cachedCompiler) {
-  Expect.isFalse(template.examples.isEmpty);
-
-  return Future.forEach(template.examples, (example) {
-    if (example is String) {
-      example = {'main.dart': example};
-    } else {
-      Expect.isTrue(
-          example is Map, "Example must be either a String or a Map.");
-      Expect.isTrue(example.containsKey('main.dart'),
-          "Example map must contain a 'main.dart' entry.");
-    }
-    DiagnosticCollector collector = new DiagnosticCollector();
-
-    Compiler compiler = compilerFor(
-        memorySourceFiles: example,
-        diagnosticHandler: collector,
-        options: [
-          Flags.analyzeOnly,
-          Flags.enableExperimentalMirrors,
-          Flags.useOldFrontend
-        ]..addAll(template.options),
-        cachedCompiler: cachedCompiler);
-
-    return compiler.run(Uri.parse('memory:main.dart')).then((_) {
-      Iterable<CollectedMessage> messages = collector.filterMessagesByKinds([
-        Diagnostic.ERROR,
-        Diagnostic.WARNING,
-        Diagnostic.HINT,
-        Diagnostic.CRASH
-      ]);
-
-      Expect.isFalse(messages.isEmpty, 'No messages in """$example"""');
-
-      String expectedText = !template.hasHowToFix
-          ? template.template
-          : '${template.template}\n${template.howToFix}';
-      String pattern = expectedText.replaceAllMapped(
-          new RegExp(ESCAPE_REGEXP), (m) => '\\${m[0]}');
-      pattern = pattern.replaceAll(new RegExp(r'#\\\{[^}]*\\\}'), '.*');
-
-      bool checkMessage(CollectedMessage message) {
-        if (message.message.kind != MessageKind.GENERIC) {
-          return message.message.kind == template.kind;
-        } else {
-          return new RegExp('^$pattern\$').hasMatch(message.text);
-        }
-      }
-
-      // TODO(johnniwinther): Extend MessageKind to contain information on
-      // where info messages are expected.
-      bool messageFound = false;
-      List unexpectedMessages = [];
-      for (CollectedMessage message in messages) {
-        if (!messageFound && checkMessage(message)) {
-          messageFound = true;
-        } else {
-          unexpectedMessages.add(message);
-        }
-      }
-      Expect.isTrue(
-          messageFound,
-          '${template.kind}} does not match any in\n '
-          '${messages.join('\n ')}\n'
-          'Consider searching for ${template.kind} in\n'
-          '  pkg/compiler/lib/src/diagnostics/messages.dart\n'
-          'and removing the associated example');
-      dynamic reporter = compiler.reporter;
-      Expect.isFalse(reporter.hasCrashed);
-      if (!unexpectedMessages.isEmpty) {
-        for (CollectedMessage message in unexpectedMessages) {
-          print("Unexpected message: $message");
-        }
-        if (!kindsWithExtraMessages.contains(template.kind)) {
-          // Try changing the error reporting logic before adding an exception
-          // to [kindsWithExtraMessages].
-          throw 'Unexpected messages found.';
-        }
-      }
-
-      bool pendingStuff = false;
-      for (var e in compiler.resolver.pendingClassesToBePostProcessed) {
-        pendingStuff = true;
-        compiler.reporter.reportInfo(e, MessageKind.GENERIC,
-            {'text': 'Pending class to be post-processed.'});
-      }
-      for (var e in compiler.resolver.pendingClassesToBeResolved) {
-        pendingStuff = true;
-        compiler.reporter.reportInfo(
-            e, MessageKind.GENERIC, {'text': 'Pending class to be resolved.'});
-      }
-      Expect
-          .isTrue(!pendingStuff || kindsWithPendingClasses.contains(template));
-
-      if (!pendingStuff) {
-        // If there is pending stuff, or the compiler was cancelled, we
-        // shouldn't reuse the compiler.
-        cachedCompiler = compiler;
-      }
-    });
-  }).then((_) => cachedCompiler);
-}
diff --git a/tests/compiler/dart2js/old_frontend/message_kind_test.dart b/tests/compiler/dart2js/old_frontend/message_kind_test.dart
deleted file mode 100644
index c397ede..0000000
--- a/tests/compiler/dart2js/old_frontend/message_kind_test.dart
+++ /dev/null
@@ -1,64 +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.
-
-import 'package:expect/expect.dart';
-import 'dart:async';
-import "package:async_helper/async_helper.dart";
-import 'package:compiler/src/diagnostics/messages.dart'
-    show MessageKind, MessageTemplate;
-
-import 'message_kind_helper.dart';
-
-main(List<String> arguments) {
-  List<MessageTemplate> examples = <MessageTemplate>[];
-  for (var kind in MessageKind.values) {
-    MessageTemplate template = MessageTemplate.TEMPLATES[kind];
-    Expect.isNotNull(template, "No template for $kind.");
-    Expect.equals(kind, template.kind,
-        "Invalid MessageTemplate.kind for $kind, found ${template.kind}.");
-
-    String name = '${kind.toString()}'.substring('MessageKind.'.length);
-    if (!arguments.isEmpty && !arguments.contains(name)) continue;
-    if (name == 'GENERIC' // Shouldn't be used.
-        // We can't provoke a crash.
-        ||
-        name == 'COMPILER_CRASHED' ||
-        name == 'PLEASE_REPORT_THE_CRASH'
-        // We cannot provide examples for patch errors.
-        ||
-        name.startsWith('PATCH_') ||
-        name == 'LIBRARY_NOT_SUPPORTED'
-        // TODO(johnniwinther): Remove these when [Compiler.reportUnusedCode] is
-        // reenabled.
-        ||
-        name == 'UNUSED_METHOD' ||
-        name == 'UNUSED_CLASS' ||
-        name == 'UNUSED_TYPEDEF' ||
-
-        // Fasta no longer generates EXTRANEOUS_MODIFIER_REPLACE.
-        name == 'EXTRANEOUS_MODIFIER_REPLACE' ||
-
-        // Fasta just reports EXTRANEOUS_MODIFIER.
-        name == 'FORMAL_DECLARED_STATIC' ||
-
-        // Additional warning from dart2js.
-        name == 'VOID_NOT_ALLOWED') continue;
-    if (template.examples != null) {
-      examples.add(template);
-    } else {
-      print("No example in '$name'");
-    }
-  }
-  ;
-  var cachedCompiler;
-  asyncTest(() => Future.forEach(examples, (MessageTemplate template) {
-        print("Checking '${template.kind}'.");
-        Stopwatch sw = new Stopwatch()..start();
-        return check(template, cachedCompiler).then((var compiler) {
-          cachedCompiler = compiler;
-          sw.stop();
-          print("Checked '${template.kind}' in ${sw.elapsedMilliseconds}ms.");
-        });
-      }));
-}
diff --git a/tests/compiler/dart2js/old_frontend/message_span_test.dart b/tests/compiler/dart2js/old_frontend/message_span_test.dart
deleted file mode 100644
index 6d774bc..0000000
--- a/tests/compiler/dart2js/old_frontend/message_span_test.dart
+++ /dev/null
@@ -1,184 +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:convert' show json, utf8;
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/diagnostics/messages.dart';
-import 'package:compiler/src/io/source_file.dart';
-import 'package:expect/expect.dart';
-import '../memory_compiler.dart';
-import '../memory_source_file_helper.dart';
-
-const List<Test> TESTS = const <Test>[
-  const Test('''
-class A { A(b); }
-class B extends A {
-  a() {}
-
-  lot() {}
-
-  of() {}
-
-  var members;
-}
-main() => new B();''', const {
-    MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT: '''
-class B extends A {
-^^^^^^^^^^^^^^^^^'''
-  }),
-  const Test('''
-class I {}
-class A { A(b); }
-class B extends A implements I {
-  a() {}
-
-  lot() {}
-
-  of() {}
-
-  var members;
-}
-main() => new B();''', const {
-    MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT: '''
-class B extends A implements I {
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'''
-  }),
-  const Test('''
-class M<T> {}
-class A { A(b); }
-class B extends A with M<int> {
-  a() {}
-
-  lot() {}
-
-  of() {}
-
-  var members;
-}
-main() => new B();''', const {
-    MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT: '''
-class B extends A with M<int> {
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'''
-  }),
-  const Test('''
-class A { A(b); }
-class B
-    extends A {
-  a() {}
-
-  lot() {}
-
-  of() {}
-
-  var members;
-}
-main() => new B();''', const {
-    MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT: '''
-class B
-    extends A {
-'''
-  }),
-  const Test('''
-void foo(int a) {
-  // a
-  // non-empty
-  // body
-}
-main() => foo('');''', const {
-    MessageKind.THIS_IS_THE_METHOD: '''
-void foo(int a) {
-^^^^^^^^^^^^^^^'''
-  }),
-  const Test('''
-void foo(int a,
-         int b) {
-  // a
-  // non-empty
-  // body
-}
-main() => foo('', 0);''', const {
-    MessageKind.THIS_IS_THE_METHOD: '''
-void foo(int a,
-         int b) {
-'''
-  }),
-  const Test('''
-class A {
-  int foo() {
-    // a
-    // non-empty
-    // body
-  }
-}
-class B extends A {
-  int get foo {
-    // a
-    // non-empty
-    // body
-    return 0;
-  }
-}
-main() => new B();''', const {
-    MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER: '''
-  int get foo {
-  ^^^^^^^^^^^''',
-    MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT: '''
-  int foo() {
-  ^^^^^^^^^'''
-  }),
-];
-
-class Test {
-  final String code;
-  final Map<MessageKind, String> kindToSpan;
-
-  const Test(this.code, this.kindToSpan);
-}
-
-const String MARKER = '---marker---';
-
-main() {
-  asyncTest(() async {
-    var cachedCompiler;
-    for (Test test in TESTS) {
-      DiagnosticCollector collector = new DiagnosticCollector();
-      CompilationResult result = await runCompiler(
-          memorySourceFiles: {'main.dart': test.code},
-          options: [Flags.analyzeOnly, Flags.useOldFrontend],
-          diagnosticHandler: collector,
-          cachedCompiler: cachedCompiler);
-      cachedCompiler = result.compiler;
-      MemorySourceFileProvider provider = cachedCompiler.provider;
-      Map<MessageKind, String> kindToSpan =
-          new Map<MessageKind, String>.from(test.kindToSpan);
-      for (CollectedMessage message in collector.messages) {
-        String expectedSpanText = kindToSpan[message.messageKind];
-        if (expectedSpanText != null) {
-          SourceFile sourceFile = provider.getUtf8SourceFile(message.uri);
-          String locationMessage =
-              sourceFile.getLocationMessage(MARKER, message.begin, message.end);
-          // Remove `filename:line:column:` and message.
-          String strippedLocationMessage = locationMessage
-              .substring(locationMessage.indexOf(MARKER) + MARKER.length + 1);
-          // Using jsonEncode to add string quotes and backslashes.
-          String expected = json.encode(
-              utf8.decode(expectedSpanText.codeUnits, allowMalformed: true));
-          String actual = json.encode(utf8
-              .decode(strippedLocationMessage.codeUnits, allowMalformed: true));
-          Expect.equals(
-              expectedSpanText,
-              strippedLocationMessage,
-              "Unexpected span for ${message.messageKind} in\n${test.code}"
-              "\nExpected: $expected"
-              "\nActual  : $actual");
-          kindToSpan.remove(message.messageKind);
-        }
-      }
-      kindToSpan.forEach((MessageKind kind, _) {
-        Expect.fail("Missing message kin $kind in\n${test.code}");
-      });
-    }
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/metadata_test.dart b/tests/compiler/dart2js/old_frontend/metadata_test.dart
deleted file mode 100644
index f24dcf22..0000000
--- a/tests/compiler/dart2js/old_frontend/metadata_test.dart
+++ /dev/null
@@ -1,242 +0,0 @@
-// 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.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/constants/values.dart'
-    show ConstantValue, StringConstantValue;
-import 'package:expect/expect.dart';
-import '../compiler_helper.dart';
-import 'package:compiler/src/parser/partial_elements.dart'
-    show PartialMetadataAnnotation;
-import 'package:compiler/src/diagnostics/diagnostic_listener.dart'
-    show DiagnosticReporter;
-
-void checkPosition(Spannable spannable, Node node, String source,
-    DiagnosticReporter reporter) {
-  SourceSpan span = reporter.spanFromSpannable(spannable);
-  Expect.isTrue(
-      span.begin < span.end, 'begin = ${span.begin}; end = ${span.end}');
-  Expect.isTrue(
-      span.end < source.length, 'end = ${span.end}; length = ${source.length}');
-  String yield = source.substring(span.begin, span.end);
-
-  // TODO(ahe): The node does not include "@". Fix that.
-  Expect.stringEquals('@$node', yield);
-}
-
-void checkAnnotation(String name, String declaration,
-    {bool isTopLevelOnly: false}) {
-  // Ensure that a compile-time constant can be resolved from an
-  // annotation.
-  var source1 = """const native = 'xyz';
-                   @native
-                   $declaration
-                   main() {}""";
-
-  analyzeAndCheck(source1, name, (compiler, element) {
-    compiler.enqueuer.resolution.queueIsClosed = false;
-    Expect.equals(
-        1, element.metadata.length, 'Unexpected metadata count on $element.');
-    PartialMetadataAnnotation annotation = element.metadata.first;
-    annotation.ensureResolved(compiler.resolution);
-    ConstantValue value =
-        compiler.constants.getConstantValue(annotation.constant);
-    Expect.isTrue(value is StringConstantValue);
-    Expect.stringEquals('xyz', (value as StringConstantValue).stringValue);
-
-    checkPosition(
-        annotation, annotation.cachedNode, source1, compiler.reporter);
-  });
-
-  // Ensure that each repeated annotation has a unique instance of
-  // [MetadataAnnotation].
-  var source2 = """const native = 'xyz';
-                   @native @native
-                   $declaration
-                   main() {}""";
-
-  analyzeAndCheck(source2, name, (compiler, element) {
-    compiler.enqueuer.resolution.queueIsClosed = false;
-    Expect.equals(2, element.metadata.length);
-    PartialMetadataAnnotation annotation1 = element.metadata.elementAt(0);
-    PartialMetadataAnnotation annotation2 = element.metadata.elementAt(1);
-    annotation1.ensureResolved(compiler.resolution);
-    annotation2.ensureResolved(compiler.resolution);
-    Expect.isFalse(
-        identical(annotation1, annotation2), 'expected unique instances');
-    Expect.notEquals(annotation1, annotation2, 'expected unequal instances');
-    ConstantValue value1 =
-        compiler.constants.getConstantValue(annotation1.constant);
-    ConstantValue value2 =
-        compiler.constants.getConstantValue(annotation2.constant);
-    Expect.identical(value1, value2, 'expected same compile-time constant');
-    Expect.isTrue(value1 is StringConstantValue);
-    Expect.isTrue(value2 is StringConstantValue);
-    Expect.stringEquals('xyz', (value1 as StringConstantValue).stringValue);
-    Expect.stringEquals('xyz', (value2 as StringConstantValue).stringValue);
-
-    checkPosition(
-        annotation1, annotation1.cachedNode, source2, compiler.reporter);
-    checkPosition(
-        annotation2, annotation2.cachedNode, source2, compiler.reporter);
-  });
-
-  if (isTopLevelOnly) return;
-
-  // Ensure that a compile-time constant can be resolved from an
-  // annotation.
-  var source3 = """const native = 'xyz';
-                   class Foo {
-                     @native
-                     $declaration
-                   }
-                   main() {}""";
-
-  analyzeAndCheck(source3, 'Foo', (compiler, dynamic element) {
-    compiler.enqueuer.resolution.queueIsClosed = false;
-    Expect.equals(0, element.metadata.length);
-    element.ensureResolved(compiler.resolution);
-    Expect.equals(0, element.metadata.length);
-    element = element.lookupLocalMember(name);
-    Expect.equals(1, element.metadata.length);
-    PartialMetadataAnnotation annotation = element.metadata.first;
-    annotation.ensureResolved(compiler.resolution);
-    ConstantValue value =
-        compiler.constants.getConstantValue(annotation.constant);
-    Expect.isTrue(value is StringConstantValue);
-    Expect.stringEquals('xyz', (value as StringConstantValue).stringValue);
-
-    checkPosition(
-        annotation, annotation.cachedNode, source3, compiler.reporter);
-  });
-
-  // Ensure that each repeated annotation has a unique instance of
-  // [MetadataAnnotation].
-  var source4 = """const native = 'xyz';
-                   class Foo {
-                     @native @native
-                     $declaration
-                   }
-                   main() {}""";
-
-  analyzeAndCheck(source4, 'Foo', (compiler, dynamic element) {
-    compiler.enqueuer.resolution.queueIsClosed = false;
-    Expect.equals(0, element.metadata.length);
-    element.ensureResolved(compiler.resolution);
-    Expect.equals(0, element.metadata.length);
-    element = element.lookupLocalMember(name);
-    Expect.equals(2, element.metadata.length);
-    PartialMetadataAnnotation annotation1 = element.metadata.elementAt(0);
-    PartialMetadataAnnotation annotation2 = element.metadata.elementAt(1);
-    annotation1.ensureResolved(compiler.resolution);
-    annotation2.ensureResolved(compiler.resolution);
-    Expect.isFalse(
-        identical(annotation1, annotation2), 'expected unique instances');
-    Expect.notEquals(annotation1, annotation2, 'expected unequal instances');
-    ConstantValue value1 =
-        compiler.constants.getConstantValue(annotation1.constant);
-    ConstantValue value2 =
-        compiler.constants.getConstantValue(annotation2.constant);
-    Expect.identical(value1, value2, 'expected same compile-time constant');
-    Expect.isTrue(value1 is StringConstantValue);
-    Expect.isTrue(value2 is StringConstantValue);
-    Expect.stringEquals('xyz', (value1 as StringConstantValue).stringValue);
-    Expect.stringEquals('xyz', (value2 as StringConstantValue).stringValue);
-
-    checkPosition(
-        annotation1, annotation1.cachedNode, source4, compiler.reporter);
-    checkPosition(
-        annotation1, annotation2.cachedNode, source4, compiler.reporter);
-  });
-}
-
-void testClassMetadata() {
-  checkAnnotation('Foo', 'class Foo {}', isTopLevelOnly: true);
-}
-
-void testTopLevelMethodMetadata() {
-  checkAnnotation('foo', 'foo() {}');
-}
-
-void testTopLevelFieldMetadata() {
-  checkAnnotation('foo', 'var foo;');
-  checkAnnotation('bar', 'var foo, bar;');
-}
-
-void testLibraryTags() {
-  void compileAndCheckLibrary(String source,
-      List<MetadataAnnotation> extractMetadata(LibraryElement element)) {
-    Uri partUri = new Uri(scheme: 'source', path: 'part.dart');
-    String partSource = '@native part of foo;';
-
-    Uri libUri = new Uri(scheme: 'source', path: 'lib.dart');
-    String libSource = 'library lib;';
-
-    Uri uri = new Uri(scheme: 'source', path: 'main.dart');
-
-    var compiler = mockCompilerFor(source, uri, analyzeOnly: true)
-      ..registerSource(partUri, partSource)
-      ..registerSource(libUri, libSource);
-
-    asyncTest(() => compiler.run(uri).then((_) {
-          compiler.enqueuer.resolution.queueIsClosed = false;
-          LibraryElement element = compiler.libraryLoader.lookupLibrary(uri);
-          Expect.isNotNull(element, 'Cannot find $uri');
-
-          List<MetadataAnnotation> metadata = extractMetadata(element);
-          Expect.equals(1, metadata.length);
-
-          PartialMetadataAnnotation annotation = metadata.first;
-          annotation.ensureResolved(compiler.resolution);
-          ConstantValue value =
-              compiler.constants.getConstantValue(annotation.constant);
-          Expect.isTrue(value is StringConstantValue);
-          Expect.stringEquals(
-              'xyz', (value as StringConstantValue).stringValue);
-
-          checkPosition(
-              annotation, annotation.cachedNode, source, compiler.reporter);
-        }));
-  }
-
-  var source;
-
-  source = """@native
-              library foo;
-              const native = 'xyz';
-              main() {}""";
-  compileAndCheckLibrary(source, (dynamic e) => e.libraryTag.metadata);
-
-  source = """@native
-              import 'lib.dart';
-              const native = 'xyz';
-              main() {}""";
-  compileAndCheckLibrary(source, (dynamic e) => e.tags.single.metadata);
-
-  source = """@native
-              export 'lib.dart';
-              const native = 'xyz';
-              main() {}""";
-  compileAndCheckLibrary(source, (dynamic e) => e.tags.single.metadata);
-
-  source = """@native
-              part 'part.dart';
-              const native = 'xyz';
-              main() {}""";
-  compileAndCheckLibrary(source, (dynamic e) => e.tags.single.metadata);
-
-  source = """@native
-              part 'part.dart';
-              const native = 'xyz';
-              main() {}""";
-  compileAndCheckLibrary(
-      source, (dynamic e) => e.compilationUnits.first.partTag.metadata);
-}
-
-void main() {
-  testClassMetadata();
-  testTopLevelMethodMetadata();
-  testTopLevelFieldMetadata();
-  testLibraryTags();
-}
diff --git a/tests/compiler/dart2js/old_frontend/method_type_variable_test.dart b/tests/compiler/dart2js/old_frontend/method_type_variable_test.dart
deleted file mode 100644
index 00a037a..0000000
--- a/tests/compiler/dart2js/old_frontend/method_type_variable_test.dart
+++ /dev/null
@@ -1,144 +0,0 @@
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/diagnostics/messages.dart';
-import 'package:expect/expect.dart';
-import '../memory_compiler.dart';
-
-runTest(String code,
-    {List<MessageKind> expectedWarnings: const <MessageKind>[],
-    List<MessageKind> expectedHints: const <MessageKind>[]}) async {
-  print('--test--------------------------------------------------------------');
-  print(code);
-  DiagnosticCollector collector = new DiagnosticCollector();
-  await runCompiler(
-      memorySourceFiles: {'main.dart': code},
-      diagnosticHandler: collector,
-      options: [Flags.useOldFrontend]);
-  Expect.equals(0, collector.errors.length, "Unexpected errors.");
-  Expect.listEquals(
-      expectedWarnings,
-      collector.warnings.map((m) => m.messageKind).toList(),
-      "Unexpected warnings.");
-  Expect.listEquals(expectedHints,
-      collector.hints.map((m) => m.messageKind).toList(), "Unexpected hints.");
-}
-
-class Test {
-  final String code;
-  final List<MessageKind> warnings;
-  final List<MessageKind> hints;
-
-  const Test(this.code,
-      {this.warnings: const <MessageKind>[],
-      this.hints: const <MessageKind>[]});
-}
-
-const List<Test> tests = const <Test>[
-  /// Is-test on method type variable in unused static method.
-  const Test('''
-method<T>(T t) => t is T;
-main() {}
-'''),
-
-  /// Is-test on method type variable in used static method.
-  const Test('''
-method<T>(T t) => t is T;
-main() => method<int>(0);
-''', warnings: const <MessageKind>[
-    MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED
-  ]),
-
-  /// Is-test on method type variable in unused instance method.
-  const Test('''
-class C {
-  method<T>(T t) => t is T;
-}
-main() => new C();
-'''),
-
-  /// Is-test on method type variable in used instance method.
-  const Test('''
-class C {
-  method<T>(T t) => t is T;
-}
-main() => new C().method<int>(0);
-''', warnings: const <MessageKind>[
-    MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED
-  ]),
-
-  /// As-cast on method type variable in unused static method.
-  const Test('''
-method<T>(T t) => t as T;
-main() {}
-'''),
-
-  /// As-cast on method type variable in used static method.
-  const Test('''
-method<T>(T t) => t as T;
-main() => method<int>(0);
-''', hints: const <MessageKind>[
-    MessageKind.TYPE_VARIABLE_FROM_METHOD_CONSIDERED_DYNAMIC
-  ]),
-
-  /// As-cast on method type variable in unused instance method.
-  const Test('''
-class C {
-  method<T>(T t) => t as T;
-}
-main() => new C();
-'''),
-
-  /// As-cast on method type variable in used instance method.
-  const Test('''
-class C {
-  method<T>(T t) => t as T;
-}
-main() => new C().method<int>(0);
-''', hints: const <MessageKind>[
-    MessageKind.TYPE_VARIABLE_FROM_METHOD_CONSIDERED_DYNAMIC
-  ]),
-
-  /// Method type variable literal in unused static method.
-  const Test('''
-method<T>() => T;
-main() {}
-'''),
-
-  /// Method type variable literal in used static method.
-  const Test('''
-method<T>() => T;
-main() => method<int>();
-''', warnings: const <MessageKind>[
-    MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED
-  ]),
-
-  /// Method type variable literal in unused instance method.
-  const Test('''
-class C {
-  method<T>() => T;
-}
-main() => new C();
-'''),
-
-  /// Method type variable literal in used instance method.
-  const Test('''
-class C {
-  method<T>() => T;
-}
-main() => new C().method<int>();
-''', warnings: const <MessageKind>[
-    MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED
-  ]),
-];
-
-main() {
-  asyncTest(() async {
-    for (Test test in tests) {
-      await runTest(
-        test.code,
-        expectedWarnings: test.warnings,
-        expectedHints: test.hints,
-      );
-    }
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/minimal_resolution_test.dart b/tests/compiler/dart2js/old_frontend/minimal_resolution_test.dart
deleted file mode 100644
index c266e93..0000000
--- a/tests/compiler/dart2js/old_frontend/minimal_resolution_test.dart
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that elements are not needlessly required by dart2js.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/common/names.dart';
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/elements/elements.dart';
-import 'package:compiler/src/enqueue.dart';
-import 'package:expect/expect.dart';
-import '../memory_compiler.dart';
-
-main() {
-  asyncTest(() async {
-    await analyze('main() {}');
-    await analyze('main() => proxy;', proxyConstantComputed: true);
-    await analyze('@deprecated main() {}');
-    await analyze('@deprecated main() => deprecated;', deprecatedClass: true);
-    await analyze('main() => deprecated;', deprecatedClass: true);
-  });
-}
-
-void checkInstantiated(Compiler compiler, ClassElement cls, bool expected) {
-  ResolutionEnqueuer enqueuer = compiler.enqueuer.resolution;
-  bool isInstantiated =
-      enqueuer.worldBuilder.directlyInstantiatedClasses.contains(cls);
-  bool isProcessed = enqueuer.processedClasses.contains(cls);
-  Expect.equals(expected, isInstantiated,
-      'Unexpected instantiation state of class $cls.');
-  Expect.equals(
-      expected, isProcessed, 'Unexpected processing state of class $cls.');
-}
-
-analyze(String code,
-    {bool proxyConstantComputed: false, bool deprecatedClass: false}) async {
-  CompilationResult result = await runCompiler(
-      memorySourceFiles: {'main.dart': code},
-      options: ['--analyze-only', Flags.useOldFrontend]);
-  Expect.isTrue(result.isSuccess);
-  Compiler compiler = result.compiler;
-  Expect.equals(
-      proxyConstantComputed,
-      compiler.resolution.wasProxyConstantComputedTestingOnly,
-      "Unexpected computation of proxy constant.");
-
-  LibraryElement coreLibrary =
-      compiler.frontendStrategy.commonElements.coreLibrary;
-  checkInstantiated(
-      compiler, coreLibrary.find('_Proxy'), proxyConstantComputed);
-  checkInstantiated(compiler, coreLibrary.find('Deprecated'), deprecatedClass);
-
-  LibraryElement jsHelperLibrary =
-      compiler.libraryLoader.lookupLibrary(Uris.dart__js_helper);
-  jsHelperLibrary.forEachLocalMember((Element element) {
-    Uri uri = element.compilationUnit.script.resourceUri;
-    if (element.isClass && uri.path.endsWith('annotations.dart')) {
-      checkInstantiated(compiler, element, false);
-    }
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/missing_file_test.dart b/tests/compiler/dart2js/old_frontend/missing_file_test.dart
deleted file mode 100644
index 5fdbb8a..0000000
--- a/tests/compiler/dart2js/old_frontend/missing_file_test.dart
+++ /dev/null
@@ -1,85 +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.
-
-// Test that the compiler can handle imports when package root has not been set.
-
-library dart2js.test.missing_file;
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import "package:compiler/src/diagnostics/messages.dart";
-import 'package:expect/expect.dart';
-import '../memory_compiler.dart';
-
-const MEMORY_SOURCE_FILES = const {
-  'main.dart': '''
-import 'foo.dart';
-main() {}
-''',
-  'bar.dart': '''
-import 'dart:foo';
-main() {}
-''',
-  'baz.dart': '''
-import 'dart:io';
-main() {}
-''',
-};
-
-Future runTest(Uri main, {MessageKind error, MessageKind info}) async {
-  print("----\nentry-point: $main\n");
-
-  DiagnosticCollector diagnostics = new DiagnosticCollector();
-  OutputCollector output = new OutputCollector();
-  await runCompiler(
-      entryPoint: main,
-      memorySourceFiles: MEMORY_SOURCE_FILES,
-      diagnosticHandler: diagnostics,
-      outputProvider: output,
-      options: [Flags.useOldFrontend]);
-
-  Expect.isFalse(output.hasExtraOutput);
-  Expect.equals(error != null ? 1 : 0, diagnostics.errors.length);
-  if (error != null) {
-    Expect.equals(error, diagnostics.errors.first.message.kind);
-  }
-  Expect.equals(info != null ? 1 : 0, diagnostics.infos.length);
-  if (info != null) {
-    Expect.equals(info, diagnostics.infos.first.message.kind);
-  }
-  Expect.equals(0, diagnostics.warnings.length);
-  Expect.equals(0, diagnostics.hints.length);
-}
-
-void main() {
-  asyncTest(() async {
-    await runTest(Uri.parse('memory:main.dart'),
-        error: MessageKind.READ_URI_ERROR);
-
-    await runTest(Uri.parse('memory:foo.dart'),
-        error: MessageKind.READ_SELF_ERROR);
-
-    await runTest(Uri.parse('dart:foo'), error: MessageKind.LIBRARY_NOT_FOUND);
-
-    await runTest(Uri.parse('dart:_mirror_helper'),
-        error: MessageKind.INTERNAL_LIBRARY,
-        info: MessageKind.DISALLOWED_LIBRARY_IMPORT);
-
-    await runTest(Uri.parse('memory:bar.dart'),
-        error: MessageKind.LIBRARY_NOT_FOUND);
-
-    // Importing dart:io is temporarily allowed as a stopgap measure for the
-    // lack of config specific imports. Once that is added, this will be
-    // disallowed again.
-
-    //await runTest(Uri.parse('dart:io'),
-    //    error: MessageKind.LIBRARY_NOT_SUPPORTED,
-    //    info: MessageKind.DISALLOWED_LIBRARY_IMPORT);
-
-    //await runTest(Uri.parse('memory:baz.dart'),
-    //    error: MessageKind.LIBRARY_NOT_SUPPORTED,
-    //    info: MessageKind.DISALLOWED_LIBRARY_IMPORT);
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/mixin_language_test.dart b/tests/compiler/dart2js/old_frontend/mixin_language_test.dart
deleted file mode 100644
index 89b4e0f..0000000
--- a/tests/compiler/dart2js/old_frontend/mixin_language_test.dart
+++ /dev/null
@@ -1,21 +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.
-
-// Test that dart2js produces the expected static type warnings for these
-// language tests. This ensures that the analyzer and dart2js agrees on the
-// tests.
-
-import 'warnings_checker.dart';
-
-/// Map from test files to a map of their expected status. If the status map is
-/// `null` no warnings must be missing or unexpected, otherwise the status map
-/// can contain a list of line numbers for keys 'missing' and 'unexpected' for
-/// the warnings of each category.
-const Map<String, dynamic> TESTS = const {
-  'language_2/typevariable_substitution2_test.dart': null,
-};
-
-void main(List<String> arguments) {
-  checkWarnings(TESTS, arguments);
-}
diff --git a/tests/compiler/dart2js/old_frontend/mock_compiler.dart b/tests/compiler/dart2js/old_frontend/mock_compiler.dart
deleted file mode 100644
index 2bb5bee..0000000
--- a/tests/compiler/dart2js/old_frontend/mock_compiler.dart
+++ /dev/null
@@ -1,401 +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.
-
-library mock_compiler;
-
-import 'dart:async';
-import 'dart:collection';
-
-import 'package:compiler/compiler_new.dart' as api;
-import 'package:compiler/src/common/names.dart' show Uris;
-import 'package:compiler/src/constants/expressions.dart';
-import 'package:compiler/src/elements/resolution_types.dart'
-    show ResolutionDartType;
-import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
-import 'package:compiler/src/diagnostics/source_span.dart';
-import 'package:compiler/src/diagnostics/spannable.dart';
-import 'package:compiler/src/elements/elements.dart';
-import 'package:compiler/src/elements/visitor.dart';
-import 'package:compiler/src/library_loader.dart' show LoadedLibraries;
-import 'package:compiler/src/io/source_file.dart';
-import 'package:compiler/src/options.dart' show CompilerOptions;
-import 'package:compiler/src/resolution/members.dart';
-import 'package:compiler/src/resolution/registry.dart';
-import 'package:compiler/src/resolution/scope.dart';
-import 'package:compiler/src/resolution/tree_elements.dart';
-import 'package:compiler/src/resolved_uri_translator.dart';
-import 'package:compiler/src/script.dart';
-import 'package:compiler/src/tree/tree.dart';
-import 'package:compiler/src/old_to_new_api.dart';
-import 'parser_helper.dart';
-
-import 'package:compiler/src/elements/modelx.dart'
-    show ErroneousElementX, FunctionElementX;
-
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/common/tasks.dart' show Measurer;
-
-import 'package:compiler/src/deferred_load.dart' show OutputUnit;
-
-import 'package:compiler/src/resolution/deferred_load.dart'
-    show AstDeferredLoadTask;
-
-import 'mock_libraries.dart';
-import '../diagnostic_helper.dart';
-
-export '../diagnostic_helper.dart';
-
-final Uri PATCH_CORE = new Uri(scheme: 'patch', path: 'core');
-
-typedef String LibrarySourceProvider(Uri uri);
-
-class MockCompiler extends Compiler {
-  api.CompilerDiagnostics diagnosticHandler;
-  final api.CompilerInput provider = null;
-
-  /// Expected number of warnings. If `null`, the number of warnings is
-  /// not checked.
-  final int expectedWarnings;
-
-  /// Expected number of errors. If `null`, the number of errors is not checked.
-  final int expectedErrors;
-  final Map<String, SourceFile> sourceFiles;
-  Node parsedTree;
-  final LibrarySourceProvider librariesOverride;
-  final DiagnosticCollector diagnosticCollector = new DiagnosticCollector();
-  final ResolvedUriTranslator resolvedUriTranslator =
-      new MockResolvedUriTranslator();
-  final Measurer measurer = new Measurer();
-  LibraryElement mainApp;
-
-  MockCompiler.internal(
-      {Map<String, String> coreSource,
-      bool enableTypeAssertions: false,
-      bool enableUserAssertions: false,
-      bool enableMinification: false,
-      bool disableTypeInference: false,
-      bool analyzeAll: false,
-      bool analyzeOnly: false,
-      // Our unit tests check code generation output that is
-      // affected by inlining support.
-      bool disableInlining: true,
-      bool trustTypeAnnotations: false,
-      bool trustJSInteropTypeAnnotations: false,
-      bool enableAsyncAwait: false,
-      int this.expectedWarnings,
-      int this.expectedErrors,
-      api.CompilerOutput outputProvider,
-      LibrarySourceProvider this.librariesOverride})
-      : sourceFiles = new Map<String, SourceFile>(),
-        super(
-            options: new CompilerOptions()
-              ..entryPoint = new Uri(scheme: 'mock')
-              ..libraryRoot = Uri.parse('placeholder_library_root_for_mock/')
-              ..useKernel = false
-              ..enableTypeAssertions = enableTypeAssertions
-              ..enableUserAssertions = enableUserAssertions
-              ..disableInlining = disableInlining
-              ..enableAssertMessage = true
-              ..enableMinification = enableMinification
-              ..disableTypeInference = disableTypeInference
-              ..analyzeAll = analyzeAll
-              ..analyzeOnly = analyzeOnly
-              ..trustTypeAnnotations = trustTypeAnnotations
-              ..trustJSInteropTypeAnnotations = trustJSInteropTypeAnnotations
-              ..shownPackageWarnings = const [],
-            outputProvider: outputProvider) {
-    deferredLoadTask = new MockDeferredLoadTask(this);
-
-    registerSource(
-        Uris.dart_core, buildLibrarySource(DEFAULT_CORE_LIBRARY, coreSource));
-    registerSource(PATCH_CORE, DEFAULT_PATCH_CORE_SOURCE);
-    registerSource(
-        Uris.dart__internal, buildLibrarySource(DEFAULT_INTERNAL_LIBRARY));
-
-    registerSource(
-        Uris.dart__js_helper, buildLibrarySource(DEFAULT_JS_HELPER_LIBRARY));
-    registerSource(Uris.dart__foreign_helper,
-        buildLibrarySource(DEFAULT_FOREIGN_HELPER_LIBRARY));
-    registerSource(Uris.dart__interceptors,
-        buildLibrarySource(DEFAULT_INTERCEPTORS_LIBRARY));
-    registerSource(Uris.dart__isolate_helper,
-        buildLibrarySource(DEFAULT_ISOLATE_HELPER_LIBRARY));
-    registerSource(Uris.dart_mirrors, DEFAULT_MIRRORS_SOURCE);
-    registerSource(Uris.dart__js_mirrors, DEFAULT_JS_MIRRORS_SOURCE);
-
-    Map<String, String> asyncLibrarySource = <String, String>{};
-    asyncLibrarySource.addAll(DEFAULT_ASYNC_LIBRARY);
-    if (enableAsyncAwait) {
-      asyncLibrarySource.addAll(ASYNC_AWAIT_LIBRARY);
-    }
-    registerSource(Uris.dart_async, buildLibrarySource(asyncLibrarySource));
-  }
-
-  /// Initialize the mock compiler with an empty main library.
-  Future<Uri> init([String mainSource = ""]) {
-    Uri uri = new Uri(scheme: "mock");
-    registerSource(uri, mainSource);
-    return libraryLoader
-        .loadLibrary(uri)
-        .then((LoadedLibraries loadedLibraries) {
-      processLoadedLibraries(loadedLibraries);
-      mainApp = loadedLibraries.rootLibrary;
-      startResolution();
-      // We need to make sure the Object class is resolved. When registering a
-      // dynamic invocation the ArgumentTypesRegistry eventually iterates over
-      // the interfaces of the Object class which would be 'null' if the class
-      // wasn't resolved.
-      ClassElement objectClass = resolution.commonElements.objectClass;
-      objectClass.ensureResolved(resolution);
-    }).then((_) => uri);
-  }
-
-  Future<bool> run(Uri uri, [String mainSource = ""]) {
-    return init(mainSource).then((Uri mainUri) {
-      return super.run(uri == null ? mainUri : uri);
-    }).then((result) {
-      if (expectedErrors != null &&
-          expectedErrors != diagnosticCollector.errors.length) {
-        throw "unexpected error during compilation "
-            "${diagnosticCollector.errors}";
-      } else if (expectedWarnings != null &&
-          expectedWarnings != diagnosticCollector.warnings.length) {
-        throw "unexpected warnings during compilation "
-            "${diagnosticCollector.warnings}";
-      } else {
-        return result;
-      }
-    });
-  }
-
-  /**
-   * Registers the [source] with [uri] making it possible load [source] as a
-   * library.  If an override has been provided in [librariesOverride], that
-   * is used instead.
-   */
-  void registerSource(Uri uri, String source) {
-    if (librariesOverride != null) {
-      String override = librariesOverride(uri);
-      if (override != null) {
-        source = override;
-      }
-    }
-    sourceFiles[uri.toString()] = new MockFile(source);
-  }
-
-  void reportDiagnostic(DiagnosticMessage message,
-      List<DiagnosticMessage> infoMessages, api.Diagnostic kind) {
-    void processMessage(DiagnosticMessage message, api.Diagnostic kind) {
-      SourceSpan span = message.sourceSpan;
-      Uri uri;
-      int begin;
-      int end;
-      String text = '${message.message}';
-      if (span != null) {
-        uri = span.uri;
-        begin = span.begin;
-        end = span.end;
-      }
-      diagnosticCollector.report(message.message, uri, begin, end, text, kind);
-      if (diagnosticHandler != null) {
-        diagnosticHandler.report(message.message, uri, begin, end, text, kind);
-      }
-    }
-
-    processMessage(message, kind);
-    infoMessages.forEach((i) => processMessage(i, api.Diagnostic.INFO));
-  }
-
-  CollectingTreeElements resolveStatement(String text) {
-    parsedTree = parseStatement(text);
-    LibraryElement library = mainApp;
-    return resolveNodeStatement(parsedTree, new MockElement(library));
-  }
-
-  TreeElementMapping resolveNodeStatement(
-      Node tree, ExecutableElement element) {
-    ResolverVisitor visitor = new ResolverVisitor(
-        this.resolution,
-        element,
-        new ResolutionRegistry(
-            this.backend.target, new CollectingTreeElements(element)),
-        scope:
-            new MockTypeVariablesScope(element.enclosingElement.buildScope()));
-    if (visitor.scope is LibraryScope ||
-        visitor.scope is MockTypeVariablesScope) {
-      visitor.scope = new MethodScope(visitor.scope, element);
-    }
-    visitor.visit(tree);
-    visitor.scope = new LibraryScope(element.library);
-    return visitor.registry.mapping;
-  }
-
-  resolverVisitor() {
-    LibraryElement library = mainApp;
-    Element mockElement = new MockElement(library.entryCompilationUnit);
-    ResolverVisitor visitor = new ResolverVisitor(
-        this.resolution,
-        mockElement,
-        new ResolutionRegistry(
-            this.backend.target, new CollectingTreeElements(mockElement)),
-        scope: mockElement.enclosingElement.buildScope());
-    visitor.scope = new MethodScope(visitor.scope, mockElement);
-    return visitor;
-  }
-
-  parseScript(String text, [LibraryElement library]) {
-    if (library == null) library = mainApp;
-    parseUnit(text, this, library, registerSource);
-  }
-
-  Future scanBuiltinLibraries() {
-    // Do nothing. The mock core library is already handled in the constructor.
-    return new Future.value();
-  }
-
-  Future<LibraryElement> scanBuiltinLibrary(String name) {
-    // Do nothing. The mock core library is already handled in the constructor.
-    return new Future.value();
-  }
-
-  // The mock library doesn't need any patches.
-  Uri resolvePatchUri(String dartLibraryName) {
-    if (dartLibraryName == 'core') {
-      return PATCH_CORE;
-    }
-    return null;
-  }
-
-  Future<Script> readScript(Uri uri, [Spannable spannable]) {
-    SourceFile sourceFile = sourceFiles[uri.toString()];
-    if (sourceFile == null) throw new ArgumentError(uri);
-    return new Future.value(new Script(uri, uri, sourceFile));
-  }
-
-  Element lookupElementIn(ScopeContainerElement container, name) {
-    Element element = container.localLookup(name);
-    return element != null
-        ? element
-        : new ErroneousElementX(null, null, name, container);
-  }
-
-  /// Create a new [MockCompiler] and apply it asynchronously to [f].
-  static Future<T> create<T>(FutureOr<T> f(MockCompiler compiler)) {
-    MockCompiler compiler = new MockCompiler.internal();
-    return compiler.init().then((_) => f(compiler));
-  }
-}
-
-class MockResolvedUriTranslator implements ResolvedUriTranslator {
-  static final dynamic _emptySet = new Set();
-
-  Uri translate(LibraryElement importingLibrary, Uri resolvedUri,
-          Spannable spannable) =>
-      resolvedUri;
-  Set<Uri> get disallowedLibraryUris => _emptySet;
-  bool get mockableLibraryUsed => false;
-  Map<String, Uri> get sdkLibraries => const <String, Uri>{};
-}
-
-class CollectingTreeElements extends TreeElementMapping {
-  final Map<Node, Element> map = new LinkedHashMap<Node, Element>();
-
-  CollectingTreeElements(Element currentElement) : super(currentElement);
-
-  operator []=(Node node, Element element) {
-    map[node] = element;
-  }
-
-  operator [](Node node) => map[node];
-
-  void remove(Node node) {
-    map.remove(node);
-  }
-
-  List<ConstantExpression> get constants {
-    List<ConstantExpression> list = <ConstantExpression>[];
-    forEachConstantNode((_, c) => list.add(c));
-    return list;
-  }
-}
-
-class MockTypeVariablesScope extends TypeVariablesScope {
-  @override
-  List<ResolutionDartType> get typeVariables => <ResolutionDartType>[];
-  MockTypeVariablesScope(Scope parent) : super(parent);
-  String toString() => 'MockTypeVariablesScope($parent)';
-}
-
-// The mock compiler does not split the program in output units.
-class MockDeferredLoadTask extends AstDeferredLoadTask {
-  MockDeferredLoadTask(Compiler compiler) : super(compiler);
-
-  OutputUnit getElementOutputUnit(dynamic dependency) {
-    return mainOutputUnit;
-  }
-}
-
-api.CompilerDiagnostics createHandler(MockCompiler compiler, String text,
-    {bool verbose: false}) {
-  return new LegacyCompilerDiagnostics(
-      (uri, int begin, int end, String message, kind) {
-    if (kind == api.Diagnostic.VERBOSE_INFO && !verbose) return;
-    SourceFile sourceFile;
-    if (uri == null) {
-      sourceFile = new StringSourceFile.fromName('analysis', text);
-    } else {
-      sourceFile = compiler.sourceFiles[uri.toString()];
-    }
-    if (sourceFile != null && begin != null && end != null) {
-      print('${kind}: ${sourceFile.getLocationMessage(message, begin, end)}');
-    } else {
-      print('${kind}: $message');
-    }
-  });
-}
-
-class MockElement extends FunctionElementX {
-  MockElement(Element enclosingElement)
-      : super('', ElementKind.FUNCTION, Modifiers.EMPTY, enclosingElement);
-
-  get node => null;
-
-  parseNode(_) => null;
-
-  bool get hasNode => false;
-
-  accept(ElementVisitor visitor, arg) {
-    return visitor.visitMethodElement(this, arg);
-  }
-}
-
-// TODO(herhut): Disallow warnings and errors during compilation by default.
-MockCompiler mockCompilerFor(String code, Uri uri,
-    {bool analyzeAll: false,
-    bool analyzeOnly: false,
-    Map<String, String> coreSource,
-    bool disableInlining: true,
-    bool minify: false,
-    bool trustTypeAnnotations: false,
-    bool enableTypeAssertions: false,
-    bool enableUserAssertions: false,
-    int expectedErrors,
-    int expectedWarnings,
-    api.CompilerOutput outputProvider}) {
-  MockCompiler compiler = new MockCompiler.internal(
-      analyzeAll: analyzeAll,
-      analyzeOnly: analyzeOnly,
-      coreSource: coreSource,
-      disableInlining: disableInlining,
-      enableMinification: minify,
-      trustTypeAnnotations: trustTypeAnnotations,
-      enableTypeAssertions: enableTypeAssertions,
-      enableUserAssertions: enableUserAssertions,
-      expectedErrors: expectedErrors,
-      expectedWarnings: expectedWarnings,
-      outputProvider: outputProvider);
-  compiler.registerSource(uri, code);
-  compiler.diagnosticHandler = createHandler(compiler, code);
-  return compiler;
-}
diff --git a/tests/compiler/dart2js/old_frontend/no_such_method_codegen_test.dart b/tests/compiler/dart2js/old_frontend/no_such_method_codegen_test.dart
deleted file mode 100644
index 4c531f5..0000000
--- a/tests/compiler/dart2js/old_frontend/no_such_method_codegen_test.dart
+++ /dev/null
@@ -1,24 +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.
-
-// The mock compiler of dart2js used to make the compiler crash on
-// this program.
-//
-// The SSA backend generates a call to a throwNoSuchMethod helper for
-// the access to `foo`, and we used to not infer return types of
-// helpers, so we did not know throwNoSuchMethod was not returning.
-// As a consequence, all operator[] had to be compiled, and due to
-// missing backend dependencies, some of them were not resolved.
-
-import '../compiler_helper.dart';
-
-const String TEST = '''
-main() => foo[42];
-''';
-
-main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(TEST, uri);
-  compiler.run(uri);
-}
diff --git a/tests/compiler/dart2js/old_frontend/null_is_bottom_test.dart b/tests/compiler/dart2js/old_frontend/null_is_bottom_test.dart
deleted file mode 100644
index 4d2ca6b..0000000
--- a/tests/compiler/dart2js/old_frontend/null_is_bottom_test.dart
+++ /dev/null
@@ -1,21 +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.
-
-// Test that dart2js produces the expected static type warnings for proxy
-// language tests. This ensures that the analyzer and dart2js agrees on these
-// tests.
-
-import 'warnings_checker.dart';
-
-/// Map from test files to a map of their expected status. If the status map is
-/// `null` no warnings must be missing or unexpected, otherwise the status map
-/// can contain a list of line numbers for keys 'missing' and 'unexpected' for
-/// the warnings of each category.
-const Map<String, dynamic> TESTS = const {
-  'language/null_is_bottom_type_test.dart': null,
-};
-
-void main(List<String> args) {
-  checkWarnings(TESTS, args);
-}
diff --git a/tests/compiler/dart2js/old_frontend/options_helper.dart b/tests/compiler/dart2js/old_frontend/options_helper.dart
deleted file mode 100644
index ec63774..0000000
--- a/tests/compiler/dart2js/old_frontend/options_helper.dart
+++ /dev/null
@@ -1,20 +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.
-
-library options_helper;
-
-import 'package:compiler/src/options.dart';
-export 'package:compiler/src/options.dart';
-
-class MockDiagnosticOptions implements DiagnosticOptions {
-  const MockDiagnosticOptions();
-
-  bool get fatalWarnings => false;
-  bool get terseDiagnostics => false;
-  bool get suppressWarnings => false;
-  bool get suppressHints => false;
-  bool get showAllPackageWarnings => false;
-  bool get hidePackageWarnings => true;
-  bool showPackageWarningsFor(Uri uri) => false;
-}
diff --git a/tests/compiler/dart2js/old_frontend/override_inheritance_test.dart b/tests/compiler/dart2js/old_frontend/override_inheritance_test.dart
deleted file mode 100644
index 271b498..0000000
--- a/tests/compiler/dart2js/old_frontend/override_inheritance_test.dart
+++ /dev/null
@@ -1,1610 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import '../compiler_helper.dart';
-import 'package:compiler/src/resolution/class_members.dart' show MembersCreator;
-
-main() {
-  asyncTest(() => Future.wait([
-        testRequiredParameters(),
-        testPositionalParameters(),
-        testNamedParameters(),
-        testNotSubtype(),
-        testGetterNotSubtype(),
-        testSetterNotSubtype(),
-        testGenericNotSubtype(),
-        testFieldNotSubtype(),
-        testMixedOverride(),
-        testAbstractMethods(),
-        testNoSuchMethod(),
-      ]));
-}
-
-Future check(String source, {errors, warnings, hints, infos}) {
-  return MockCompiler.create((MockCompiler compiler) {
-    compiler.diagnosticHandler = createHandler(compiler, source);
-    compiler.parseScript(source);
-    dynamic mainApp = compiler.mainApp;
-    var cls = mainApp.find('Class');
-    cls.ensureResolved(compiler.resolution);
-    MembersCreator.computeAllClassMembers(compiler.resolution, cls);
-
-    toList(o) => o == null ? [] : o is List ? o : [o];
-
-    compareMessageKinds(
-        source, toList(errors), compiler.diagnosticCollector.errors, 'error');
-
-    compareMessageKinds(source, toList(warnings),
-        compiler.diagnosticCollector.warnings, 'warning');
-
-    if (infos != null) {
-      compareMessageKinds(
-          source, toList(infos), compiler.diagnosticCollector.infos, 'info');
-    }
-
-    if (hints != null) {
-      compareMessageKinds(
-          source, toList(hints), compiler.diagnosticCollector.hints, 'hint');
-    }
-  });
-}
-
-Future testRequiredParameters() {
-  return Future.wait([
-    check("""
-          class A {
-            method() => null; // testRequiredParameters:0
-          }
-          class Class extends A {
-            method() => null; // testRequiredParameters:1
-          }
-          """),
-    check("""
-          class A {
-            method(a) => null; // testRequiredParameters:2
-          }
-          class Class extends A {
-            method(b) => null; // testRequiredParameters:3
-          }
-          """),
-    check("""
-          class A {
-            method(a, b, c, d) => null; // testRequiredParameters:3
-          }
-          class Class extends A {
-            method(b, a, d, c) => null; // testRequiredParameters:4
-          }
-          """),
-    check("""
-          class A {
-            method() => null; // testRequiredParameters:5
-          }
-          class Class extends A {
-            method(a) => null; // testRequiredParameters:6
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-    check("""
-          class A {
-            method() => null; // testRequiredParameters:7
-          }
-          class Class implements A {
-            method(a) => null; // testRequiredParameters:8
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-    check("""
-          class A {
-            method(a, b, c) => null; // testRequiredParameters:9
-          }
-          class Class extends A {
-            method(a, b, c, d) => null; // testRequiredParameters:10
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-  ]);
-}
-
-Future testPositionalParameters() {
-  return Future.wait([
-    check("""
-          class A {
-            method([a]) => null; // testPositionalParameters:1
-          }
-          class Class extends A {
-            method([a]) => null; // testPositionalParameters:2
-          }
-          """),
-    check("""
-          class A {
-            method([a, b]) => null; // testPositionalParameters:3
-          }
-          class Class extends A {
-            method([b, a]) => null; // testPositionalParameters:4
-          }
-          """),
-    check("""
-          class A {
-            method([a, b, c]) => null; // testPositionalParameters:5
-          }
-          class Class extends A {
-            method([b, d, a, c]) => null; // testPositionalParameters:6
-          }
-          """),
-    check("""
-          class A {
-            method([a]) => null; // testPositionalParameters:7
-          }
-          class Class extends A {
-            method([a]) => null; // testPositionalParameters:8
-          }
-          """),
-    check("""
-          class A {
-            method(a) => null; // testPositionalParameters:9
-          }
-          class Class extends A {
-            method() => null; // testPositionalParameters:10
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-    check("""
-          class A {
-            method(a, [b]) => null; // testPositionalParameters:11
-          }
-          class Class extends A {
-            method(a) => null; // testPositionalParameters:12
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-    check("""
-          class A {
-            method(a, [b]) => null; // testPositionalParameters:13
-          }
-          class Class extends A {
-            method([a]) => null; // testPositionalParameters:14
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-    check("""
-          class A {
-            method(a, b, [c, d, e]) => null; // testPositionalParameters:15
-          }
-          class Class extends A {
-            method([a, b, c, d]) => null; // testPositionalParameters:16
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-  ]);
-}
-
-Future testNamedParameters() {
-  return Future.wait([
-    check("""
-          class A {
-            method({a}) => null; // testNamedParameters:1
-          }
-          class Class extends A {
-            method({a}) => null; // testNamedParameters:2
-          }
-          """),
-    check("""
-          class A {
-            method({a, b}) => null; // testNamedParameters:3
-          }
-          class Class extends A {
-            method({b, a}) => null; // testNamedParameters:4
-          }
-          """),
-    check("""
-          class A {
-            method({a, b, c}) => null; // testNamedParameters:5
-          }
-          class Class extends A {
-            method({b, c, a, d}) => null; // testNamedParameters:6
-          }
-          """),
-    check("""
-          class A {
-            method(d, {a, b, c}) => null; // testNamedParameters:7
-          }
-          class Class extends A {
-            method(e, {b, c, a, d}) => null; // testNamedParameters:8
-          }
-          """),
-    check("""
-          class A {
-            method({a}) => null; // testNamedParameters:9
-          }
-          class Class extends A {
-            method() => null; // testNamedParameters:10
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-    check("""
-          class A {
-            method({a, b}) => null; // testNamedParameters:11
-          }
-          class Class extends A {
-            method({b}) => null; // testNamedParameters:12
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-    check("""
-          class A {
-            method({a, b, c, d}) => null; // testNamedParameters:13
-          }
-          class Class extends A {
-            method({a, e, d, c}) => null; // testNamedParameters:14
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-  ]);
-}
-
-Future testNotSubtype() {
-  return Future.wait([
-    check("""
-          class A {
-            method(int a) => null; // testNotSubtype:1
-          }
-          class Class extends A {
-            method(int a) => null; // testNotSubtype:2
-          }
-          """),
-
-    check("""
-          class A {
-            method(int a) => null; // testNotSubtype:3
-          }
-          class Class extends A {
-            method(num a) => null; // testNotSubtype:4
-          }
-          """),
-
-    check("""
-          class A {
-            void method() {} // testNotSubtype:5
-          }
-          class Class extends A {
-            method() => null; // testNotSubtype:6
-          }
-          """),
-
-    check("""
-          class A {
-            method() => null; // testNotSubtype:7
-          }
-          class Class extends A {
-            void method() {} // testNotSubtype:8
-          }
-          """),
-
-    check("""
-          class A {
-            void method() {} // testNotSubtype:9
-          }
-          class Class extends A {
-            int method() => null; // testNotSubtype:10
-          }
-          """),
-
-    check("""
-          class A {
-            int method() => null; // testNotSubtype:11
-          }
-          class Class extends A {
-            void method() {} // testNotSubtype:12
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-
-    check("""
-          class A {
-            method(int a) => null; // testNotSubtype:13
-          }
-          class B extends A {
-            method(num a) => null; // testNotSubtype:14
-          }
-          class Class extends B {
-            method(double a) => null; // testNotSubtype:15
-          }
-          """),
-
-    check("""
-          class A {
-            method(int a) => null; // testNotSubtype:16
-          }
-          class B extends A {
-            method(a) => null; // testNotSubtype:17
-          }
-          class Class extends B {
-            method(String a) => null; // testNotSubtype:18
-          }
-          """),
-
-    check("""
-          class A {
-            method(int a) => null; // testNotSubtype:19
-          }
-          class Class extends A {
-            method(String a) => null; // testNotSubtype:20
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-
-    // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
-    check("""
-          class A {
-            method(int a) => null; // testNotSubtype:23
-          }
-          class B {
-            method(num a) => null; // testNotSubtype:24
-          }
-          abstract class C implements A, B {
-          }
-          class Class implements C {
-            method(double a) => null; // testNotSubtype:25
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-
-    check("""
-          class A {
-            method(num a) => null; // testNotSubtype:29
-          }
-          class B {
-            method(int a) => null; // testNotSubtype:30
-          }
-          abstract class C implements A, B {
-          }
-          class Class implements C {
-            method(double a) => null; // testNotSubtype:31
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-
-    check("""
-          class A {
-            method(int a) => null; // testNotSubtype:26
-          }
-          class B {
-            method(num a) => null; // testNotSubtype:27
-          }
-          abstract class C implements A, B {
-          }
-          class Class implements C {
-            method(String a) => null; // testNotSubtype:28
-          }
-          """, warnings: [
-      MessageKind.INVALID_OVERRIDE_METHOD,
-      MessageKind.INVALID_OVERRIDE_METHOD
-    ], infos: [
-      MessageKind.INVALID_OVERRIDDEN_METHOD,
-      MessageKind.INVALID_OVERRIDDEN_METHOD
-    ]),
-  ]);
-}
-
-Future testGetterNotSubtype() {
-  return Future.wait([
-    check("""
-          class A {
-            get getter => null; // testGetterNotSubtype:1
-          }
-          class Class extends A {
-            get getter => null; // testGetterNotSubtype:2
-          }
-          """),
-
-    check("""
-          class A {
-            num get getter => null; // testGetterNotSubtype:3
-          }
-          class Class extends A {
-            num get getter => null; // testGetterNotSubtype:4
-          }
-          """),
-
-    check("""
-          class A {
-            num get getter => null; // testGetterNotSubtype:5
-          }
-          class Class extends A {
-            int get getter => null; // testGetterNotSubtype:6
-          }
-          """),
-
-    check("""
-          class A {
-            int get getter => null; // testGetterNotSubtype:7
-          }
-          class Class extends A {
-            num get getter => null; // testGetterNotSubtype:8
-          }
-          """),
-
-    check("""
-          class A {
-            int get getter => null; // testGetterNotSubtype:9
-          }
-          class Class extends A {
-            double get getter => null; // testGetterNotSubtype:10
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_GETTER,
-        infos: MessageKind.INVALID_OVERRIDDEN_GETTER),
-
-    check("""
-          class A {
-            int get getter => null; // testGetterNotSubtype:11
-          }
-          class B extends A {
-            num get getter => null; // testGetterNotSubtype:12
-          }
-          class Class extends B {
-            double get getter => null; // testGetterNotSubtype:13
-          }
-          """),
-
-    check("""
-          class A {
-            int get getter => null; // testGetterNotSubtype:14
-          }
-          class B {
-            num get getter => null; // testGetterNotSubtype:15
-          }
-          class Class extends A implements B {
-            double get getter => null; // testGetterNotSubtype:16
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_GETTER,
-        infos: MessageKind.INVALID_OVERRIDDEN_GETTER),
-
-    check("""
-          class A {
-            int get getter => null; // testGetterNotSubtype:17
-          }
-          class B {
-            String get getter => null; // testGetterNotSubtype:18
-          }
-          class Class extends A implements B {
-            double get getter => null; // testGetterNotSubtype:19
-          }
-          """, warnings: [
-      MessageKind.INVALID_OVERRIDE_GETTER,
-      MessageKind.INVALID_OVERRIDE_GETTER
-    ], infos: [
-      MessageKind.INVALID_OVERRIDDEN_GETTER,
-      MessageKind.INVALID_OVERRIDDEN_GETTER
-    ]),
-
-    check("""
-          class A {
-            int get getter => null; // testGetterNotSubtype:20
-          }
-          class B {
-            String get getter => null; // testGetterNotSubtype:21
-          }
-          class Class implements A, B {
-            double get getter => null; // testGetterNotSubtype:22
-          }
-          """, warnings: [
-      MessageKind.INVALID_OVERRIDE_GETTER,
-      MessageKind.INVALID_OVERRIDE_GETTER
-    ], infos: [
-      MessageKind.INVALID_OVERRIDDEN_GETTER,
-      MessageKind.INVALID_OVERRIDDEN_GETTER
-    ]),
-
-    // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
-    check("""
-          class A {
-            int get getter => null; // testGetterNotSubtype:23
-          }
-          class B {
-            num get getter => null; // testGetterNotSubtype:24
-          }
-          abstract class C implements A, B {
-          }
-          class Class implements C {
-            double get getter => null; // testGetterNotSubtype:25
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_GETTER,
-        infos: MessageKind.INVALID_OVERRIDDEN_GETTER),
-
-    check("""
-          class A {
-            int get getter => null; // testGetterNotSubtype:26
-          }
-          class B {
-            num get getter => null; // testGetterNotSubtype:27
-          }
-          abstract class C implements A, B {
-          }
-          class Class implements C {
-            String get getter => null; // testGetterNotSubtype:28
-          }
-          """, warnings: [
-      MessageKind.INVALID_OVERRIDE_GETTER,
-      MessageKind.INVALID_OVERRIDE_GETTER
-    ], infos: [
-      MessageKind.INVALID_OVERRIDDEN_GETTER,
-      MessageKind.INVALID_OVERRIDDEN_GETTER
-    ]),
-  ]);
-}
-
-Future testGenericNotSubtype() {
-  return Future.wait([
-    check("""
-          class A<T> {
-            method(T t) => null; // testGenericNotSubtype:1
-          }
-          class Class<S> extends A<S> {
-            method(S s) => null; // testGenericNotSubtype:2
-          }
-          """),
-
-    check("""
-          class A<T> {
-            method(T t) => null; // testGenericNotSubtype:3
-          }
-          class Class extends A<num> {
-            method(int i) => null; // testGenericNotSubtype:4
-          }
-          """),
-
-    check("""
-          class A<T> {
-            method(T t) => null; // testGenericNotSubtype:5
-          }
-          class B<S> {
-            method(S s) => null; // testGenericNotSubtype:6
-          }
-          class Class extends A<double> implements B<int> {
-            method(num i) => null; // testGenericNotSubtype:7
-          }
-          """),
-
-    check("""
-          class A<T> {
-            method(T t) => null; // testGenericNotSubtype:8
-          }
-          class Class<S> extends A<S> {
-            method(int i) => null; // testGenericNotSubtype:9
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-
-    check("""
-          class A<T> {
-            method(T t) => null; // testGenericNotSubtype:10
-          }
-          class B<S> extends A<S> {
-
-          }
-          class Class<U> extends B<U> {
-            method(U u) => null; // testGenericNotSubtype:11
-          }
-          """),
-
-    check("""
-          class A<T> {
-            method(T t) => null; // testGenericNotSubtype:12
-          }
-          class B<S> {
-            method(S s) => null; // testGenericNotSubtype:13
-          }
-          class Class<U> extends A<U> implements B<num> {
-            method(int i) => null; // testGenericNotSubtype:14
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-
-    check("""
-          class A<T> {
-            method(T t) => null; // testGenericNotSubtype:15
-          }
-          class B<S> {
-            method(S s) => null; // testGenericNotSubtype:16
-          }
-          class Class extends A<int> implements B<String> {
-            method(double d) => null; // testGenericNotSubtype:17
-          }
-          """, warnings: [
-      MessageKind.INVALID_OVERRIDE_METHOD,
-      MessageKind.INVALID_OVERRIDE_METHOD
-    ], infos: [
-      MessageKind.INVALID_OVERRIDDEN_METHOD,
-      MessageKind.INVALID_OVERRIDDEN_METHOD
-    ]),
-
-    check("""
-          class A<T> {
-            method(T t) => null; // testGenericNotSubtype:18
-          }
-          class B<S> {
-            method(S s) => null; // testGenericNotSubtype:19
-          }
-          class Class implements A<int>, B<String> {
-            method(double d) => null; // testGenericNotSubtype:20
-          }
-          """, warnings: [
-      MessageKind.INVALID_OVERRIDE_METHOD,
-      MessageKind.INVALID_OVERRIDE_METHOD
-    ], infos: [
-      MessageKind.INVALID_OVERRIDDEN_METHOD,
-      MessageKind.INVALID_OVERRIDDEN_METHOD
-    ]),
-
-    // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
-    check("""
-          class A<T> {
-            method(T t) => null; // testGenericNotSubtype:21
-          }
-          class B<S> {
-            method(S s) => null; // testGenericNotSubtype:22
-          }
-          abstract class C implements A<int>, B<num> {
-          }
-          class Class implements C {
-            method(double d) => null; // testGenericNotSubtype:23
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-        infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
-
-    check("""
-          class A<T> {
-            method(T t) => null; // testGenericNotSubtype:24
-          }
-          class B<S> {
-            method(S s) => null; // testGenericNotSubtype:25
-          }
-          abstract class C implements A<int>, B<num> {
-          }
-          class Class implements C {
-            method(String s) => null; // testGenericNotSubtype:26
-          }
-          """, warnings: [
-      MessageKind.INVALID_OVERRIDE_METHOD,
-      MessageKind.INVALID_OVERRIDE_METHOD
-    ], infos: [
-      MessageKind.INVALID_OVERRIDDEN_METHOD,
-      MessageKind.INVALID_OVERRIDDEN_METHOD
-    ]),
-  ]);
-}
-
-Future testSetterNotSubtype() {
-  return Future.wait([
-    check("""
-        class A {
-          set setter(_) => null; // testSetterNotSubtype:1
-        }
-        class Class extends A {
-          set setter(_) => null; // testSetterNotSubtype:2
-        }
-        """),
-
-    check("""
-        class A {
-          void set setter(_) {} // testSetterNotSubtype:3
-        }
-        class Class extends A {
-          set setter(_) => null; // testSetterNotSubtype:4
-        }
-        """),
-
-    check("""
-        class A {
-          set setter(_) => null; // testSetterNotSubtype:5
-        }
-        class Class extends A {
-          void set setter(_) {} // testSetterNotSubtype:6
-        }
-        """),
-
-    check("""
-        class A {
-          set setter(_) => null; // testSetterNotSubtype:7
-        }
-        class Class extends A {
-          void set setter(_) {} // testSetterNotSubtype:8
-        }
-        """),
-
-    check("""
-        class A {
-          set setter(num _) => null; // testSetterNotSubtype:9
-        }
-        class Class extends A {
-          set setter(num _) => null; // testSetterNotSubtype:10
-        }
-        """),
-
-    check("""
-        class A {
-          set setter(num _) => null; // testSetterNotSubtype:11
-        }
-        class Class extends A {
-          set setter(int _) => null; // testSetterNotSubtype:12
-        }
-        """),
-
-    check("""
-        class A {
-          set setter(int _) => null; // testSetterNotSubtype:13
-        }
-        class Class extends A {
-          set setter(num _) => null; // testSetterNotSubtype:14
-        }
-        """),
-
-    check("""
-        class A {
-          set setter(int _) => null; // testSetterNotSubtype:15
-        }
-        class Class extends A {
-          set setter(double _) => null; // testSetterNotSubtype:16
-        }
-        """,
-        warnings: MessageKind.INVALID_OVERRIDE_SETTER,
-        infos: MessageKind.INVALID_OVERRIDDEN_SETTER),
-
-    check("""
-        class A {
-          set setter(int _) => null; // testSetterNotSubtype:17
-        }
-        class B extends A {
-          set setter(num _) => null; // testSetterNotSubtype:18
-        }
-        class Class extends B {
-          set setter(double _) => null; // testSetterNotSubtype:19
-        }
-        """),
-
-    check("""
-        class A {
-          set setter(int _) => null; // testSetterNotSubtype:20
-        }
-        class B {
-          set setter(num _) => null; // testSetterNotSubtype:21
-        }
-        class Class extends A implements B {
-          set setter(double _) => null; // testSetterNotSubtype:22
-        }
-        """,
-        warnings: MessageKind.INVALID_OVERRIDE_SETTER,
-        infos: MessageKind.INVALID_OVERRIDDEN_SETTER),
-
-    check("""
-        class A {
-          set setter(int _) => null; // testSetterNotSubtype:23
-        }
-        class B {
-          set setter(String _) => null; // testSetterNotSubtype:24
-        }
-        class Class extends A implements B {
-          set setter(double _) => null; // testSetterNotSubtype:25
-        }
-        """, warnings: [
-      MessageKind.INVALID_OVERRIDE_SETTER,
-      MessageKind.INVALID_OVERRIDE_SETTER
-    ], infos: [
-      MessageKind.INVALID_OVERRIDDEN_SETTER,
-      MessageKind.INVALID_OVERRIDDEN_SETTER
-    ]),
-
-    check("""
-        class A {
-          set setter(int _) => null; // testSetterNotSubtype:26
-        }
-        class B {
-          set setter(String _) => null; // testSetterNotSubtype:27
-        }
-        class Class implements A, B {
-          set setter(double _) => null; // testSetterNotSubtype:28
-        }
-        """, warnings: [
-      MessageKind.INVALID_OVERRIDE_SETTER,
-      MessageKind.INVALID_OVERRIDE_SETTER
-    ], infos: [
-      MessageKind.INVALID_OVERRIDDEN_SETTER,
-      MessageKind.INVALID_OVERRIDDEN_SETTER
-    ]),
-
-    // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
-    check("""
-        class A {
-          set setter(int _) => null; // testSetterNotSubtype:29
-        }
-        class B {
-          set setter(num _) => null; // testSetterNotSubtype:30
-        }
-        abstract class C implements A, B {
-        }
-        class Class implements C {
-          set setter(double _) => null; // testSetterNotSubtype:31
-        }
-        """,
-        warnings: MessageKind.INVALID_OVERRIDE_SETTER,
-        infos: MessageKind.INVALID_OVERRIDDEN_SETTER),
-
-    check("""
-        class A {
-          set setter(int _) => null; // testSetterNotSubtype:32
-        }
-        class B {
-          set setter(num _) => null; // testSetterNotSubtype:33
-        }
-        abstract class C implements A, B {
-        }
-        class Class implements C {
-          set setter(String _) => null; // testSetterNotSubtype:34
-        }
-        """, warnings: [
-      MessageKind.INVALID_OVERRIDE_SETTER,
-      MessageKind.INVALID_OVERRIDE_SETTER
-    ], infos: [
-      MessageKind.INVALID_OVERRIDDEN_SETTER,
-      MessageKind.INVALID_OVERRIDDEN_SETTER
-    ]),
-  ]);
-}
-
-Future testFieldNotSubtype() {
-  return Future.wait([
-    check("""
-          class A {
-            int field; // testFieldNotSubtype:1
-          }
-          class Class extends A {
-            int field; // testFieldNotSubtype:2
-          }
-          """),
-    check("""
-          class A {
-            num field; // testFieldNotSubtype:3
-          }
-          class Class extends A {
-            int field; // testFieldNotSubtype:4
-          }
-          """),
-    check("""
-          class A {
-            int field; // testFieldNotSubtype:5
-          }
-          class Class extends A {
-            num field; // testFieldNotSubtype:6
-          }
-          """),
-    check("""
-          class A {
-            int field; // testFieldNotSubtype:7
-          }
-          class Class extends A {
-            double field; // testFieldNotSubtype:8
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_FIELD,
-        infos: MessageKind.INVALID_OVERRIDDEN_FIELD),
-    check("""
-          class A {
-            int field; // testFieldNotSubtype:9
-          }
-          class B extends A {
-            num field; // testFieldNotSubtype:10
-          }
-          class Class extends B {
-            double field; // testFieldNotSubtype:11
-          }
-          """),
-    check("""
-          class A {
-            num field; // testFieldNotSubtype:12
-          }
-          class Class extends A {
-            int get field => null; // testFieldNotSubtype:13
-          }
-          """),
-    check("""
-          class A {
-            num field; // testFieldNotSubtype:14
-          }
-          class Class extends A {
-            String get field => null; // testFieldNotSubtype:15
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
-        infos: MessageKind.INVALID_OVERRIDDEN_FIELD),
-    check("""
-          class A {
-            num get field => null; // testFieldNotSubtype:16
-          }
-          class Class extends A {
-            String field; // testFieldNotSubtype:17
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
-        infos: MessageKind.INVALID_OVERRIDDEN_GETTER),
-    check("""
-          class A {
-            num field; // testFieldNotSubtype:18
-          }
-          class Class extends A {
-            set field(int _) {} // testFieldNotSubtype:19
-          }
-          """),
-    check("""
-          class A {
-            num field; // testFieldNotSubtype:19
-          }
-          class Class extends A {
-            void set field(int _) {} // testFieldNotSubtype:20
-          }
-          """),
-    check("""
-          class A {
-            set field(int _) {} // testFieldNotSubtype:21
-          }
-          class Class extends A {
-            num field; // testFieldNotSubtype:22
-          }
-          """),
-    check("""
-          class A {
-            void set field(int _) {} // testFieldNotSubtype:23
-          }
-          class Class extends A {
-            num field; // testFieldNotSubtype:24
-          }
-          """),
-    check("""
-          class A {
-            num field; // testFieldNotSubtype:25
-          }
-          class Class extends A {
-            set field(String _) {} // testFieldNotSubtype:26
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER,
-        infos: MessageKind.INVALID_OVERRIDDEN_FIELD),
-    check("""
-          class A {
-            set field(num _) {} // testFieldNotSubtype:27
-          }
-          class Class extends A {
-            String field; // testFieldNotSubtype:28
-          }
-          """,
-        warnings: MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD,
-        infos: MessageKind.INVALID_OVERRIDDEN_SETTER),
-    check("""
-          class A {
-            int field; // testFieldNotSubtype:29
-          }
-          class Class implements A {
-            String get field => null; // testFieldNotSubtype:30
-            void set field(String s) {} // testFieldNotSubtype:31
-          }
-          """, warnings: [
-      MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
-      MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER
-    ], infos: [
-      MessageKind.INVALID_OVERRIDDEN_FIELD,
-      MessageKind.INVALID_OVERRIDDEN_FIELD
-    ]),
-    check("""
-          class A {
-            String get field => null; // testFieldNotSubtype:32
-            void set field(String s) {} // testFieldNotSubtype:33
-          }
-          class Class implements A {
-            int field; // testFieldNotSubtype:34
-          }
-          """, warnings: [
-      MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
-      MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD
-    ], infos: [
-      MessageKind.INVALID_OVERRIDDEN_GETTER,
-      MessageKind.INVALID_OVERRIDDEN_SETTER
-    ]),
-  ]);
-}
-
-Future testMixedOverride() {
-  return Future.wait([
-    check("""
-          class A {
-            var member; // testMixedOverride:1
-          }
-          class Class extends A {
-            member() {} // testMixedOverride:2
-          }
-          """,
-        errors: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD,
-        infos: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT),
-    check("""
-          class A {
-            member() {} // testMixedOverride:3
-          }
-          class Class extends A {
-            var member; // testMixedOverride:4
-          }
-          """,
-        errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD,
-        infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT),
-    check("""
-          class A {
-            get member => null; // testMixedOverride:5
-          }
-          class Class extends A {
-            member() {} // testMixedOverride:6
-          }
-          """,
-        errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
-        infos: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT),
-    check("""
-          class A {
-            member() {} // testMixedOverride:7
-          }
-          class Class extends A {
-            get member => null; // testMixedOverride:8
-          }
-          """,
-        errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
-        infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT),
-    check("""
-          abstract class A {
-            var member; // testMixedOverride:9
-          }
-          abstract class B {
-            get member; // testMixedOverride:10
-          }
-          abstract class Class implements A, B {
-          }
-          """),
-    check(
-        """
-          abstract class A {
-            var member; // testMixedOverride:11
-          }
-          abstract class B {
-            member() {} // testMixedOverride:12
-          }
-          abstract class Class implements A, B {
-          }
-          """,
-        warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
-        infos: [
-          MessageKind.INHERITED_METHOD,
-          MessageKind.INHERITED_IMPLICIT_GETTER
-        ]),
-    check(
-        """
-          abstract class A {
-            get member; // testMixedOverride:13
-          }
-          abstract class B {
-            member() {} // testMixedOverride:14
-          }
-          abstract class Class implements A, B {
-          }
-          """,
-        warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
-        infos: [
-          MessageKind.INHERITED_METHOD,
-          MessageKind.INHERITED_EXPLICIT_GETTER
-        ]),
-    check(
-        """
-          abstract class A {
-            get member; // testMixedOverride:15
-          }
-          abstract class B {
-            member() {} // testMixedOverride:16
-          }
-          abstract class C {
-            var member; // testMixedOverride:17
-          }
-          abstract class D {
-            member() {} // testMixedOverride:18
-          }
-          abstract class E {
-            get member; // testMixedOverride:19
-          }
-          abstract class Class implements A, B, C, D, E {
-          }
-          """,
-        warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
-        infos: [
-          MessageKind.INHERITED_EXPLICIT_GETTER,
-          MessageKind.INHERITED_METHOD,
-          MessageKind.INHERITED_IMPLICIT_GETTER,
-          MessageKind.INHERITED_METHOD,
-          MessageKind.INHERITED_EXPLICIT_GETTER
-        ]),
-    check(
-        """
-          abstract class A {
-            get member; // testMixedOverride:20
-          }
-          abstract class B {
-            member() {} // testMixedOverride:21
-          }
-          abstract class C implements A, B {
-          }
-          class Class extends C {
-            member() {} // testMixedOverride:22
-          }
-          """,
-        errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
-        warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
-        infos: [
-          MessageKind.INHERITED_METHOD,
-          MessageKind.INHERITED_EXPLICIT_GETTER,
-          MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT
-        ]),
-    check(
-        """
-          abstract class A {
-            get member; // testMixedOverride:23
-          }
-          abstract class B {
-            member() {} // testMixedOverride:24
-          }
-          abstract class C implements A, B {
-          }
-          class Class extends C {
-            get member => null; // testMixedOverride:25
-          }
-          """,
-        errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
-        warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
-        infos: [
-          MessageKind.INHERITED_METHOD,
-          MessageKind.INHERITED_EXPLICIT_GETTER,
-          MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT
-        ]),
-  ]);
-}
-
-Future testAbstractMethods() {
-  return Future.wait([
-    check("""
-          abstract class Class {
-            method(); // testAbstractMethod:1
-          }
-          """),
-    check(
-        """
-          class Class {
-            method(); // testAbstractMethod:2
-          }
-          """,
-        warnings: MessageKind.ABSTRACT_METHOD,
-        infos: []),
-    check(
-        """
-          class Class {
-            get getter; // testAbstractMethod:3
-          }
-          """,
-        warnings: MessageKind.ABSTRACT_GETTER,
-        infos: []),
-    check(
-        """
-          class Class {
-            set setter(_); // testAbstractMethod:4
-          }
-          """,
-        warnings: MessageKind.ABSTRACT_SETTER,
-        infos: []),
-    check("""
-          abstract class A {
-            method(); // testAbstractMethod:5
-          }
-          class Class extends A {
-            method() {} // testAbstractMethod:6
-          }
-          """),
-    check("""
-          abstract class A {
-            method(); // testAbstractMethod:7
-          }
-          class Class extends A {
-            method([a]) {} // testAbstractMethod:8
-          }
-          """),
-    check("""
-          abstract class A {
-            method(); // testAbstractMethod:9
-          }
-          class Class extends A {
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
-        infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
-    check("""
-          abstract class A {
-            get getter; // testAbstractMethod:10
-          }
-          class Class extends A {
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
-        infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER),
-    check("""
-          abstract class A {
-            set setter(_); // testAbstractMethod:11
-          }
-          class Class extends A {
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
-        infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER),
-    check(
-        """
-          abstract class A {
-            method(); // testAbstractMethod:12
-          }
-          class B {
-            method() {} // testAbstractMethod:13
-          }
-          class Class extends A implements B {
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_METHOD,
-        infos: [
-          MessageKind.UNIMPLEMENTED_METHOD_CONT,
-          MessageKind.UNIMPLEMENTED_METHOD_CONT
-        ]),
-    check(
-        """
-          class Class implements Function {
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
-        infos: []),
-    check(
-        """
-          abstract class A {
-            get getter; // testAbstractMethod:14
-          }
-          class B {
-            get getter => 0; // testAbstractMethod:15
-          }
-          class Class extends A implements B {
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_GETTER,
-        infos: [
-          MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
-          MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER
-        ]),
-    check(
-        """
-          abstract class A {
-            set setter(_); // testAbstractMethod:16
-          }
-          class B {
-            set setter(_) {} // testAbstractMethod:17
-          }
-          class Class extends A implements B {
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_SETTER,
-        infos: [
-          MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
-          MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER
-        ]),
-    check(
-        """
-          abstract class A {
-            get field; // testAbstractMethod:18
-          }
-          class B {
-            var field; // testAbstractMethod:19
-          }
-          class Class extends A implements B {
-            set field(_) {} // testAbstractMethod:20
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_GETTER,
-        infos: [
-          MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
-          MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER
-        ]),
-    check(
-        """
-          abstract class A {
-            set field(_); // testAbstractMethod:21
-          }
-          class B {
-            var field; // testAbstractMethod:22
-          }
-          class Class extends A implements B {
-            get field => 0; // testAbstractMethod:23
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_SETTER,
-        infos: [
-          MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
-          MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER
-        ]),
-    check("""
-          class A {
-            method() {} // testAbstractMethod:24
-          }
-          class Class implements A {
-            method() {} // testAbstractMethod:25
-          }
-          """),
-    check("""
-          class A {
-            method() {} // testAbstractMethod:26
-          }
-          class Class implements A {
-            method([a]) {} // testAbstractMethod:27
-          }
-          """),
-    check("""
-          class A {
-            method() {} // testAbstractMethod:28
-          }
-          class Class implements A {
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
-        infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
-    check("""
-          class A {
-            method() {} // testAbstractMethod:29
-          }
-          class B {
-            method() {} // testAbstractMethod:30
-          }
-          class Class extends A implements B {
-          }
-          """),
-    check("""
-          class A {
-            var member; // testAbstractMethod:31
-          }
-          class Class implements A {
-          }
-          """, warnings: [
-      MessageKind.UNIMPLEMENTED_GETTER_ONE,
-      MessageKind.UNIMPLEMENTED_SETTER_ONE
-    ], infos: [
-      MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
-      MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER
-    ]),
-    check("""
-          class A {
-            var member; // testAbstractMethod:32
-          }
-          class B {
-            get member => null; // testAbstractMethod:33
-            set member(_) {} // testAbstractMethod:34
-          }
-          class Class implements A, B {
-          }
-          """, warnings: [
-      MessageKind.UNIMPLEMENTED_GETTER,
-      MessageKind.UNIMPLEMENTED_SETTER
-    ], infos: [
-      MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
-      MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
-      MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
-      MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER
-    ]),
-    check("""
-          class A {
-            var member; // testAbstractMethod:35
-          }
-          class B {
-            var member; // testAbstractMethod:36
-          }
-          class Class implements A, B {
-          }
-          """, warnings: [
-      MessageKind.UNIMPLEMENTED_GETTER,
-      MessageKind.UNIMPLEMENTED_SETTER
-    ], infos: [
-      MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
-      MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
-      MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER,
-      MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER
-    ]),
-    check("""
-          class A {
-            get member => 0; // testAbstractMethod:37
-          }
-          class Class implements A {
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
-        infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER),
-    check("""
-          class A {
-            set member(_) {} // testAbstractMethod:38
-          }
-          class Class implements A {
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
-        infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER),
-    check("""
-          class A {
-            var member; // testAbstractMethod:39
-          }
-          class Class implements A {
-            get member => 0;
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
-        infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER),
-    check("""
-          class A {
-            var field; // testAbstractMethod:40
-          }
-          class Class implements A {
-            final field = 0; // testAbstractMethod:41
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
-        infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER),
-    check("""
-          class A {
-            var member; // testAbstractMethod:42
-          }
-          class Class implements A {
-            set member(_) {}
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
-        infos: MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER),
-    check("""
-          abstract class A {
-            method() {} // testAbstractMethod:43
-          }
-          class Class extends A {
-            method();
-          }
-          """),
-  ]);
-}
-
-Future testNoSuchMethod() {
-  return Future.wait([
-    check(
-        """
-          class Class {
-            method(); // testNoSuchMethod:1
-          }
-          """,
-        warnings: MessageKind.ABSTRACT_METHOD,
-        infos: []),
-    check(
-        """
-          @proxy
-          class Class {
-            method(); // testNoSuchMethod:2
-          }
-          """,
-        warnings: MessageKind.ABSTRACT_METHOD,
-        infos: []),
-    check("""
-          class Class {
-            noSuchMethod(_) => null;
-            method(); // testNoSuchMethod:3
-          }
-          """),
-    check("""
-          class Class {
-            noSuchMethod(_, [__]) => null;
-            method(); // testNoSuchMethod:4
-          }
-          """),
-    check("""
-          class Class {
-            noSuchMethod(_);
-            method(); // testNoSuchMethod:5
-          }
-          """),
-    check("""
-          abstract class A {
-            method(); // testNoSuchMethod:6
-          }
-          class Class extends A {
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
-        infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
-    check("""
-          abstract class A {
-            method(); // testNoSuchMethod:7
-          }
-          @proxy
-          class Class extends A {
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
-        infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
-    check("""
-          abstract class A {
-            method(); // testNoSuchMethod:8
-          }
-          class Class extends A {
-            noSuchMethod(_) => null;
-          }
-          """),
-    check("""
-          class A {
-            method() {} // testNoSuchMethod:9
-          }
-          class Class implements A {
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
-        infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
-    check("""
-          class A {
-            method() {} // testNoSuchMethod:10
-          }
-          class Class implements A {
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
-        infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
-    check("""
-          class A {
-            method() {} // testNoSuchMethod:11
-          }
-          @proxy
-          class Class implements A {
-          }
-          """,
-        warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
-        infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
-    check("""
-          class A {
-            method() {} // testNoSuchMethod:12
-          }
-          class Class implements A {
-            noSuchMethod(_) => null;
-          }
-          """),
-    check("""
-          class A {
-            noSuchMethod(_) => null;
-            method(); // testNoSuchMethod:13
-          }
-          class Class extends A {
-          }
-          """),
-  ]);
-}
diff --git a/tests/compiler/dart2js/old_frontend/package_root_test.dart b/tests/compiler/dart2js/old_frontend/package_root_test.dart
deleted file mode 100644
index 793d17f..0000000
--- a/tests/compiler/dart2js/old_frontend/package_root_test.dart
+++ /dev/null
@@ -1,79 +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.
-
-// Test that the compiler can handle imports when package root has not been set.
-
-library dart2js.test.package_root;
-
-import 'dart:async';
-
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/compiler.dart' show PackagesDiscoveryProvider;
-import 'package:compiler/src/diagnostics/messages.dart' show MessageKind;
-import 'package:package_config/packages.dart';
-
-import '../memory_compiler.dart';
-import '../memory_source_file_helper.dart';
-
-const MEMORY_SOURCE_FILES = const {
-  'main.dart': '''
-
-import 'package:foo/foo.dart';
-
-main() {}
-''',
-  'package.config': '''
-''',
-};
-
-final Uri PACKAGE_CONFIG_URI = Uri.parse('memory:package.config');
-
-Future runTest(Uri main, MessageKind expectedMessageKind,
-    {Uri packageRoot,
-    Uri packageConfig,
-    PackagesDiscoveryProvider packagesDiscoveryProvider}) async {
-  DiagnosticCollector collector = new DiagnosticCollector();
-  await runCompiler(
-      entryPoint: main,
-      memorySourceFiles: MEMORY_SOURCE_FILES,
-      diagnosticHandler: collector,
-      packageRoot: packageRoot,
-      packageConfig: packageConfig,
-      packagesDiscoveryProvider: packagesDiscoveryProvider,
-      options: [Flags.useOldFrontend]);
-  Expect.equals(
-      1, collector.errors.length, "Unexpected errors: ${collector.errors}");
-  Expect.equals(expectedMessageKind, collector.errors.first.message.kind,
-      "Unexpected error: ${collector.errors.first}");
-}
-
-void main() {
-  asyncTest(() async {
-    Uri script = currentDirectory.resolveUri(Platform.script);
-    Uri packageRoot = script.resolve('./packages/');
-
-    PackagesDiscoveryProvider noPackagesDiscovery = (Uri uri) {
-      return new Future.value(Packages.noPackages);
-    };
-
-    await runTest(Uri.parse('memory:main.dart'), MessageKind.READ_URI_ERROR,
-        packageRoot: packageRoot);
-    await runTest(Uri.parse('memory:main.dart'), MessageKind.LIBRARY_NOT_FOUND,
-        packageConfig: PACKAGE_CONFIG_URI);
-    await runTest(Uri.parse('memory:main.dart'), MessageKind.LIBRARY_NOT_FOUND,
-        packagesDiscoveryProvider: noPackagesDiscovery);
-
-    await runTest(
-        Uri.parse('package:foo/foo.dart'), MessageKind.READ_SELF_ERROR,
-        packageRoot: packageRoot);
-    await runTest(
-        Uri.parse('package:foo/foo.dart'), MessageKind.LIBRARY_NOT_FOUND,
-        packageConfig: PACKAGE_CONFIG_URI);
-    await runTest(
-        Uri.parse('package:foo/foo.dart'), MessageKind.LIBRARY_NOT_FOUND,
-        packagesDiscoveryProvider: noPackagesDiscovery);
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/parser_helper.dart b/tests/compiler/dart2js/old_frontend/parser_helper.dart
deleted file mode 100644
index 55a4f34..0000000
--- a/tests/compiler/dart2js/old_frontend/parser_helper.dart
+++ /dev/null
@@ -1,165 +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.
-
-library parser_helper;
-
-import 'package:expect/expect.dart';
-
-import 'package:compiler/src/elements/elements.dart';
-import 'package:compiler/src/elements/entities.dart';
-import 'package:compiler/src/id_generator.dart';
-import 'package:compiler/src/tree/tree.dart';
-import 'package:compiler/src/parser/element_listener.dart';
-import 'package:compiler/src/parser/node_listener.dart';
-import 'package:compiler/src/parser/diet_parser_task.dart';
-import 'package:front_end/src/fasta/parser.dart' hide parse;
-import 'package:front_end/src/fasta/scanner.dart' hide scan;
-import 'package:compiler/src/io/source_file.dart';
-import 'package:compiler/src/util/util.dart';
-
-import 'package:compiler/src/elements/modelx.dart'
-    show CompilationUnitElementX, ElementX, LibraryElementX;
-
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/options.dart';
-import 'package:compiler/src/diagnostics/source_span.dart';
-import 'package:compiler/src/diagnostics/spannable.dart';
-import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
-import 'package:compiler/src/diagnostics/messages.dart';
-import 'package:compiler/src/script.dart';
-
-import 'options_helper.dart';
-
-export 'package:front_end/src/fasta/parser.dart' hide parse;
-export 'package:front_end/src/fasta/scanner.dart' hide scan;
-export 'package:compiler/src/diagnostics/diagnostic_listener.dart';
-export 'package:compiler/src/parser/node_listener.dart';
-export 'package:compiler/src/parser/diet_parser_task.dart';
-export 'package:front_end/src/fasta/scanner/token_constants.dart';
-
-import 'mock_compiler.dart';
-
-class LoggerCanceler extends DiagnosticReporter {
-  DiagnosticOptions get options => const MockDiagnosticOptions();
-
-  void log(message) {
-    print(message);
-  }
-
-  void internalError(Spannable node, message) {
-    log(message);
-  }
-
-  SourceSpan spanFromSpannable(node) {
-    throw 'unsupported operation';
-  }
-
-  SourceSpan spanFromToken(token) => null;
-
-  void reportError(DiagnosticMessage message,
-      [List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]) {
-    log(message);
-    infos.forEach(log);
-  }
-
-  void reportWarning(DiagnosticMessage message,
-      [List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]) {
-    log(message);
-    infos.forEach(log);
-  }
-
-  void reportInfo(Spannable node, MessageKind errorCode,
-      [Map arguments = const {}]) {
-    log(new Message(MessageTemplate.TEMPLATES[errorCode], arguments, false));
-  }
-
-  void reportHint(DiagnosticMessage message,
-      [List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]) {
-    log(message);
-    infos.forEach(log);
-  }
-
-  withCurrentElement(Entity element, f()) => f();
-
-  @override
-  DiagnosticMessage createMessage(Spannable spannable, MessageKind messageKind,
-      [Map arguments = const {}]) {
-    return new DiagnosticMessage(null, spannable,
-        new Message(MessageTemplate.TEMPLATES[messageKind], arguments, false));
-  }
-
-  @override
-  bool get hasReportedError => false;
-}
-
-Token scan(String text) => new StringScanner(text).tokenize();
-
-Node parseBodyCode(String text, Function parseMethod,
-    {DiagnosticReporter reporter}) {
-  Token tokens = scan(text);
-  if (reporter == null) reporter = new LoggerCanceler();
-  Uri uri = new Uri(scheme: "source");
-  Script script = new Script(uri, uri, new MockFile(text));
-  LibraryElement library = new LibraryElementX(script);
-  NodeListener listener = new NodeListener(
-      new ScannerOptions(canUseNative: true),
-      reporter,
-      library.entryCompilationUnit);
-  Parser parser = new Parser(listener);
-  Token endToken = parseMethod(parser, tokens).next;
-  assert(endToken.kind == EOF_TOKEN);
-  Node node = listener.popNode();
-  Expect.isNotNull(node);
-  Expect.isTrue(listener.nodes.isEmpty, 'Not empty: ${listener.nodes}');
-  return node;
-}
-
-Node parseStatement(String text) => parseBodyCode(
-    text,
-    (parser, tokens) =>
-        parser.parseStatement(parser.syntheticPreviousToken(tokens)));
-
-Node parseFunction(String text, MockCompiler compiler) {
-  ElementX element = parseUnit(text, compiler, compiler.mainApp).head;
-  Expect.isNotNull(element);
-  Expect.equals(ElementKind.FUNCTION, element.kind);
-  return element.parseNode(compiler.parsingContext);
-}
-
-Node parseMember(String text, {DiagnosticReporter reporter}) {
-  return parseBodyCode(
-      text, (parser, tokens) => parser.parseClassMember(tokens),
-      reporter: reporter);
-}
-
-class MockFile extends StringSourceFile {
-  MockFile(text) : super.fromName('<string>', text);
-}
-
-var sourceCounter = 0;
-
-Link<Element> parseUnit(String text, Compiler compiler, LibraryElement library,
-    [void registerSource(Uri uri, String source)]) {
-  Token tokens = scan(text);
-  Uri uri = new Uri(scheme: "source", path: '${++sourceCounter}');
-  if (registerSource != null) {
-    registerSource(uri, text);
-  }
-  var script = new Script(uri, uri, new MockFile(text));
-  var unit = new CompilationUnitElementX(script, library);
-  DiagnosticReporter reporter = compiler.reporter;
-  ElementListener listener = new ElementListener(
-      compiler.parsingContext.getScannerOptionsFor(library),
-      reporter,
-      unit,
-      new IdGenerator());
-  PartialParser parser = new PartialParser(listener);
-  reporter.withCurrentElement(unit, () => parser.parseUnit(tokens));
-  return unit.localMembers;
-}
-
-NodeList fullParseUnit(String source, {DiagnosticReporter reporter}) {
-  return parseBodyCode(source, (parser, tokens) => parser.parseUnit(tokens),
-      reporter: reporter);
-}
diff --git a/tests/compiler/dart2js/old_frontend/parser_test.dart b/tests/compiler/dart2js/old_frontend/parser_test.dart
deleted file mode 100644
index c4f9881..0000000
--- a/tests/compiler/dart2js/old_frontend/parser_test.dart
+++ /dev/null
@@ -1,381 +0,0 @@
-// 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 "package:expect/expect.dart";
-import 'parser_helper.dart';
-import 'package:compiler/src/tree/tree.dart';
-
-void testStatement(String statement) {
-  Node node = parseStatement(statement);
-  Expect.isNotNull(node.toString());
-}
-
-void testGenericTypes() {
-  testStatement('List<T> t;');
-  testStatement('List<List<T>> t;');
-  testStatement('List<List<List<T>>> t;');
-  testStatement('List<List<List<List<T>>>> t;');
-  testStatement('List<List<List<List<List<T>>>>> t;');
-
-  testStatement('List<List<T> > t;');
-  testStatement('List<List<List<T> >> t;');
-  testStatement('List<List<List<List<T> >>> t;');
-  testStatement('List<List<List<List<List<T> >>>> t;');
-
-  testStatement('List<List<List<T> > > t;');
-  testStatement('List<List<List<List<T> > >> t;');
-  testStatement('List<List<List<List<List<T> > >>> t;');
-
-  testStatement('List<List<List<List<T> > > > t;');
-  testStatement('List<List<List<List<List<T> > > >> t;');
-
-  testStatement('List<List<List<List<List<T> > > > > t;');
-
-  testStatement('List<List<List<List<List<T> >> >> t;');
-
-  testStatement('List<List<List<List<List<T> >>> > t;');
-
-  testStatement('List<List<List<List<List<T >>> >> t;');
-
-  testStatement('List<T> t;');
-  testStatement('List<List<T>> t;');
-  testStatement('List<List<List<T>>> t;');
-  testStatement('List<List<List<List<T>>>> t;');
-  testStatement('List<List<List<List<List<T>>>>> t;');
-}
-
-void testPrefixedGenericTypes() {
-  testStatement('lib.List<List<T> > t;');
-  testStatement('lib.List<List<List<T> >> t;');
-  testStatement('lib.List<List<List<List<T> >>> t;');
-  testStatement('lib.List<List<List<List<List<T> >>>> t;');
-
-  testStatement('lib.List<List<List<T> > > t;');
-  testStatement('lib.List<List<List<List<T> > >> t;');
-  testStatement('lib.List<List<List<List<List<T> > >>> t;');
-
-  testStatement('lib.List<List<List<List<T> > > > t;');
-  testStatement('lib.List<List<List<List<List<T> > > >> t;');
-
-  testStatement('lib.List<List<List<List<List<T> > > > > t;');
-
-  testStatement('lib.List<List<List<List<List<T> >> >> t;');
-
-  testStatement('lib.List<List<List<List<List<T> >>> > t;');
-
-  testStatement('lib.List<List<List<List<List<T >>> >> t;');
-}
-
-void testUnaryExpression() {
-  testStatement('x++;');
-  // TODO(ahe): reenable following test.
-  // testStatement('++x++;');
-  testStatement('++x;');
-  testStatement('print(x++);');
-  // TODO(ahe): reenable following test.
-  // testStatement('print(++x++);'); // Accepted by parser, rejected later.
-  testStatement('print(++x);');
-}
-
-void testChainedMethodCalls() {
-  testStatement('MyClass.foo().bar().baz();');
-  // TODO(ahe): reenable following test.
-  // testStatement('MyClass.foo().-x;'); // Accepted by parser, rejected later.
-  testStatement('a.b.c.d();');
-}
-
-void testFunctionStatement() {
-  testStatement('int f() {}');
-  testStatement('void f() {}');
-}
-
-void testDoStatement() {
-  testStatement('do fisk(); while (hest());');
-  testStatement('do { fisk(); } while (hest());');
-}
-
-void testWhileStatement() {
-  testStatement('while (fisk()) hest();');
-  testStatement('while (fisk()) { hest(); }');
-}
-
-void testConditionalExpression() {
-  ExpressionStatement node = parseStatement("a ? b : c;");
-  Conditional conditional = node.expression;
-
-  node = parseStatement("a ? b ? c : d : e;");
-  // Should parse as: a ? ( b ? c : d ) : e.
-  conditional = node.expression;
-  Expect.isNotNull(conditional.thenExpression.asConditional());
-  Expect.isNotNull(conditional.elseExpression.asSend());
-
-  node = parseStatement("a ? b : c ? d : e;");
-  // Should parse as: a ? b : (c ? d : e).
-  conditional = node.expression;
-  Expect.isNotNull(conditional.thenExpression.asSend());
-  Expect.isNotNull(conditional.elseExpression.asConditional());
-
-  node = parseStatement("a ? b ? c : d : e ? f : g;");
-  // Should parse as: a ? (b ? c : d) : (e ? f : g).
-  conditional = node.expression;
-  Expect.isNotNull(conditional.thenExpression.asConditional());
-  Expect.isNotNull(conditional.elseExpression.asConditional());
-
-  node = parseStatement("a = b ? c : d;");
-  // Should parse as: a = (b ? c : d).
-  SendSet sendSet = node.expression;
-  Expect.isNotNull(sendSet.arguments.head.asConditional());
-
-  node = parseStatement("a ? b : c = d;");
-  // Should parse as: a ? b : (c = d).
-  conditional = node.expression;
-  Expect.isNull(conditional.thenExpression.asSendSet());
-  Expect.isNotNull(conditional.elseExpression.asSendSet());
-
-  node = parseStatement("a ? b = c : d;");
-  // Should parse as: a ? (b = c) : d.
-  conditional = node.expression;
-  Expect.isNotNull(conditional.thenExpression.asSendSet());
-  Expect.isNull(conditional.elseExpression.asSendSet());
-
-  node = parseStatement("a ? b = c : d = e;");
-  // Should parse as: a ? (b = c) : (d = e).
-  conditional = node.expression;
-  Expect.isNotNull(conditional.thenExpression.asSendSet());
-  Expect.isNotNull(conditional.elseExpression.asSendSet());
-
-  node = parseStatement("a ?? b ? c : d;");
-  // Should parse as: (a ?? b) ? c : d;
-  conditional = node.expression;
-  Expect.isNotNull(conditional.condition.asSend());
-  Expect.isTrue(conditional.condition.asSend().isIfNull);
-  Expect.isNotNull(conditional.thenExpression.asSend());
-  Expect.isNotNull(conditional.elseExpression.asSend());
-}
-
-void testNullOperators() {
-  ExpressionStatement statement = parseStatement("a ?? b;");
-  Expression node = statement.expression;
-  Expect.isNotNull(node.asSend());
-  Expect.isTrue(node.asSend().isIfNull);
-
-  statement = parseStatement("a ??= b;");
-  node = statement.expression;
-  Expect.isNotNull(node.asSendSet());
-  Expect.isTrue(node.asSendSet().isIfNullAssignment);
-
-  statement = parseStatement("a?.b;");
-  node = statement.expression;
-  Expect.isNotNull(node.asSend());
-  Expect.isTrue(node.asSend().isConditional);
-
-  statement = parseStatement("a?.m();");
-  node = statement.expression;
-  Expect.isNotNull(node.asSend());
-  Expect.isTrue(node.asSend().isConditional);
-}
-
-void testAssignment() {
-  ExpressionStatement node;
-  Expression expression;
-  SendSet sendSet;
-
-  node = parseStatement("a = b;");
-  expression = node.expression;
-  Expect.isNotNull(expression.asSendSet());
-
-  node = parseStatement("a = b = c;");
-  // Should parse as: a = (b = c).
-  expression = node.expression;
-  Expect.isNotNull(sendSet = expression.asSendSet());
-  Expect.isNotNull(sendSet.arguments.head.asSendSet());
-
-  node = parseStatement("a = b = c = d;");
-  // Should parse as: a = (b = (c = d)).
-  expression = node.expression;
-  Expect.isNotNull(sendSet = expression.asSendSet());
-  Expect.isNotNull(sendSet = sendSet.arguments.head.asSendSet());
-  Expect.isNotNull(sendSet = sendSet.arguments.head.asSendSet());
-
-  node = parseStatement("a.b = c;");
-  // Should parse as: receiver = a, selector = b, arguments = c.
-  expression = node.expression;
-  Expect.isNotNull(sendSet = expression.asSendSet());
-  Expect.stringEquals("a", sendSet.receiver.toString());
-  Expect.stringEquals("b", sendSet.selector.toString());
-  Expect.stringEquals("c", sendSet.arguments.head.toString());
-
-  node = parseStatement("a.b = c.d;");
-  // Should parse as: a.b = (c.d).
-  expression = node.expression;
-  Expect.isNotNull(sendSet = expression.asSendSet());
-  Expect.stringEquals("a", sendSet.receiver.toString());
-  Expect.stringEquals("b", sendSet.selector.toString());
-  Expect.stringEquals("c.d", sendSet.arguments.head.toString());
-
-  node = parseStatement("a.b = c.d = e.f;");
-  // Should parse as: a.b = (c.d = (e.f)).
-  expression = node.expression;
-  Expect.isNotNull(sendSet = expression.asSendSet());
-  Expect.stringEquals("a", sendSet.receiver.toString());
-  Expect.stringEquals("b", sendSet.selector.toString());
-  Expect.isNotNull(sendSet = sendSet.arguments.head.asSendSet());
-  Expect.stringEquals("c", sendSet.receiver.toString());
-  Expect.stringEquals("d", sendSet.selector.toString());
-  Expect.stringEquals("e.f", sendSet.arguments.head.toString());
-}
-
-void testIndex() {
-  ExpressionStatement node;
-  Expression expression;
-  Send send;
-  SendSet sendSet;
-
-  node = parseStatement("a[b];");
-  // Should parse as: (a)[b].
-  expression = node.expression;
-  Expect.isNotNull(send = expression.asSend());
-  Expect.stringEquals("a", send.receiver.toString());
-  Expect.stringEquals("[]", send.selector.toString());
-  Expect.stringEquals("b", send.arguments.head.toString());
-
-  node = parseStatement("a[b] = c;");
-  // Should parse as: (a)[b] = c.
-  expression = node.expression;
-  Expect.isNotNull(sendSet = expression.asSendSet());
-  Expect.stringEquals("a", sendSet.receiver.toString());
-  Expect.stringEquals("[]", sendSet.selector.toString());
-  Expect.stringEquals("=", sendSet.assignmentOperator.toString());
-  Expect.stringEquals("b", sendSet.arguments.head.toString());
-  Expect.stringEquals("c", sendSet.arguments.tail.head.toString());
-
-  node = parseStatement("a.b[c];");
-  // Should parse as: (a.b)[c].
-  expression = node.expression;
-  Expect.isNotNull(send = expression.asSend());
-  Expect.stringEquals("a.b", send.receiver.toString());
-  Expect.stringEquals("[]", send.selector.toString());
-  Expect.stringEquals("c", send.arguments.head.toString());
-
-  node = parseStatement("a.b[c] = d;");
-  // Should parse as: (a.b)[] = (c, d).
-  expression = node.expression;
-  Expect.isNotNull(sendSet = expression.asSendSet());
-  Expect.isNotNull(send = sendSet.receiver.asSend());
-  Expect.stringEquals("a.b", send.toString());
-  Expect.stringEquals("[]", sendSet.selector.toString());
-  Expect.stringEquals("=", sendSet.assignmentOperator.toString());
-  Expect.stringEquals("c", sendSet.arguments.head.toString());
-  Expect.stringEquals("d", sendSet.arguments.tail.head.toString());
-}
-
-void testPostfix() {
-  ExpressionStatement node;
-  Expression expression;
-  SendSet sendSet;
-
-  node = parseStatement("a.b++;");
-  // Should parse as: (a.b)++.
-  expression = node.expression;
-  Expect.isNotNull(sendSet = expression.asSendSet());
-  Expect.stringEquals("a", sendSet.receiver.toString());
-  Expect.stringEquals("b", sendSet.selector.toString());
-  Expect.stringEquals("++", sendSet.assignmentOperator.toString());
-  Expect.isTrue(sendSet.arguments.isEmpty);
-}
-
-void testOperatorParse() {
-  FunctionExpression function = parseMember('operator -() => null;');
-  Send name = function.name.asSend();
-  Expect.isNotNull(name);
-  Expect.stringEquals('operator', name.receiver.toString());
-  Expect.stringEquals('-', name.selector.toString());
-  Expect.isTrue(function.parameters.isEmpty);
-  Expect.isNull(function.returnType);
-  Expect.isNull(function.getOrSet);
-}
-
-class Collector extends DiagnosticReporter {
-  int token = -1;
-
-  void reportFatalError(Token token) {
-    this.token = token.kind;
-    throw this;
-  }
-
-  void reportError(DiagnosticMessage message,
-      [List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]) {
-    assert(token != -1);
-    throw this;
-  }
-
-  spanFromToken(Token token) {
-    this.token = token.kind;
-  }
-
-  void log(message) {
-    print(message);
-  }
-
-  noSuchMethod(Invocation invocation) {
-    throw 'unsupported operation';
-  }
-
-  @override
-  DiagnosticMessage createMessage(spannable, messageKind,
-      [arguments = const {}]) {
-    return new DiagnosticMessage(null, spannable, null);
-  }
-}
-
-void testMissingCloseParen() {
-  final String source = '''foo(x {  // <= missing closing ")"
-  return x;
-}''';
-  parse() {
-    parseMember(source, reporter: new Collector());
-  }
-
-  check(exn) {
-    Collector c = exn;
-    Expect.equals(OPEN_CURLY_BRACKET_TOKEN, c.token);
-    return true;
-  }
-
-  Expect.throws(parse, check);
-}
-
-void testMissingCloseBraceInClass() {
-  final String source = 'class Foo {'; // Missing close '}'.
-  parse() {
-    fullParseUnit(source, reporter: new Collector());
-  }
-
-  check(exn) {
-    Collector c = exn;
-    Expect.equals(BAD_INPUT_TOKEN, c.token);
-    return true;
-  }
-
-  Expect.throws(parse, check);
-}
-
-void main() {
-  testGenericTypes();
-  // TODO(ahe): Enable this test when we handle library prefixes.
-  // testPrefixedGenericTypes();
-  testUnaryExpression();
-  testChainedMethodCalls();
-  testFunctionStatement();
-  testDoStatement();
-  testWhileStatement();
-  testConditionalExpression();
-  testNullOperators();
-  testAssignment();
-  testIndex();
-  testPostfix();
-  testOperatorParse();
-  testMissingCloseParen();
-  testMissingCloseBraceInClass();
-}
diff --git a/tests/compiler/dart2js/old_frontend/part_of_test.dart b/tests/compiler/dart2js/old_frontend/part_of_test.dart
deleted file mode 100644
index 9c7bfee..0000000
--- a/tests/compiler/dart2js/old_frontend/part_of_test.dart
+++ /dev/null
@@ -1,43 +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.
-
-library part_of_test;
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import 'package:compiler/src/diagnostics/messages.dart' show MessageKind;
-import 'mock_compiler.dart';
-
-final libraryUri = Uri.parse('test:library.dart');
-const String LIBRARY_SOURCE = '''
-library foo;
-part 'part.dart';
-''';
-
-final partUri = Uri.parse('test:part.dart');
-const String PART_SOURCE = '''
-part of bar;
-''';
-
-void main() {
-  MockCompiler compiler = new MockCompiler.internal();
-  compiler.registerSource(libraryUri, LIBRARY_SOURCE);
-  compiler.registerSource(partUri, PART_SOURCE);
-
-  asyncTest(
-      () => compiler.libraryLoader.loadLibrary(libraryUri).then((libraries) {
-            compiler.processLoadedLibraries(libraries);
-            DiagnosticCollector collector = compiler.diagnosticCollector;
-            print('errors: ${collector.errors}');
-            print('warnings: ${collector.warnings}');
-            Expect.isTrue(collector.errors.isEmpty);
-            Expect.equals(1, collector.warnings.length);
-            Expect.equals(MessageKind.LIBRARY_NAME_MISMATCH,
-                collector.warnings.first.messageKind);
-            Expect.equals(
-                'foo',
-                collector.warnings.first.message.arguments['libraryName']
-                    .toString());
-          }));
-}
diff --git a/tests/compiler/dart2js/old_frontend/partial_parser_test.dart b/tests/compiler/dart2js/old_frontend/partial_parser_test.dart
deleted file mode 100644
index ec8f619..0000000
--- a/tests/compiler/dart2js/old_frontend/partial_parser_test.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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 "package:expect/expect.dart";
-import 'parser_helper.dart';
-
-void main() {
-  testSkipExpression();
-}
-
-void testSkipExpression() {
-  PartialParser parser = new PartialParser(new Listener());
-  Token token = scan('a < b;');
-  token = parser.skipExpression(parser.syntheticPreviousToken(token)).next;
-  Expect.equals(';', token.lexeme);
-
-  token = scan('[a < b]');
-  token = parser.skipExpression(token).next;
-  Expect.equals(']', token.lexeme);
-
-  token = scan('a < b,');
-  token = parser.skipExpression(parser.syntheticPreviousToken(token)).next;
-  Expect.equals(',', token.lexeme);
-}
diff --git a/tests/compiler/dart2js/old_frontend/patch_test.dart b/tests/compiler/dart2js/old_frontend/patch_test.dart
deleted file mode 100644
index 2c8dbfd..0000000
--- a/tests/compiler/dart2js/old_frontend/patch_test.dart
+++ /dev/null
@@ -1,1068 +0,0 @@
-// 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.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/diagnostics/messages.dart' show MessageKind;
-import 'package:compiler/src/elements/elements.dart';
-import 'package:compiler/src/elements/modelx.dart';
-import 'package:compiler/src/elements/names.dart';
-import 'package:compiler/src/tree/tree.dart';
-import 'package:compiler/src/types/types.dart';
-import 'package:compiler/src/universe/call_structure.dart' show CallStructure;
-import 'package:compiler/src/universe/selector.dart' show Selector;
-import 'package:compiler/src/world.dart';
-
-import 'mock_compiler.dart';
-import 'mock_libraries.dart';
-
-Future<Compiler> applyPatch(String script, String patch,
-    {bool analyzeAll: false,
-    bool analyzeOnly: false,
-    bool runCompiler: false,
-    String main: ""}) async {
-  Map<String, String> core = <String, String>{'script': script};
-  MockCompiler compiler = new MockCompiler.internal(
-      coreSource: core, analyzeAll: analyzeAll, analyzeOnly: analyzeOnly);
-  compiler.diagnosticHandler = createHandler(compiler, '');
-  var uri = Uri.parse("patch:core");
-  compiler.registerSource(uri, "$DEFAULT_PATCH_CORE_SOURCE\n$patch");
-  if (runCompiler) {
-    await compiler.run(null, main);
-  } else {
-    await compiler.init(main);
-  }
-  return compiler;
-}
-
-void expectHasBody(compiler, ElementX element) {
-  dynamic node = element.parseNode(compiler.parsingContext);
-  Expect.isNotNull(node, "Element isn't parseable, when a body was expected");
-  Expect.isNotNull(node.body);
-  // If the element has a body it is either a Block or a Return statement,
-  // both with different begin and end tokens.
-  Expect.isTrue(node.body is Block || node.body is Return);
-  Expect.notEquals(node.body.getBeginToken(), node.body.getEndToken());
-}
-
-void expectHasNoBody(compiler, ElementX element) {
-  dynamic node = element.parseNode(compiler.parsingContext);
-  Expect.isNotNull(node, "Element isn't parseable, when a body was expected");
-  Expect.isFalse(node.hasBody);
-}
-
-Element ensure(compiler, String name, Element lookup(String name),
-    {bool expectIsPatched: false,
-    bool expectIsPatch: false,
-    bool checkHasBody: false,
-    bool expectIsGetter: false,
-    bool expectIsFound: true,
-    bool expectIsRegular: false}) {
-  dynamic element = lookup(name);
-  if (!expectIsFound) {
-    Expect.isNull(element);
-    return element;
-  }
-  Expect.isNotNull(element);
-  if (expectIsGetter) {
-    Expect.isTrue(element is AbstractFieldElement);
-    Expect.isNotNull(element.getter);
-    element = element.getter;
-  }
-  Expect.equals(expectIsPatched, element.isPatched,
-      'Unexpected: $element.isPatched = ${element.isPatched}');
-  if (expectIsPatched) {
-    Expect.isNull(element.origin);
-    Expect.isNotNull(element.patch);
-
-    Expect.equals(element, element.declaration);
-    Expect.equals(element.patch, element.implementation);
-
-    if (checkHasBody) {
-      expectHasNoBody(compiler, element);
-      expectHasBody(compiler, element.patch);
-    }
-  } else {
-    Expect.isTrue(element.isImplementation);
-  }
-  Expect.equals(expectIsPatch, element.isPatch);
-  if (expectIsPatch) {
-    Expect.isNotNull(element.origin);
-    Expect.isNull(element.patch);
-
-    Expect.equals(element.origin, element.declaration);
-    Expect.equals(element, element.implementation);
-
-    if (checkHasBody) {
-      expectHasBody(compiler, element);
-      expectHasNoBody(compiler, element.origin);
-    }
-  } else {
-    Expect.isTrue(element.isDeclaration);
-  }
-  if (expectIsRegular) {
-    Expect.isNull(element.origin);
-    Expect.isNull(element.patch);
-
-    Expect.equals(element, element.declaration);
-    Expect.equals(element, element.implementation);
-
-    if (checkHasBody) {
-      expectHasBody(compiler, element);
-    }
-  }
-  Expect.isFalse(element.isPatched && element.isPatch);
-  return element;
-}
-
-Future testPatchFunction() async {
-  dynamic compiler = await applyPatch(
-      "external test();", "@patch test() { return 'string'; } ");
-  ensure(compiler, "test", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true, checkHasBody: true);
-  ensure(compiler, "test",
-      compiler.resolution.commonElements.coreLibrary.patch.find,
-      expectIsPatch: true, checkHasBody: true);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  Expect.isTrue(
-      collector.errors.isEmpty, "Unexpected errors: ${collector.errors}");
-}
-
-Future testPatchFunctionMetadata() async {
-  dynamic compiler = await applyPatch("""
-      const a = 0;
-      @a external test();
-      """, """
-      const _b = 1;
-      @patch @_b test() {}
-      """);
-  Element origin = ensure(
-      compiler, "test", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true, checkHasBody: true);
-  Element patch = ensure(compiler, "test",
-      compiler.resolution.commonElements.coreLibrary.patch.find,
-      expectIsPatch: true, checkHasBody: true);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  Expect.isTrue(
-      collector.errors.isEmpty, "Unexpected errors: ${collector.errors}");
-
-  Expect.equals(1, origin.metadata.length,
-      "Unexpected origin metadata: ${origin.metadata}.");
-  Expect.equals(3, patch.metadata.length,
-      "Unexpected patch metadata: ${patch.metadata}.");
-}
-
-Future testPatchFunctionGeneric() async {
-  dynamic compiler = await applyPatch(
-      "external T test<T>();", "@patch T test<T>() { return null; } ");
-  Element origin = ensure(
-      compiler, "test", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true, checkHasBody: true);
-  ensure(compiler, "test",
-      compiler.resolution.commonElements.coreLibrary.patch.find,
-      expectIsPatch: true, checkHasBody: true);
-  compiler.resolver.resolve(origin);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  Expect.isTrue(
-      collector.errors.isEmpty, "Unexpected errors: ${collector.errors}");
-}
-
-Future testPatchFunctionGenericExtraTypeVariable() async {
-  dynamic compiler = await applyPatch(
-      "external T test<T>();", "@patch T test<T, S>() { return null; } ");
-  Element origin = ensure(
-      compiler, "test", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true, checkHasBody: true);
-  ensure(compiler, "test",
-      compiler.resolution.commonElements.coreLibrary.patch.find,
-      expectIsPatch: true, checkHasBody: true);
-  compiler.resolver.resolve(origin);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  Expect.equals(1, collector.errors.length);
-  Expect.isTrue(collector.errors.first.message.kind ==
-      MessageKind.PATCH_TYPE_VARIABLES_MISMATCH);
-}
-
-Future testPatchFunctionGenericDifferentNames() async {
-  dynamic compiler = await applyPatch(
-      "external T test<T, S>();", "@patch T test<S, T>() { return null; } ");
-  Element origin = ensure(
-      compiler, "test", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true, checkHasBody: true);
-  ensure(compiler, "test",
-      compiler.resolution.commonElements.coreLibrary.patch.find,
-      expectIsPatch: true, checkHasBody: true);
-  compiler.resolver.resolve(origin);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  Expect.equals(1, collector.errors.length);
-  Expect.isTrue(collector.errors.first.message.kind ==
-      MessageKind.PATCH_TYPE_VARIABLES_MISMATCH);
-}
-
-Future testPatchConstructor() async {
-  dynamic compiler = await applyPatch("""
-      class Class {
-        external Class();
-      }
-      """, """
-      @patch class Class {
-        @patch Class();
-      }
-      """);
-  dynamic classOrigin = ensure(
-      compiler, "Class", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true);
-  classOrigin.ensureResolved(compiler.resolution);
-  dynamic classPatch = ensure(compiler, "Class",
-      compiler.resolution.commonElements.coreLibrary.patch.find,
-      expectIsPatch: true);
-
-  Expect.equals(classPatch, classOrigin.patch);
-  Expect.equals(classOrigin, classPatch.origin);
-
-  dynamic constructorOrigin = ensure(
-      compiler, "", (name) => classOrigin.localLookup(name),
-      expectIsPatched: true);
-  dynamic constructorPatch = ensure(
-      compiler, "", (name) => classPatch.localLookup(name),
-      expectIsPatch: true);
-
-  Expect.equals(constructorPatch, constructorOrigin.patch);
-  Expect.equals(constructorOrigin, constructorPatch.origin);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  Expect.isTrue(
-      collector.errors.isEmpty, "Unexpected errors: ${collector.errors}");
-}
-
-Future testPatchRedirectingConstructor() async {
-  dynamic compiler = await applyPatch("""
-      class Class {
-        Class(x) : this._(x, false);
-
-        external Class._(x, y);
-      }
-      """, r"""
-      @patch class Class {
-        @patch Class._(x, y) { print('$x,$y'); }
-      }
-      """);
-  dynamic classOrigin = ensure(
-      compiler, "Class", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true);
-  classOrigin.ensureResolved(compiler.resolution);
-
-  dynamic classPatch = ensure(compiler, "Class",
-      compiler.resolution.commonElements.coreLibrary.patch.find,
-      expectIsPatch: true);
-
-  Expect.equals(classOrigin, classPatch.origin);
-  Expect.equals(classPatch, classOrigin.patch);
-
-  dynamic constructorRedirecting =
-      ensure(compiler, "", (name) => classOrigin.localLookup(name));
-  dynamic constructorOrigin = ensure(
-      compiler, "_", (name) => classOrigin.localLookup(name),
-      expectIsPatched: true);
-  dynamic constructorPatch = ensure(
-      compiler, "_", (name) => classPatch.localLookup(name),
-      expectIsPatch: true);
-  Expect.equals(constructorOrigin, constructorPatch.origin);
-  Expect.equals(constructorPatch, constructorOrigin.patch);
-
-  compiler.resolver.resolve(constructorRedirecting);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  Expect.isTrue(
-      collector.errors.isEmpty, "Unexpected errors: ${collector.errors}");
-}
-
-Future testPatchMember() async {
-  dynamic compiler = await applyPatch("""
-      class Class {
-        external String toString();
-      }
-      """, """
-      @patch class Class {
-        @patch String toString() => 'string';
-      }
-      """);
-  dynamic container = ensure(
-      compiler, "Class", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true);
-  container.parseNode(compiler.parsingContext);
-  ensure(compiler, "Class",
-      compiler.resolution.commonElements.coreLibrary.patch.find,
-      expectIsPatch: true);
-
-  ensure(compiler, "toString", container.lookupLocalMember,
-      expectIsPatched: true, checkHasBody: true);
-  ensure(compiler, "toString", container.patch.lookupLocalMember,
-      expectIsPatch: true, checkHasBody: true);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  Expect.isTrue(
-      collector.errors.isEmpty, "Unexpected errors: ${collector.errors}");
-}
-
-Future testPatchGetter() async {
-  dynamic compiler = await applyPatch("""
-      class Class {
-        external int get field;
-      }
-      """, """
-      @patch class Class {
-        @patch int get field => 5;
-      }
-      """);
-  dynamic container = ensure(
-      compiler, "Class", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true);
-  container.parseNode(compiler.parsingContext);
-  ensure(compiler, "field", container.lookupLocalMember,
-      expectIsGetter: true, expectIsPatched: true, checkHasBody: true);
-  ensure(compiler, "field", container.patch.lookupLocalMember,
-      expectIsGetter: true, expectIsPatch: true, checkHasBody: true);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  Expect.isTrue(
-      collector.errors.isEmpty, "Unexpected errors: ${collector.errors}");
-}
-
-Future testRegularMember() async {
-  dynamic compiler = await applyPatch("""
-      class Class {
-        void regular() {}
-      }
-      """, """
-      @patch class Class {
-      }
-      """);
-  dynamic container = ensure(
-      compiler, "Class", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true);
-  container.parseNode(compiler.parsingContext);
-  ensure(compiler, "Class",
-      compiler.resolution.commonElements.coreLibrary.patch.find,
-      expectIsPatch: true);
-
-  ensure(compiler, "regular", container.lookupLocalMember,
-      checkHasBody: true, expectIsRegular: true);
-  ensure(compiler, "regular", container.patch.lookupLocalMember,
-      checkHasBody: true, expectIsRegular: true);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  Expect.isTrue(
-      collector.errors.isEmpty, "Unexpected errors: ${collector.errors}");
-}
-
-Future testInjectedMember() async {
-  dynamic compiler = await applyPatch("""
-      class Class {
-      }
-      """, """
-      @patch class Class {
-        void _injected() {}
-      }
-      """);
-  dynamic container = ensure(
-      compiler, "Class", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true);
-  container.parseNode(compiler.parsingContext);
-  ensure(compiler, "Class",
-      compiler.resolution.commonElements.coreLibrary.patch.find,
-      expectIsPatch: true);
-
-  ensure(compiler, "_injected", container.lookupLocalMember,
-      expectIsFound: false);
-  ensure(compiler, "_injected", container.patch.lookupLocalMember,
-      checkHasBody: true, expectIsRegular: true);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  Expect.isTrue(
-      collector.errors.isEmpty, "Unexpected errors: ${collector.errors}");
-}
-
-Future testInjectedPublicMember() async {
-  dynamic compiler = await applyPatch("""
-      class Class {
-      }
-      """, """
-      @patch class Class {
-        void injected() {}
-      }
-      """);
-  dynamic container = ensure(
-      compiler, "Class", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true);
-  container.parseNode(compiler.parsingContext);
-  ensure(compiler, "Class",
-      compiler.resolution.commonElements.coreLibrary.patch.find,
-      expectIsPatch: true);
-
-  ensure(compiler, "injected", container.lookupLocalMember,
-      expectIsFound: false);
-  ensure(compiler, "injected", container.patch.lookupLocalMember,
-      checkHasBody: true, expectIsRegular: true);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  Expect.equals(
-      1, collector.errors.length, "Unexpected errors: ${collector.errors}");
-  Expect.isTrue(collector.errors.first.message.kind ==
-      MessageKind.INJECTED_PUBLIC_MEMBER);
-}
-
-Future testInjectedFunction() async {
-  dynamic compiler = await applyPatch("", "int _function() => 5;");
-  ensure(compiler, "_function",
-      compiler.resolution.commonElements.coreLibrary.find,
-      expectIsFound: false);
-  ensure(compiler, "_function",
-      compiler.resolution.commonElements.coreLibrary.patch.find,
-      checkHasBody: true, expectIsRegular: true);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  Expect.isTrue(
-      collector.errors.isEmpty, "Unexpected errors: ${collector.errors}");
-}
-
-Future testInjectedPublicFunction() async {
-  dynamic compiler = await applyPatch("", "int function() => 5;");
-  ensure(
-      compiler, "function", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsFound: false);
-  ensure(compiler, "function",
-      compiler.resolution.commonElements.coreLibrary.patch.find,
-      checkHasBody: true, expectIsRegular: true);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  Expect.equals(
-      1, collector.errors.length, "Unexpected errors: ${collector.errors}");
-  Expect.isTrue(collector.errors.first.message.kind ==
-      MessageKind.INJECTED_PUBLIC_MEMBER);
-}
-
-Future testPatchSignatureCheck() async {
-  dynamic compiler = await applyPatch("""
-      class Class {
-        external String method1();
-        external void method2(String str);
-        external void method3(String s1);
-        external void method4([String str]);
-        external void method5({String str});
-        external void method6({String str});
-        external void method7([String s1]);
-        external void method8({String s1});
-        external void method9(String str);
-        external void method10([String str]);
-        external void method11({String str});
-      }
-      """, """
-      @patch class Class {
-        @patch int method1() => 0;
-        @patch void method2() {}
-        @patch void method3(String s2) {}
-        @patch void method4([String str, int i]) {}
-        @patch void method5() {}
-        @patch void method6([String str]) {}
-        @patch void method7([String s2]) {}
-        @patch void method8({String s2}) {}
-        @patch void method9(int str) {}
-        @patch void method10([int str]) {}
-        @patch void method11({int str}) {}
-      }
-      """);
-  dynamic container = ensure(
-      compiler, "Class", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true);
-  container.ensureResolved(compiler.resolution);
-  container.parseNode(compiler.parsingContext);
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-
-  void expect(String methodName, List infos, List errors) {
-    collector.clear();
-    compiler.resolver.resolveMethodElement(ensure(
-        compiler, methodName, container.lookupLocalMember,
-        expectIsPatched: true, checkHasBody: true));
-    Expect.equals(0, collector.warnings.length);
-    Expect.equals(infos.length, collector.infos.length,
-        "Unexpected infos: ${collector.infos} on $methodName");
-    for (int i = 0; i < infos.length; i++) {
-      Expect.equals(infos[i], collector.infos.elementAt(i).message.kind);
-    }
-    Expect.equals(errors.length, collector.errors.length,
-        "Unexpected errors: ${collector.errors} on $methodName");
-    for (int i = 0; i < errors.length; i++) {
-      Expect.equals(errors[i], collector.errors.elementAt(i).message.kind);
-    }
-  }
-
-  expect("method1", [], [MessageKind.PATCH_RETURN_TYPE_MISMATCH]);
-  expect("method2", [], [MessageKind.PATCH_REQUIRED_PARAMETER_COUNT_MISMATCH]);
-  expect("method3", [MessageKind.PATCH_POINT_TO_PARAMETER],
-      [MessageKind.PATCH_PARAMETER_MISMATCH]);
-  expect("method4", [], [MessageKind.PATCH_OPTIONAL_PARAMETER_COUNT_MISMATCH]);
-  expect("method5", [], [MessageKind.PATCH_OPTIONAL_PARAMETER_COUNT_MISMATCH]);
-  expect("method6", [], [MessageKind.PATCH_OPTIONAL_PARAMETER_NAMED_MISMATCH]);
-  expect("method7", [MessageKind.PATCH_POINT_TO_PARAMETER],
-      [MessageKind.PATCH_PARAMETER_MISMATCH]);
-  expect("method8", [MessageKind.PATCH_POINT_TO_PARAMETER],
-      [MessageKind.PATCH_PARAMETER_MISMATCH]);
-  expect("method9", [MessageKind.PATCH_POINT_TO_PARAMETER],
-      [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]);
-  expect("method10", [MessageKind.PATCH_POINT_TO_PARAMETER],
-      [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]);
-  expect("method11", [MessageKind.PATCH_POINT_TO_PARAMETER],
-      [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]);
-}
-
-Future testExternalWithoutImplementationTopLevel() async {
-  dynamic compiler = await applyPatch("""
-      external void foo();
-      """, """
-      // @patch void foo() {}
-      """);
-  dynamic function = ensure(
-      compiler, "foo", compiler.resolution.commonElements.coreLibrary.find);
-  compiler.resolver.resolve(function);
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  print('testExternalWithoutImplementationTopLevel:${collector.errors}');
-  Expect.equals(1, collector.errors.length);
-  Expect.isTrue(collector.errors.first.message.kind ==
-      MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION);
-  Expect.stringEquals('External method without an implementation.',
-      collector.errors.first.message.toString());
-}
-
-Future testExternalWithoutImplementationMember() async {
-  dynamic compiler = await applyPatch("""
-      class Class {
-        external void foo();
-      }
-      """, """
-      @patch class Class {
-        // @patch void foo() {}
-      }
-      """);
-  dynamic container = ensure(
-      compiler, "Class", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true);
-  container.parseNode(compiler.parsingContext);
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  collector.clear();
-  compiler.resolver.resolveMethodElement(
-      ensure(compiler, "foo", container.lookupLocalMember));
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  print('testExternalWithoutImplementationMember:${collector.errors}');
-  Expect.equals(1, collector.errors.length);
-  Expect.isTrue(collector.errors.first.message.kind ==
-      MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION);
-  Expect.stringEquals('External method without an implementation.',
-      collector.errors.first.message.toString());
-}
-
-Future testIsSubclass() async {
-  dynamic compiler = await applyPatch("""
-      class A {}
-      """, """
-      @patch class A {}
-      """);
-  ClassElement cls = ensure(
-      compiler, "A", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true);
-  ClassElement patch = cls.patch;
-  Expect.isTrue(cls != patch);
-  Expect.isTrue(cls.isSubclassOf(patch));
-  Expect.isTrue(patch.isSubclassOf(cls));
-}
-
-Future testPatchNonExistingTopLevel() async {
-  dynamic compiler = await applyPatch("""
-      // class Class {}
-      """, """
-      @patch class Class {}
-      """);
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  print('testPatchNonExistingTopLevel:${collector.errors}');
-  Expect.equals(1, collector.errors.length);
-  Expect.isTrue(
-      collector.errors.first.message.kind == MessageKind.PATCH_NON_EXISTING);
-}
-
-Future testPatchNonExistingMember() async {
-  dynamic compiler = await applyPatch("""
-      class Class {}
-      """, """
-      @patch class Class {
-        @patch void foo() {}
-      }
-      """);
-  dynamic container = ensure(
-      compiler, "Class", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true);
-  container.parseNode(compiler.parsingContext);
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  print('testPatchNonExistingMember:${collector.errors}');
-  Expect.equals(1, collector.errors.length);
-  Expect.isTrue(
-      collector.errors.first.message.kind == MessageKind.PATCH_NON_EXISTING);
-}
-
-Future testPatchNonPatchablePatch() async {
-  dynamic compiler = await applyPatch("""
-      external get foo;
-      """, """
-      @patch var foo;
-      """);
-  ensure(compiler, "foo", compiler.resolution.commonElements.coreLibrary.find);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  print('testPatchNonPatchablePatch:${collector.errors}');
-  Expect.equals(1, collector.errors.length);
-  Expect.isTrue(
-      collector.errors.first.message.kind == MessageKind.PATCH_NONPATCHABLE);
-}
-
-Future testPatchNonPatchableOrigin() async {
-  dynamic compiler = await applyPatch("""
-      external var foo;
-      """, """
-      @patch get foo => 0;
-      """);
-  ensure(compiler, "foo", compiler.resolution.commonElements.coreLibrary.find);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isTrue(
-      collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}");
-  print('testPatchNonPatchableOrigin:${collector.errors}');
-  Expect.equals(2, collector.errors.length);
-  Expect.equals(
-      MessageKind.EXTRANEOUS_MODIFIER, collector.errors.first.message.kind);
-  Expect.equals(
-      // TODO(ahe): Eventually, this error should be removed as it will be
-      // handled by the regular parser.
-      MessageKind.PATCH_NONPATCHABLE,
-      collector.errors.elementAt(1).message.kind);
-}
-
-Future testPatchNonExternalTopLevel() async {
-  dynamic compiler = await applyPatch("""
-      void foo() {}
-      """, """
-      @patch void foo() {}
-      """);
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  print('testPatchNonExternalTopLevel.errors:${collector.errors}');
-  print('testPatchNonExternalTopLevel.warnings:${collector.warnings}');
-  Expect.equals(1, collector.errors.length);
-  Expect.isTrue(
-      collector.errors.first.message.kind == MessageKind.PATCH_NON_EXTERNAL);
-  Expect.equals(0, collector.warnings.length);
-  Expect.equals(1, collector.infos.length);
-  Expect.isTrue(collector.infos.first.message.kind ==
-      MessageKind.PATCH_POINT_TO_FUNCTION);
-}
-
-Future testPatchNonExternalMember() async {
-  dynamic compiler = await applyPatch("""
-      class Class {
-        void foo() {}
-      }
-      """, """
-      @patch class Class {
-        @patch void foo() {}
-      }
-      """);
-  dynamic container = ensure(
-      compiler, "Class", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true);
-  container.parseNode(compiler.parsingContext);
-
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  print('testPatchNonExternalMember.errors:${collector.errors}');
-  print('testPatchNonExternalMember.warnings:${collector.warnings}');
-  Expect.equals(1, collector.errors.length);
-  Expect.isTrue(
-      collector.errors.first.message.kind == MessageKind.PATCH_NON_EXTERNAL);
-  Expect.equals(0, collector.warnings.length);
-  Expect.equals(1, collector.infos.length);
-  Expect.isTrue(collector.infos.first.message.kind ==
-      MessageKind.PATCH_POINT_TO_FUNCTION);
-}
-
-Future testPatchNonClass() async {
-  dynamic compiler = await applyPatch("""
-      external void Class() {}
-      """, """
-      @patch class Class {}
-      """);
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  print('testPatchNonClass.errors:${collector.errors}');
-  print('testPatchNonClass.warnings:${collector.warnings}');
-  Expect.equals(1, collector.errors.length);
-  Expect.isTrue(
-      collector.errors.first.message.kind == MessageKind.PATCH_NON_CLASS);
-  Expect.equals(0, collector.warnings.length);
-  Expect.equals(1, collector.infos.length);
-  Expect.isTrue(
-      collector.infos.first.message.kind == MessageKind.PATCH_POINT_TO_CLASS);
-}
-
-Future testPatchNonGetter() async {
-  dynamic compiler = await applyPatch("""
-      external void foo() {}
-      """, """
-      @patch get foo => 0;
-      """);
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  print('testPatchNonClass.errors:${collector.errors}');
-  print('testPatchNonClass.warnings:${collector.warnings}');
-  Expect.equals(1, collector.errors.length);
-  Expect.isTrue(
-      collector.errors.first.message.kind == MessageKind.PATCH_NON_GETTER);
-  Expect.equals(0, collector.warnings.length);
-  Expect.equals(1, collector.infos.length);
-  Expect.isTrue(
-      collector.infos.first.message.kind == MessageKind.PATCH_POINT_TO_GETTER);
-}
-
-Future testPatchNoGetter() async {
-  dynamic compiler = await applyPatch("""
-      external set foo(var value) {}
-      """, """
-      @patch get foo => 0;
-      """);
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  print('testPatchNonClass.errors:${collector.errors}');
-  print('testPatchNonClass.warnings:${collector.warnings}');
-  Expect.equals(1, collector.errors.length);
-  Expect.isTrue(
-      collector.errors.first.message.kind == MessageKind.PATCH_NO_GETTER);
-  Expect.equals(0, collector.warnings.length);
-  Expect.equals(1, collector.infos.length);
-  Expect.isTrue(
-      collector.infos.first.message.kind == MessageKind.PATCH_POINT_TO_GETTER);
-}
-
-Future testPatchNonSetter() async {
-  dynamic compiler = await applyPatch("""
-      external void foo() {}
-      """, """
-      @patch set foo(var value) {}
-      """);
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  print('testPatchNonClass.errors:${collector.errors}');
-  print('testPatchNonClass.warnings:${collector.warnings}');
-  Expect.equals(1, collector.errors.length);
-  Expect.isTrue(
-      collector.errors.first.message.kind == MessageKind.PATCH_NON_SETTER);
-  Expect.equals(0, collector.warnings.length);
-  Expect.equals(1, collector.infos.length);
-  Expect.isTrue(
-      collector.infos.first.message.kind == MessageKind.PATCH_POINT_TO_SETTER);
-}
-
-Future testPatchNoSetter() async {
-  dynamic compiler = await applyPatch("""
-      external get foo;
-      """, """
-      @patch set foo(var value) {}
-      """);
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  print('testPatchNonClass.errors:${collector.errors}');
-  print('testPatchNonClass.warnings:${collector.warnings}');
-  Expect.equals(1, collector.errors.length);
-  Expect.isTrue(
-      collector.errors.first.message.kind == MessageKind.PATCH_NO_SETTER);
-  Expect.equals(0, collector.warnings.length);
-  Expect.equals(1, collector.infos.length);
-  Expect.isTrue(
-      collector.infos.first.message.kind == MessageKind.PATCH_POINT_TO_SETTER);
-}
-
-Future testPatchNonFunction() async {
-  dynamic compiler = await applyPatch("""
-      external get foo;
-      """, """
-      @patch void foo() {}
-      """);
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  print('testPatchNonClass.errors:${collector.errors}');
-  print('testPatchNonClass.warnings:${collector.warnings}');
-  Expect.equals(1, collector.errors.length);
-  Expect.isTrue(
-      collector.errors.first.message.kind == MessageKind.PATCH_NON_FUNCTION);
-  Expect.equals(0, collector.warnings.length);
-  Expect.equals(1, collector.infos.length);
-  Expect.isTrue(collector.infos.first.message.kind ==
-      MessageKind.PATCH_POINT_TO_FUNCTION);
-}
-
-Future testPatchAndSelector() async {
-  dynamic compiler = await applyPatch("""
-      class A {
-        external void clear();
-      }
-      class B extends A {
-      }
-      """, """
-      @patch class A {
-        int method() => 0;
-        @patch void clear() {}
-      }
-      """, main: """
-      main () {
-        new A(); // ensure A and B are instantiated
-        new B();
-      }
-      """, runCompiler: true, analyzeOnly: true);
-  compiler.closeResolution(
-      compiler.frontendStrategy.elementEnvironment.mainFunction);
-  ClosedWorld world = compiler.resolutionWorldBuilder.closedWorldForTesting;
-
-  ClassElement cls = ensure(
-      compiler, "A", compiler.resolution.commonElements.coreLibrary.find,
-      expectIsPatched: true);
-  cls.ensureResolved(compiler.resolution);
-
-  ensure(compiler, "method", cls.patch.lookupLocalMember,
-      checkHasBody: true, expectIsRegular: true);
-
-  ensure(compiler, "clear", cls.lookupLocalMember,
-      checkHasBody: true, expectIsPatched: true);
-
-  compiler.phase = Compiler.PHASE_DONE_RESOLVING;
-
-  // Check that a method just in the patch class is a target for a
-  // typed selector.
-  Selector selector =
-      new Selector.call(const PublicName('method'), CallStructure.NO_ARGS);
-  TypeMask typeMask = new TypeMask.exact(cls, world);
-  MethodElement method = cls.implementation.lookupLocalMember('method');
-  method.computeType(compiler.resolution);
-  Expect.isTrue(selector.applies(method));
-  Expect.isTrue(typeMask.canHit(method, selector, world));
-
-  // Check that the declaration method in the declaration class is a target
-  // for a typed selector.
-  selector =
-      new Selector.call(const PublicName('clear'), CallStructure.NO_ARGS);
-  typeMask = new TypeMask.exact(cls, world);
-  method = cls.lookupLocalMember('clear');
-  method.computeType(compiler.resolution);
-  Expect.isTrue(selector.applies(method));
-  Expect.isTrue(typeMask.canHit(method, selector, world));
-
-  // Check that the declaration method in the declaration class is a target
-  // for a typed selector on a subclass.
-  cls = ensure(
-      compiler, "B", compiler.resolution.commonElements.coreLibrary.find);
-  cls.ensureResolved(compiler.resolution);
-  typeMask = new TypeMask.exact(cls, world);
-  Expect.isTrue(selector.applies(method));
-  Expect.isTrue(typeMask.canHit(method, selector, world));
-}
-
-Future testAnalyzeAllInjectedMembers() async {
-  Future expect(String patchText, [expectedWarnings]) async {
-    if (expectedWarnings == null) expectedWarnings = [];
-    if (expectedWarnings is! List) {
-      expectedWarnings = <MessageKind>[expectedWarnings];
-    }
-
-    dynamic compiler =
-        await applyPatch('', patchText, analyzeAll: true, analyzeOnly: true);
-    compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')];
-    await compiler.run(null);
-    DiagnosticCollector collector = compiler.diagnosticCollector;
-    compareWarningKinds(patchText, expectedWarnings, collector.warnings);
-  }
-
-  await expect('String s = 0;', MessageKind.NOT_ASSIGNABLE);
-  await expect('void method() { String s = 0; }', MessageKind.NOT_ASSIGNABLE);
-  await expect('''
-         class Class {
-           String s = 0;
-         }
-         ''', MessageKind.NOT_ASSIGNABLE);
-  await expect('''
-         class Class {
-           void method() {
-             String s = 0;
-           }
-         }
-         ''', MessageKind.NOT_ASSIGNABLE);
-}
-
-Future testEffectiveTarget() async {
-  String origin = """
-    class A {
-      A() : super();
-      factory A.forward() = B.patchTarget;
-      factory A.forwardOne() = B.patchFactory;
-      factory A.forwardTwo() = B.reflectBack;
-      factory A.forwardThree() = B.patchInjected;
-    }
-    class B extends A {
-      B() : super();
-      external B.patchTarget();
-      external factory B.patchFactory();
-      external factory B.reflectBack();
-      B.originTarget() : super();
-      external factory B.patchInjected();
-    }
-    """;
-  String patch = """
-    @patch class B {
-      @patch
-      B.patchTarget() : super();
-      @patch
-      factory B.patchFactory() => new B.patchTarget();
-      @patch
-      factory B.reflectBack() = B.originTarget;
-      @patch
-      factory B.patchInjected() = _C.injected;
-    }
-    class _C extends B {
-      _C.injected() : super.patchTarget();
-    }
-    """;
-
-  dynamic compiler = await applyPatch(origin, patch,
-      analyzeAll: true, analyzeOnly: true, runCompiler: true);
-  ClassElement clsA = compiler.resolution.commonElements.coreLibrary.find("A");
-  ClassElement clsB = compiler.resolution.commonElements.coreLibrary.find("B");
-  Expect.isNotNull(clsB);
-
-  ConstructorElement forward = clsA.lookupConstructor("forward");
-  ConstructorElement target = forward.effectiveTarget;
-  Expect.isTrue(target.isPatched, "Unexpected target $target for $forward");
-  Expect.isFalse(target.isPatch, "Unexpected target $target for $forward");
-  Expect.equals("patchTarget", target.name);
-
-  ConstructorElement forwardOne = clsA.lookupConstructor("forwardOne");
-  target = forwardOne.effectiveTarget;
-  Expect.isFalse(forwardOne.isMalformed);
-  Expect.isFalse(target.isPatch, "Unexpected target $target for $forwardOne");
-  Expect.equals("patchFactory", target.name);
-
-  ConstructorElement forwardTwo = clsA.lookupConstructor("forwardTwo");
-  target = forwardTwo.effectiveTarget;
-  Expect.isFalse(forwardTwo.isMalformed);
-  Expect.isFalse(target.isPatch, "Unexpected target $target for $forwardTwo");
-  Expect.equals("originTarget", target.name);
-
-  ConstructorElement forwardThree = clsA.lookupConstructor("forwardThree");
-  target = forwardThree.effectiveTarget;
-  Expect.isFalse(forwardThree.isMalformed);
-  Expect.isTrue(
-      target.isInjected, "Unexpected target $target for $forwardThree");
-  Expect.equals("injected", target.name);
-}
-
-Future testTypecheckPatchedMembers() async {
-  String originText = "external void method();";
-  String patchText = """
-                     @patch void method() {
-                       String s = 0;
-                     }
-                     """;
-  dynamic compiler = await applyPatch(originText, patchText,
-      analyzeAll: true, analyzeOnly: true);
-  compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')];
-  await compiler.run(null);
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  compareWarningKinds(
-      patchText, [MessageKind.NOT_ASSIGNABLE], collector.warnings);
-}
-
-main() {
-  asyncTest(() async {
-    await testPatchConstructor();
-    await testPatchRedirectingConstructor();
-    await testPatchFunction();
-    await testPatchFunctionMetadata();
-    await testPatchFunctionGeneric();
-    await testPatchFunctionGenericExtraTypeVariable();
-    await testPatchFunctionGenericDifferentNames();
-    await testPatchMember();
-    await testPatchGetter();
-    await testRegularMember();
-    await testInjectedMember();
-    await testInjectedPublicMember();
-    await testInjectedFunction();
-    await testInjectedPublicFunction();
-    await testPatchSignatureCheck();
-
-    await testExternalWithoutImplementationTopLevel();
-    await testExternalWithoutImplementationMember();
-
-    await testIsSubclass();
-
-    await testPatchNonExistingTopLevel();
-    await testPatchNonExistingMember();
-    await testPatchNonPatchablePatch();
-    await testPatchNonPatchableOrigin();
-    await testPatchNonExternalTopLevel();
-    await testPatchNonExternalMember();
-    await testPatchNonClass();
-    await testPatchNonGetter();
-    await testPatchNoGetter();
-    await testPatchNonSetter();
-    await testPatchNoSetter();
-    await testPatchNonFunction();
-
-    await testPatchAndSelector();
-
-    await testEffectiveTarget();
-
-    await testAnalyzeAllInjectedMembers();
-    await testTypecheckPatchedMembers();
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/platform_consistency_test.dart b/tests/compiler/dart2js/old_frontend/platform_consistency_test.dart
deleted file mode 100644
index 59b257c..0000000
--- a/tests/compiler/dart2js/old_frontend/platform_consistency_test.dart
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 2015, the Fletch 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 "package:compiler/src/platform_configuration.dart";
-import "package:compiler/src/source_file_provider.dart";
-import "package:compiler/compiler_new.dart";
-import "package:expect/expect.dart";
-
-main() async {
-  CompilerInput input = new CompilerSourceFileProvider();
-  Map<String, Uri> client =
-      await load(Uri.base.resolve("sdk/lib/dart_client.platform"), input);
-  Map<String, Uri> server =
-      await load(Uri.base.resolve("sdk/lib/dart_server.platform"), input);
-  Map<String, Uri> shared =
-      await load(Uri.base.resolve("sdk/lib/dart_shared.platform"), input);
-  Expect.setEquals(new Set.from(shared.keys), new Set.from(client.keys));
-  Expect.setEquals(new Set.from(shared.keys), new Set.from(server.keys));
-
-  for (String libraryName in shared.keys) {
-    test(Map<String, Uri> m) {
-      if (m[libraryName].scheme != 'unsupported' &&
-          shared[libraryName].scheme != 'unsupported') {
-        Expect.equals(shared[libraryName], m[libraryName]);
-      }
-    }
-
-    test(client);
-    test(server);
-  }
-}
diff --git a/tests/compiler/dart2js/old_frontend/private_test.dart b/tests/compiler/dart2js/old_frontend/private_test.dart
deleted file mode 100644
index 569485d..0000000
--- a/tests/compiler/dart2js/old_frontend/private_test.dart
+++ /dev/null
@@ -1,170 +0,0 @@
-// 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.
-
-import 'dart:async';
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/diagnostics/messages.dart' show MessageKind;
-import 'package:compiler/src/io/source_file.dart';
-import 'package:compiler/src/old_to_new_api.dart';
-
-import 'mock_compiler.dart';
-
-const String PRIVATE_SOURCE_URI = 'src:private';
-const String PRIVATE_SOURCE = '''
-
-var _privateVariable;
-void _privateFunction() {}
-
-class _PrivateClass {
-  _PrivateClass();
-  _PrivateClass.publicConstructor();
-  _PrivateClass._privateConstructor();
-
-  var _privateField;
-  get _privateGetter => null;
-  void set _privateSetter(var value) {}
-  void _privateMethod() {}
-
-  var publicField;
-  get publicGetter => null;
-  void set publicSetter(var value) {}
-  void publicMethod() {}
-}
-
-class PublicClass extends _PrivateClass {
-  PublicClass() : super();
-  PublicClass.publicConstructor() : super.publicConstructor();
-  PublicClass._privateConstructor() : super._privateConstructor();
-
-  _PrivateClass get private => this;
-}
-''';
-
-analyze(String text, [expectedWarnings]) {
-  return () {
-    if (expectedWarnings == null) expectedWarnings = [];
-    if (expectedWarnings is! List) expectedWarnings = [expectedWarnings];
-
-    MockCompiler compiler = new MockCompiler.internal(analyzeOnly: true);
-    compiler.registerSource(Uri.parse(PRIVATE_SOURCE_URI), PRIVATE_SOURCE);
-    compiler.diagnosticHandler = new LegacyCompilerDiagnostics(
-        (uri, int begin, int end, String message, kind) {
-      SourceFile sourceFile = compiler.sourceFiles[uri.toString()];
-      if (sourceFile != null) {
-        print(sourceFile.getLocationMessage(message, begin, end));
-      } else {
-        print(message);
-      }
-    });
-
-    String source = '''
-                    library public;
-  
-                    import '$PRIVATE_SOURCE_URI';
-  
-                    void main() {
-                      PublicClass publicClass;
-                      $text
-                    }
-                    ''';
-    Uri uri = Uri.parse('src:public');
-    compiler.registerSource(uri, source);
-    return compiler.run(uri).then((_) {
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      compareWarningKinds(text, expectedWarnings, collector.warnings);
-    });
-  };
-}
-
-void main() {
-  asyncTest(() => Future.forEach([
-        // Read from private variable.
-        analyze('var value = _privateVariable;', MessageKind.CANNOT_RESOLVE),
-        // Write to private variable.
-        analyze('_privateVariable = 0;', MessageKind.CANNOT_RESOLVE),
-        // Access private function.
-        analyze('var value = _privateFunction;', MessageKind.CANNOT_RESOLVE),
-        // Call private function.
-        analyze('_privateFunction();', MessageKind.CANNOT_RESOLVE),
-
-        // Call unnamed (public) constructor on private class.
-        analyze('new _PrivateClass();', MessageKind.CANNOT_RESOLVE),
-        // Call public constructor on private class.
-        analyze('new _PrivateClass.publicConstructor();',
-            MessageKind.CANNOT_RESOLVE),
-        // Call private constructor on private class.
-        analyze('new _PrivateClass._privateConstructor();',
-            MessageKind.CANNOT_RESOLVE),
-        // Call public getter of private type.
-        analyze('var value = publicClass.private;'),
-        // Read from private field on private class.
-        analyze('var value = publicClass.private._privateField;',
-            MessageKind.PRIVATE_ACCESS),
-        // Write to private field on private class.
-        analyze('publicClass.private._privateField = 0;',
-            MessageKind.PRIVATE_ACCESS),
-        // Call private getter on private class.
-        analyze('var value = publicClass.private._privateGetter;',
-            MessageKind.PRIVATE_ACCESS),
-        // Call private setter on private class.
-        analyze('publicClass.private._privateSetter = 0;',
-            MessageKind.PRIVATE_ACCESS),
-        // Access private method on private class.
-        analyze('var value = publicClass.private._privateMethod;',
-            MessageKind.PRIVATE_ACCESS),
-        // Call private method on private class.
-        analyze('publicClass.private._privateMethod();',
-            MessageKind.PRIVATE_ACCESS),
-
-        // Read from public field on private class.
-        analyze('var value = publicClass.private.publicField;'),
-        // Write to public field on private class.
-        analyze('publicClass.private.publicField = 0;'),
-        // Call public getter on private class.
-        analyze('var value = publicClass.private.publicGetter;'),
-        // Call public setter on private class.
-        analyze('publicClass.private.publicSetter = 0;'),
-        // Access public method on private class.
-        analyze('var value = publicClass.private.publicMethod;'),
-        // Call public method on private class.
-        analyze('publicClass.private.publicMethod();'),
-
-        // Call unnamed (public) constructor on public class.
-        analyze('publicClass = new PublicClass();'),
-        // Call public constructor on public class.
-        analyze('publicClass = new PublicClass.publicConstructor();'),
-        // Call private constructor on public class.
-        analyze('publicClass = new PublicClass._privateConstructor();',
-            MessageKind.CANNOT_FIND_CONSTRUCTOR),
-        // Read from private field on public class.
-        analyze('var value = publicClass._privateField;',
-            MessageKind.PRIVATE_ACCESS),
-        // Write to private field on public class.
-        analyze('publicClass._privateField = 0;', MessageKind.PRIVATE_ACCESS),
-        // Call private getter on public class.
-        analyze('var value = publicClass._privateGetter;',
-            MessageKind.PRIVATE_ACCESS),
-        // Call private setter on public class.
-        analyze('publicClass._privateSetter = 0;', MessageKind.PRIVATE_ACCESS),
-        // Access private method on public class.
-        analyze('var value = publicClass._privateMethod;',
-            MessageKind.PRIVATE_ACCESS),
-        // Call private method on public class.
-        analyze('publicClass._privateMethod();', MessageKind.PRIVATE_ACCESS),
-
-        // Read from public field on public class.
-        analyze('var value = publicClass.publicField;'),
-        // Write to public field on public class.
-        analyze('publicClass.publicField = 0;'),
-        // Call public getter on public class.
-        analyze('var value = publicClass.publicGetter;'),
-        // Call public setter on public class.
-        analyze('publicClass.publicSetter = 0;'),
-        // Access public method on public class.
-        analyze('var value = publicClass.publicMethod;'),
-        // Call public method on public class.
-        analyze('publicClass.publicMethod();'),
-      ], (f) => f()));
-}
diff --git a/tests/compiler/dart2js/old_frontend/proxy_test.dart b/tests/compiler/dart2js/old_frontend/proxy_test.dart
deleted file mode 100644
index 0131db9..0000000
--- a/tests/compiler/dart2js/old_frontend/proxy_test.dart
+++ /dev/null
@@ -1,25 +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.
-
-// Test that dart2js produces the expected static type warnings for proxy
-// language tests. This ensures that the analyzer and dart2js agrees on these
-// tests.
-
-import 'warnings_checker.dart';
-
-/// Map from test files to a map of their expected status. If the status map is
-/// `null` no warnings must be missing or unexpected, otherwise the status map
-/// can contain a list of line numbers for keys 'missing' and 'unexpected' for
-/// the warnings of each category.
-const Map<String, dynamic> TESTS = const {
-  'language/proxy_test.dart': null,
-  'language/proxy2_test.dart': null,
-  'language/proxy3_test.dart': null,
-  'language/proxy4_test.dart': null,
-  'language/proxy5_test.dart': null,
-};
-
-void main(List<String> args) {
-  checkWarnings(TESTS, args);
-}
diff --git a/tests/compiler/dart2js/old_frontend/reexport_handled_test.dart b/tests/compiler/dart2js/old_frontend/reexport_handled_test.dart
deleted file mode 100644
index c8c0ad4..0000000
--- a/tests/compiler/dart2js/old_frontend/reexport_handled_test.dart
+++ /dev/null
@@ -1,48 +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.
-
-library reexport_handled_test;
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import 'package:compiler/src/elements/elements.dart' show LibraryElement;
-import 'mock_compiler.dart';
-
-final exportingLibraryUri = Uri.parse('exporting.dart');
-const String EXPORTING_LIBRARY_SOURCE = '''
-library exporting;
-var foo;
-''';
-
-final reexportingLibraryUri = Uri.parse('reexporting.dart');
-const String REEXPORTING_LIBRARY_SOURCE = '''
-library reexporting;
-export 'exporting.dart';
-''';
-
-void main() {
-  MockCompiler compiler;
-  asyncTest(() => MockCompiler.create((MockCompiler c) {
-        compiler = c;
-        compiler.registerSource(exportingLibraryUri, EXPORTING_LIBRARY_SOURCE);
-        compiler.registerSource(
-            reexportingLibraryUri, REEXPORTING_LIBRARY_SOURCE);
-        return compiler.libraryLoader.loadLibrary(exportingLibraryUri);
-      }).then((loadedLibraries) {
-        compiler.processLoadedLibraries(loadedLibraries);
-        LibraryElement exportingLibrary = loadedLibraries.rootLibrary;
-        Expect.isTrue(exportingLibrary.exportsHandled);
-        var foo = exportingLibrary.findExported('foo');
-        Expect.isNotNull(foo);
-        Expect.isTrue(foo.isField);
-
-        // Load reexporting library when exports are handled on the exporting library.
-        return compiler.libraryLoader.loadLibrary(reexportingLibraryUri);
-      }).then((dynamic loadedLibraries) {
-        compiler.processLoadedLibraries(loadedLibraries);
-        var foo = loadedLibraries.rootLibrary.findExported('foo');
-        Expect.isNotNull(foo);
-        Expect.isTrue(foo.isField);
-      }));
-}
diff --git a/tests/compiler/dart2js/old_frontend/related_types.dart b/tests/compiler/dart2js/old_frontend/related_types.dart
deleted file mode 100644
index 26f9607..0000000
--- a/tests/compiler/dart2js/old_frontend/related_types.dart
+++ /dev/null
@@ -1,445 +0,0 @@
-// Copyright (c) 2015, 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 related_types;
-
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/common_elements.dart';
-import 'package:compiler/src/elements/resolution_types.dart';
-import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
-import 'package:compiler/src/diagnostics/messages.dart';
-import 'package:compiler/src/elements/elements.dart';
-import 'package:compiler/src/elements/names.dart';
-import 'package:compiler/src/filenames.dart';
-import 'package:compiler/src/resolution/semantic_visitor.dart';
-import 'package:compiler/src/tree/tree.dart';
-import 'package:compiler/src/universe/call_structure.dart';
-import 'package:compiler/src/universe/selector.dart';
-import 'package:compiler/src/world.dart';
-import '../memory_compiler.dart';
-
-main(List<String> arguments) async {
-  if (arguments.isNotEmpty) {
-    Uri entryPoint = Uri.base.resolve(nativeToUriPath(arguments.last));
-    CompilationResult result = await runCompiler(
-        entryPoint: entryPoint,
-        options: [
-          Flags.analyzeOnly,
-          '--categories=Client,Server',
-          Flags.useOldFrontend
-        ]);
-    if (result.isSuccess) {
-      checkRelatedTypes(result.compiler);
-    }
-  } else {
-    print('Usage dart related_types.dart <entry-point>');
-  }
-}
-
-/// Check all loaded libraries in [compiler] for unrelated types.
-void checkRelatedTypes(Compiler compiler) {
-  compiler.closeResolution(
-      compiler.frontendStrategy.elementEnvironment.mainFunction);
-  for (LibraryElement library in compiler.libraryLoader.libraries) {
-    checkLibraryElement(compiler, library);
-  }
-}
-
-/// Check [library] for unrelated types.
-void checkLibraryElement(Compiler compiler, LibraryElement library) {
-  library.forEachLocalMember((Element element) {
-    if (element.isClass) {
-      ClassElement cls = element;
-      cls.forEachLocalMember((_member) {
-        MemberElement member = _member;
-        checkMemberElement(compiler, member);
-      });
-    } else if (!element.isTypedef) {
-      checkMemberElement(compiler, element);
-    }
-  });
-}
-
-/// Check [member] for unrelated types.
-void checkMemberElement(Compiler compiler, MemberElement member) {
-  if (!compiler.resolution.hasBeenResolved(member)) return;
-
-  ResolvedAst resolvedAst = member.resolvedAst;
-  if (resolvedAst.kind == ResolvedAstKind.PARSED) {
-    RelatedTypesChecker relatedTypesChecker =
-        new RelatedTypesChecker(compiler, resolvedAst);
-    compiler.reporter.withCurrentElement(member.implementation, () {
-      relatedTypesChecker.apply(resolvedAst.node);
-    });
-  }
-}
-
-class RelatedTypesChecker
-    extends TraversalVisitor<ResolutionDartType, dynamic> {
-  final Compiler compiler;
-  final ResolvedAst resolvedAst;
-
-  RelatedTypesChecker(this.compiler, ResolvedAst resolvedAst)
-      : this.resolvedAst = resolvedAst,
-        super(resolvedAst.elements);
-
-  ClosedWorld get world =>
-      compiler.resolutionWorldBuilder.closedWorldForTesting;
-
-  CommonElements get commonElements => compiler.resolution.commonElements;
-
-  DiagnosticReporter get reporter => compiler.reporter;
-
-  ResolutionInterfaceType get thisType =>
-      resolvedAst.element.enclosingClass.thisType;
-
-  /// Returns `true` if there exists no common subtype of [left] and [right].
-  bool hasEmptyIntersection(ResolutionDartType left, ResolutionDartType right) {
-    if (left == right) return false;
-    if (left == null || right == null) return false;
-    ClassElement leftClass = const ClassFinder().findClass(left);
-    ClassElement rightClass = const ClassFinder().findClass(right);
-    if (leftClass != null && rightClass != null) {
-      return !world.haveAnyCommonSubtypes(leftClass, rightClass);
-    }
-    return false;
-  }
-
-  /// Checks that there exists a common subtype of [left] and [right] or report
-  /// a hint otherwise.
-  void checkRelated(
-      Node node, ResolutionDartType left, ResolutionDartType right) {
-    if (hasEmptyIntersection(left, right)) {
-      reporter.reportHintMessage(
-          node, MessageKind.NO_COMMON_SUBTYPES, {'left': left, 'right': right});
-    }
-  }
-
-  /// Check weakly typed collection methods, like `Map.containsKey`,
-  /// `Map.containsValue` and `Iterable.contains`.
-  void checkDynamicInvoke(Node node, ResolutionDartType receiverType,
-      List<ResolutionDartType> argumentTypes, Selector selector) {
-    if (selector.name == 'containsKey' &&
-        selector.callStructure == CallStructure.ONE_ARG) {
-      ResolutionInterfaceType mapType = findMapType(receiverType);
-      if (mapType != null) {
-        ResolutionDartType keyType = findMapKeyType(mapType);
-        checkRelated(node, keyType, argumentTypes.first);
-      }
-    } else if (selector.name == 'containsValue' &&
-        selector.callStructure == CallStructure.ONE_ARG) {
-      ResolutionInterfaceType mapType = findMapType(receiverType);
-      if (mapType != null) {
-        ResolutionDartType valueType = findMapValueType(mapType);
-        checkRelated(node, valueType, argumentTypes.first);
-      }
-    } else if (selector.name == 'contains' &&
-        selector.callStructure == CallStructure.ONE_ARG) {
-      ResolutionInterfaceType iterableType = findIterableType(receiverType);
-      if (iterableType != null) {
-        ResolutionDartType elementType = findIterableElementType(iterableType);
-        checkRelated(node, elementType, argumentTypes.first);
-      }
-    } else if (selector.name == 'remove' &&
-        selector.callStructure == CallStructure.ONE_ARG) {
-      ResolutionInterfaceType mapType = findMapType(receiverType);
-      if (mapType != null) {
-        ResolutionDartType keyType = findMapKeyType(mapType);
-        checkRelated(node, keyType, argumentTypes.first);
-      }
-      ResolutionInterfaceType listType = findListType(receiverType);
-      if (listType != null) {
-        ResolutionDartType valueType = findListElementType(listType);
-        checkRelated(node, valueType, argumentTypes.first);
-      }
-    }
-  }
-
-  /// Return the interface type implemented by [type] or `null` if no interface
-  /// type is implied by [type].
-  ResolutionInterfaceType findInterfaceType(ResolutionDartType type) {
-    return Types.computeInterfaceType(compiler.resolution, type);
-  }
-
-  /// Returns the supertype of [receiver] that implements [cls], if any.
-  ResolutionInterfaceType findClassType(
-      ResolutionDartType receiver, ClassElement cls) {
-    ResolutionInterfaceType interfaceType = findInterfaceType(receiver);
-    if (interfaceType == null) return null;
-    ResolutionInterfaceType mapType = interfaceType.asInstanceOf(cls);
-    if (mapType == null) return null;
-    return mapType;
-  }
-
-  /// Returns the supertype of [receiver] that implements `Iterable`, if any.
-  ResolutionInterfaceType findIterableType(ResolutionDartType receiver) {
-    return findClassType(receiver, commonElements.iterableClass);
-  }
-
-  /// Returns the element type of the supertype of [receiver] that implements
-  /// `Iterable`, if any.
-  ResolutionDartType findIterableElementType(
-      ResolutionInterfaceType iterableType) {
-    if (iterableType == null) return null;
-    return iterableType.typeArguments[0];
-  }
-
-  /// Returns the supertype of [receiver] that implements `Map`, if any.
-  ResolutionInterfaceType findMapType(ResolutionDartType receiver) {
-    return findClassType(receiver, commonElements.mapClass);
-  }
-
-  /// Returns the key type of the supertype of [receiver] that implements
-  /// `Map`, if any.
-  ResolutionDartType findMapKeyType(ResolutionInterfaceType mapType) {
-    if (mapType == null) return null;
-    return mapType.typeArguments[0];
-  }
-
-  /// Returns the value type of the supertype of [receiver] that implements
-  /// `Map`, if any.
-  ResolutionDartType findMapValueType(ResolutionInterfaceType mapType) {
-    if (mapType == null) return null;
-    return mapType.typeArguments[1];
-  }
-
-  /// Returns the supertype of [receiver] that implements `List`, if any.
-  ResolutionInterfaceType findListType(ResolutionDartType receiver) {
-    return findClassType(receiver, commonElements.listClass);
-  }
-
-  /// Returns the element type of the supertype of [receiver] that implements
-  /// `List`, if any.
-  ResolutionDartType findListElementType(ResolutionInterfaceType listType) {
-    if (listType == null) return null;
-    return listType.typeArguments[0];
-  }
-
-  /// Returns the implied return type of [type] or `dynamic` if no return type
-  /// is implied.
-  ResolutionDartType findReturnType(ResolutionDartType type) {
-    if (type is ResolutionFunctionType) {
-      return type.returnType;
-    }
-    return const ResolutionDynamicType();
-  }
-
-  /// Visits [arguments] and returns the list of their corresponding types.
-  List<ResolutionDartType> findArgumentTypes(NodeList arguments) {
-    List<ResolutionDartType> argumentTypes = <ResolutionDartType>[];
-    for (Node argument in arguments) {
-      argumentTypes.add(apply(argument));
-    }
-    return argumentTypes;
-  }
-
-  /// Finds the [MemberSignature] of the [name] property on [type], if any.
-  MemberSignature lookupInterfaceMember(ResolutionDartType type, Name name) {
-    ResolutionInterfaceType interfaceType = findInterfaceType(type);
-    if (interfaceType == null) return null;
-    return interfaceType.lookupInterfaceMember(name);
-  }
-
-  /// Returns the type of an access of the [name] property on [type], or
-  /// `dynamic` if no property was found.
-  ResolutionDartType lookupInterfaceMemberAccessType(
-      ResolutionDartType type, Name name) {
-    MemberSignature member = lookupInterfaceMember(type, name);
-    if (member == null) return const ResolutionDynamicType();
-    return member.type;
-  }
-
-  /// Returns the function type of the [name] property on [type], or
-  /// `dynamic` if no property was found.
-  ResolutionFunctionType lookupInterfaceMemberInvocationType(
-      ResolutionDartType type, Name name) {
-    MemberSignature member = lookupInterfaceMember(type, name);
-    if (member == null) return null;
-    return member.functionType;
-  }
-
-  ResolutionDartType apply(Node node, [_]) {
-    ResolutionDartType type = node.accept(this);
-    if (type == null) {
-      type = const ResolutionDynamicType();
-    }
-    return type;
-  }
-
-  @override
-  ResolutionInterfaceType visitEquals(Send node, Node left, Node right, _) {
-    ResolutionDartType leftType = apply(left);
-    ResolutionDartType rightType = apply(right);
-    checkRelated(node, leftType, rightType);
-    return commonElements.boolType;
-  }
-
-  @override
-  ResolutionInterfaceType visitNotEquals(Send node, Node left, Node right, _) {
-    ResolutionDartType leftType = apply(left);
-    ResolutionDartType rightType = apply(right);
-    checkRelated(node, leftType, rightType);
-    return commonElements.boolType;
-  }
-
-  @override
-  ResolutionDartType visitIndex(Send node, Node receiver, Node index, _) {
-    ResolutionDartType receiverType = apply(receiver);
-    ResolutionDartType indexType = apply(index);
-    ResolutionInterfaceType mapType = findMapType(receiverType);
-    ResolutionDartType keyType = findMapKeyType(mapType);
-    ResolutionDartType valueType = findMapValueType(mapType);
-    checkRelated(index, keyType, indexType);
-    return valueType;
-  }
-
-  @override
-  ResolutionInterfaceType visitLiteralInt(LiteralInt node) {
-    return commonElements.intType;
-  }
-
-  @override
-  ResolutionInterfaceType visitLiteralString(LiteralString node) {
-    return commonElements.stringType;
-  }
-
-  @override
-  ResolutionInterfaceType visitLiteralBool(LiteralBool node) {
-    return commonElements.boolType;
-  }
-
-  @override
-  ResolutionDartType visitLiteralMap(LiteralMap node) {
-    return elements.getType(node);
-  }
-
-  @override
-  ResolutionDartType visitLiteralList(LiteralList node) {
-    return elements.getType(node);
-  }
-
-  @override
-  ResolutionDartType visitLiteralNull(LiteralNull node) {
-    return elements.getType(node);
-  }
-
-  @override
-  ResolutionDartType visitLocalVariableGet(
-      Send node, LocalVariableElement variable, _) {
-    return variable.type;
-  }
-
-  @override
-  ResolutionDartType visitLocalFunctionGet(
-      Send node, LocalFunctionElement function, _) {
-    return function.type;
-  }
-
-  @override
-  ResolutionDartType visitParameterGet(
-      Send node, ParameterElement parameter, _) {
-    return parameter.type;
-  }
-
-  @override
-  ResolutionDartType visitThisPropertyGet(Send node, Name name, _) {
-    return lookupInterfaceMemberAccessType(thisType, name);
-  }
-
-  @override
-  ResolutionDartType visitDynamicPropertyGet(
-      Send node, Node receiver, Name name, _) {
-    ResolutionDartType receiverType = apply(receiver);
-    return lookupInterfaceMemberAccessType(receiverType, name);
-  }
-
-  @override
-  ResolutionDartType visitIfNotNullDynamicPropertyGet(
-      Send node, Node receiver, Name name, _) {
-    ResolutionDartType receiverType = apply(receiver);
-    return lookupInterfaceMemberAccessType(receiverType, name);
-  }
-
-  @override
-  ResolutionDartType visitStaticFieldGet(Send node, FieldElement field, _) {
-    return field.type;
-  }
-
-  @override
-  ResolutionDartType visitTopLevelFieldGet(Send node, FieldElement field, _) {
-    return field.type;
-  }
-
-  @override
-  ResolutionDartType visitDynamicPropertyInvoke(
-      Send node, Node receiver, NodeList arguments, Selector selector, _) {
-    ResolutionDartType receiverType = apply(receiver);
-    List<ResolutionDartType> argumentTypes = findArgumentTypes(arguments);
-    ResolutionFunctionType methodType =
-        lookupInterfaceMemberInvocationType(receiverType, selector.memberName);
-    checkDynamicInvoke(node, receiverType, argumentTypes, selector);
-    return findReturnType(methodType);
-  }
-
-  @override
-  ResolutionDartType visitThisPropertyInvoke(
-      Send node, NodeList arguments, Selector selector, _) {
-    ResolutionDartType receiverType = thisType;
-    List<ResolutionDartType> argumentTypes = findArgumentTypes(arguments);
-    ResolutionFunctionType methodType =
-        lookupInterfaceMemberInvocationType(receiverType, selector.memberName);
-    checkDynamicInvoke(node, receiverType, argumentTypes, selector);
-    return findReturnType(methodType);
-  }
-
-  @override
-  ResolutionDartType visitIfNotNullDynamicPropertyInvoke(
-      Send node, Node receiver, NodeList arguments, Selector selector, _) {
-    ResolutionDartType receiverType = apply(receiver);
-    List<ResolutionDartType> argumentTypes = findArgumentTypes(arguments);
-    ResolutionFunctionType methodType =
-        lookupInterfaceMemberInvocationType(receiverType, selector.memberName);
-    checkDynamicInvoke(node, receiverType, argumentTypes, selector);
-    return findReturnType(methodType);
-  }
-
-  @override
-  ResolutionDartType visitTopLevelFunctionInvoke(
-      Send node,
-      MethodElement function,
-      NodeList arguments,
-      CallStructure callStructure,
-      _) {
-    apply(arguments);
-    return findReturnType(function.type);
-  }
-
-  @override
-  ResolutionDartType visitStaticFunctionInvoke(
-      Send node,
-      MethodElement function,
-      NodeList arguments,
-      CallStructure callStructure,
-      _) {
-    apply(arguments);
-    return findReturnType(function.type);
-  }
-}
-
-/// Computes the [ClassElement] implied by a type.
-// TODO(johnniwinther): Handle type variables, function types and typedefs.
-class ClassFinder extends BaseResolutionDartTypeVisitor<ClassElement, dynamic> {
-  const ClassFinder();
-
-  ClassElement findClass(ResolutionDartType type) => type.accept(this, null);
-
-  @override
-  ClassElement visitType(ResolutionDartType type, _) => null;
-
-  @override
-  ClassElement visitInterfaceType(ResolutionInterfaceType type, _) {
-    return type.element;
-  }
-}
diff --git a/tests/compiler/dart2js/old_frontend/related_types_test.dart b/tests/compiler/dart2js/old_frontend/related_types_test.dart
deleted file mode 100644
index 963afa2..0000000
--- a/tests/compiler/dart2js/old_frontend/related_types_test.dart
+++ /dev/null
@@ -1,300 +0,0 @@
-// Copyright (c) 2015, 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 related_types.test;
-
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.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/diagnostics/messages.dart';
-import 'package:compiler/src/elements/elements.dart';
-import '../memory_compiler.dart';
-
-import 'related_types.dart';
-
-const String CODE = '''
-Map<String, int> topLevelMap;
-List<String> topLevelList;
-
-Map<String, int> getTopLevelMap() => null;
-List<String> getTopLevelList() => null;
-
-class Class {
-  Map<String, int> instanceMap;
-  List<String> instanceList;
-
-  Map<String, int> getInstanceMap() => null;
-  List<String> getInstanceList() => null;
-
-  static Map<String, int> staticMap;
-  static List<String> staticList;
-
-  static Map<String, int> getStaticMap() => null;
-  static List<String> getStaticList() => null;
-  
-  test_instanceMapIndex() {
-    instanceMap[0];
-  }
-  test_instanceMapContainsKey() {
-    instanceMap.containsKey(0);
-  }
-  test_instanceMapContainsValue() {
-    instanceMap.containsValue('');
-  }
-  test_instanceMapRemove() {
-    instanceMap.remove(0);
-  }
-  test_instanceListContains() {
-    instanceList.contains(0);
-  }
-  test_instanceListRemove() {
-    instanceList.remove(0);
-  }
-  
-  test_getInstanceMapIndex() {
-    getInstanceMap()[0];
-  }
-  test_getInstanceMapContainsKey() {
-    getInstanceMap().containsKey(0);
-  }
-  test_getInstanceMapContainsValue() {
-    getInstanceMap().containsValue('');
-  }
-  test_getInstanceMapRemove() {
-    getInstanceMap().remove(0);
-  }
-  test_getInstanceListContains() {
-    getInstanceList().contains(0);
-  }
-  test_getInstanceListRemove() {
-    getInstanceList().remove(0);
-  }
-  
-  static test_staticMapIndex() {
-    staticMap[0];
-  }
-  static test_staticMapContainsKey() {
-    staticMap.containsKey(0);
-  }
-  static test_staticMapContainsValue() {
-    staticMap.containsValue('');
-  }
-  static test_staticMapRemove() {
-    staticMap.remove(0);
-  }
-  static test_staticListContains() {
-    staticList.contains(0);
-  }
-  static test_staticListRemove() {
-    staticList.remove(0);
-  }
-  
-  static test_getStaticMapIndex() {
-    getStaticMap()[0];
-  }
-  static test_getStaticMapContainsKey() {
-    getStaticMap().containsKey(0);
-  }
-  static test_getStaticMapContainsValue() {
-    getStaticMap().containsValue('');
-  }
-  static test_getStaticMapRemove() {
-    getStaticMap().remove(0);
-  }
-  static test_getStaticListContains() {
-    getStaticList().contains(0);
-  }
-  static test_getStaticListRemove() {
-    getStaticList().remove(0);
-  }
-}
-
-main() {}
-
-test_equals() => 0 == '';
-test_notEquals() => 0 != '';
-test_index() => <String, int>{}[0];
-
-test_localMapIndex() {
-  Map<String, int> map;
-  map[0];
-}
-test_localMapContainsKey() {
-  Map<String, int> map;
-  map.containsKey(0);
-}
-test_localMapContainsValue() {
-  Map<String, int> map;
-  map.containsValue('');
-}
-test_localMapRemove() {
-  Map<String, int> map;
-  map.remove(0);
-}
-test_localListContains() {
-  List<String> list;
-  list.contains(0);
-}
-test_localListRemove() {
-  List<String> list;
-  list.remove(0);
-}
-
-test_topLevelMapIndex() {
-  topLevelMap[0];
-}
-test_topLevelMapContainsKey() {
-  topLevelMap.containsKey(0);
-}
-test_topLevelMapContainsValue() {
-  topLevelMap.containsValue('');
-}
-test_topLevelMapRemove() {
-  topLevelMap.remove(0);
-}
-test_topLevelListContains() {
-  topLevelList.contains(0);
-}
-test_topLevelListRemove() {
-  topLevelList.remove(0);
-}
-
-test_getTopLevelMapIndex() {
-  getTopLevelMap()[0];
-}
-test_getTopLevelMapContainsKey() {
-  getTopLevelMap().containsKey(0);
-}
-test_getTopLevelMapContainsValue() {
-  getTopLevelMap().containsValue('');
-}
-test_getTopLevelMapRemove() {
-  getTopLevelMap().remove(0);
-}
-test_getTopLevelListContains() {
-  getTopLevelList().contains(0);
-}
-test_getTopLevelListRemove() {
-  getTopLevelList().remove(0);
-}
-
-test_staticMapIndex() {
-  Class.staticMap[0];
-}
-test_staticMapContainsKey() {
-  Class.staticMap.containsKey(0);
-}
-test_staticMapContainsValue() {
-  Class.staticMap.containsValue('');
-}
-test_staticMapRemove() {
-  Class.staticMap.remove(0);
-}
-test_staticListContains() {
-  Class.staticList.contains(0);
-}
-test_staticListRemove() {
-  Class.staticList.remove(0);
-}
-
-test_getStaticMapIndex() {
-  Class.getStaticMap()[0];
-}
-test_getStaticMapContainsKey() {
-  Class.getStaticMap().containsKey(0);
-}
-test_getStaticMapContainsValue() {
-  Class.getStaticMap().containsValue('');
-}
-test_getStaticMapRemove() {
-  Class.getStaticMap().remove(0);
-}
-test_getStaticListContains() {
-  Class.getStaticList().contains(0);
-}
-test_getStaticListRemove() {
-  Class.getStaticList().remove(0);
-}
-  
-test_instanceMapIndex(Class c) {
-  c.instanceMap[0];
-}
-test_instanceMapContainsKey(Class c) {
-  c.instanceMap.containsKey(0);
-}
-test_instanceMapContainsValue(Class c) {
-  c.instanceMap.containsValue('');
-}
-test_instanceMapRemove(Class c) {
-  c.instanceMap.remove(0);
-}
-test_instanceListContains(Class c) {
-  c.instanceList.contains(0);
-}
-test_instanceListRemove(Class c) {
-  c.instanceList.remove(0);
-}
-
-test_getInstanceMapIndex(Class c) {
-  c.getInstanceMap()[0];
-}
-test_getInstanceMapContainsKey(Class c) {
-  c.getInstanceMap().containsKey(0);
-}
-test_getInstanceMapContainsValue(Class c) {
-  c.getInstanceMap().containsValue('');
-}
-test_getInstanceMapRemove(Class c) {
-  c.getInstanceMap().remove(0);
-}
-test_getInstanceListContains(Class c) {
-  c.getInstanceList().contains(0);
-}
-test_getInstanceListRemove(Class c) {
-  c.getInstanceList().remove(0);
-}
-''';
-
-main(List<String> arguments) {
-  asyncTest(() async {
-    DiagnosticCollector collector = new DiagnosticCollector();
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': CODE},
-        options: [Flags.analyzeOnly, Flags.analyzeMain, Flags.useOldFrontend],
-        diagnosticHandler: collector);
-    Expect.isFalse(
-        collector.hasRegularMessages, "Unexpected analysis messages.");
-    Compiler compiler = result.compiler;
-    ElementEnvironment elementEnvironment =
-        compiler.frontendStrategy.elementEnvironment;
-    compiler.closeResolution(elementEnvironment.mainFunction);
-
-    void checkMember(Element element) {
-      MemberElement member = element;
-      if (!member.name.startsWith('test_')) return;
-
-      collector.clear();
-      checkMemberElement(compiler, member);
-      Expect.equals(
-          1, collector.hints.length, "Unexpected hint count for $member.");
-      Expect.equals(
-          MessageKind.NO_COMMON_SUBTYPES,
-          collector.hints.first.message.kind,
-          "Unexpected message kind ${collector.hints.first.message.kind} "
-          "for $member.");
-    }
-
-    LibraryElement mainApp = elementEnvironment.mainLibrary;
-    mainApp.forEachLocalMember((Element element) {
-      if (element.isClass) {
-        ClassElement cls = element;
-        cls.forEachLocalMember(checkMember);
-      } else {
-        checkMember(element);
-      }
-    });
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/resolution_test.dart b/tests/compiler/dart2js/old_frontend/resolution_test.dart
deleted file mode 100644
index ed0c2c9..0000000
--- a/tests/compiler/dart2js/old_frontend/resolution_test.dart
+++ /dev/null
@@ -1,124 +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.
-
-// Test that resolution does not resolve things we know will not be
-// needed by the backend.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'package:compiler/src/apiimpl.dart';
-import '../compiler_helper.dart';
-
-const String NO_RUNTIME_TYPE = r"""
-import 'dart:core' as prefix;
-class A {
-  A();
-  A.z();
-  static var bar;
-  static foo() {}
-}
-main() {
-  var print = prefix.print;
-  // Check when accessing a static field.
-  print(A.bar);
-  print(A.bar());
-  // Check when calling a static method.
-  print(A.foo());
-  print(A.foo);
-  // Check when using a constructor.
-  print(new A());
-  // Check when using a named constructor.
-  print(new A.z());
-  // Check when using a type annotation.
-  A a = new A();
-  // Check when using a prefix.
-  print(prefix.double.nan);
-  print(prefix.double.nan());
-  print(prefix.double.parse(''));
-  print(prefix.double.parse);
-  print(new prefix.DateTime(0));
-  print(new prefix.DateTime.utc(0));
-  prefix.DateTime c = new prefix.DateTime(0);
-  A.bar = 0;
-}
-""";
-
-const String HAS_RUNTIME_TYPE_1 = r"""
-class A {
-}
-main() {
-  print(A);
-}
-""";
-
-const String HAS_RUNTIME_TYPE_2 = r"""
-class A {
-}
-main() {
-  print(2 + A);
-}
-""";
-
-const String HAS_RUNTIME_TYPE_3 = r"""
-class A {
-}
-main() {
-  print(A[0]);
-}
-""";
-
-const String HAS_RUNTIME_TYPE_4 = r"""
-class A {
-}
-main() {
-  var c = A;
-}
-""";
-
-const String HAS_RUNTIME_TYPE_5 = r"""
-import 'dart:core' as prefix;
-main() {
-  prefix.print(prefix.Object);
-}
-""";
-
-const String HAS_RUNTIME_TYPE_6 = r"""
-class A {
-  static var foo;
-}
-main() {
-  (A).foo;
-}
-""";
-
-void test(String code, void check(CompilerImpl compiler)) {
-  Uri uri = new Uri(scheme: 'source');
-  dynamic compiler = mockCompilerFor(code, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        check(compiler);
-      }));
-}
-
-void testHasRuntimeType(String code) {
-  test(code, (compiler) {
-    var element = compiler.resolution.commonElements.createRuntimeType;
-    Expect.isTrue(
-        compiler.enqueuer.resolution.processedEntities.contains(element));
-  });
-}
-
-main() {
-  test(NO_RUNTIME_TYPE, (compiler) {
-    var element = compiler.resolution.commonElements.createRuntimeType;
-    Expect.isFalse(
-        compiler.enqueuer.resolution.processedEntities.contains(element));
-  });
-
-  testHasRuntimeType(HAS_RUNTIME_TYPE_1);
-  testHasRuntimeType(HAS_RUNTIME_TYPE_2);
-  testHasRuntimeType(HAS_RUNTIME_TYPE_3);
-  testHasRuntimeType(HAS_RUNTIME_TYPE_4);
-  testHasRuntimeType(HAS_RUNTIME_TYPE_5);
-  testHasRuntimeType(HAS_RUNTIME_TYPE_6);
-}
diff --git a/tests/compiler/dart2js/old_frontend/resolver_test.dart b/tests/compiler/dart2js/old_frontend/resolver_test.dart
deleted file mode 100644
index 41a7f81..0000000
--- a/tests/compiler/dart2js/old_frontend/resolver_test.dart
+++ /dev/null
@@ -1,1530 +0,0 @@
-// 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.
-
-import 'dart:async';
-import 'dart:collection';
-
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'package:compiler/src/constants/expressions.dart';
-import 'package:compiler/src/elements/modelx.dart';
-import 'package:compiler/src/elements/resolution_types.dart';
-import 'package:compiler/src/elements/types.dart';
-import 'package:compiler/src/resolution/constructors.dart';
-import 'package:compiler/src/resolution/members.dart';
-import 'package:compiler/src/resolution/registry.dart';
-import 'package:compiler/src/resolution/resolution_result.dart';
-import 'package:compiler/src/resolution/scope.dart';
-import 'package:compiler/src/resolution/tree_elements.dart';
-import 'package:compiler/src/universe/use.dart';
-import 'package:compiler/src/universe/world_impact.dart';
-
-import '../compiler_helper.dart';
-import '../link_helper.dart';
-import 'parser_helper.dart';
-
-Node buildIdentifier(String name) => new Identifier(scan(name));
-
-Node buildInitialization(String name) => parseBodyCode(
-    '$name = 1',
-    (parser, tokens) => parser.parseOptionallyInitializedIdentifier(
-        parser.syntheticPreviousToken(tokens)));
-
-createLocals(List variables) {
-  var locals = <Node>[];
-  for (final variable in variables) {
-    String name = variable[0];
-    bool init = variable[1];
-    if (init) {
-      locals.add(buildInitialization(name));
-    } else {
-      locals.add(buildIdentifier(name));
-    }
-  }
-  var definitions = new NodeList(null, LinkFromList(locals), null, null);
-  return new VariableDefinitions(null, Modifiers.EMPTY, definitions);
-}
-
-Future<MockCompiler> testLocals(List variables) {
-  return MockCompiler.create((MockCompiler compiler) {
-    ResolverVisitor visitor = compiler.resolverVisitor();
-    ResolutionResult result = visitor.visit(createLocals(variables));
-    // A VariableDefinitions does not have an element.
-    Expect.equals(const NoneResult(), result);
-    Expect.equals(variables.length, map(visitor).length);
-
-    for (final variable in variables) {
-      final name = variable[0];
-      Identifier id = buildIdentifier(name);
-      ResolutionResult result = visitor.visit(id);
-      final VariableElement variableElement = result.element;
-      MethodScope scope = visitor.scope;
-      Expect.equals(variableElement, scope.elements[name]);
-    }
-    return compiler;
-  });
-}
-
-main() {
-  asyncTest(() => Future.forEach([
-        testLocalsOne,
-        testLocalsTwo,
-        testLocalsThree,
-        testLocalsFour,
-        testLocalsFive,
-        testParametersOne,
-        testFor,
-        testTypeAnnotation,
-        testSuperclass,
-        // testVarSuperclass, // The parser crashes with 'class Foo extends var'.
-        // testOneInterface, // Generates unexpected error message.
-        // testTwoInterfaces, // Generates unexpected error message.
-        testFunctionExpression,
-        testNewExpression,
-        testTopLevelFields,
-        testClassHierarchy,
-        testEnumDeclaration,
-        testInitializers,
-        testThis,
-        testSuperCalls,
-        testSwitch,
-        testTypeVariables,
-        testToString,
-        testIndexedOperator,
-        testIncrementsAndDecrements,
-        testOverrideHashCodeCheck,
-        testSupertypeOrder,
-        testConstConstructorAndNonFinalFields,
-        testCantAssignMethods,
-        testCantAssignFinalAndConsts,
-        testAwaitHint,
-        testConstantExpressions,
-      ], (f) => f()));
-}
-
-Future testSupertypeOrder() {
-  return Future.wait([
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("""
-class I1 {}
-class I2 {}
-class J1 extends K1 {}
-class J2 implements K2 {}
-class K1 {}
-class K2 {}
-class L1 {}
-class A implements I1, I2 {}
-class B extends A implements J1, J2 {}
-class C extends B implements L1 {}
-""");
-      compiler.resolveStatement("C c;");
-      LibraryElement mainApp = compiler.mainApp;
-      ClassElement classA = mainApp.find("A");
-      ClassElement classB = mainApp.find("B");
-      ClassElement classC = mainApp.find("C");
-      Expect.equals('[ I2, I1, Object ]', classA.allSupertypes.toString());
-      Expect.equals('[ A, J2, J1, I2, I1, K2, K1, Object ]',
-          classB.allSupertypes.toString());
-      Expect.equals('[ B, L1, A, J2, J1, I2, I1, K2, K1, Object ]',
-          classC.allSupertypes.toString());
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("""
-class X<T> {}
-class Foo extends X<Foo> {}
-class Bar extends Foo implements X<Bar> {}
-""");
-      compiler.resolveStatement("Bar bar;");
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length);
-      Expect.equals(1, collector.errors.length);
-      Expect.equals(
-          MessageKind.MULTI_INHERITANCE, collector.errors.first.message.kind);
-      Expect.equals(0, collector.crashes.length);
-    }),
-  ]);
-}
-
-Future testTypeVariables() {
-  matchResolvedTypes(visitor, text, name, expectedElements) {
-    VariableDefinitions definition = parseStatement(text);
-    visitor.visit(definition.type);
-    ResolutionInterfaceType type =
-        visitor.registry.mapping.getType(definition.type);
-    NominalTypeAnnotation annotation = definition.type;
-    Expect.equals(
-        annotation.typeArguments.slowLength(), type.typeArguments.length);
-    int index = 0;
-    for (ResolutionDartType argument in type.typeArguments) {
-      Expect.equals(true, index < expectedElements.length);
-      Expect.equals(expectedElements[index], argument.element);
-      index++;
-    }
-    Expect.equals(index, expectedElements.length);
-  }
-
-  return Future.wait([
-    MockCompiler.create((MockCompiler compiler) {
-      ResolverVisitor visitor = compiler.resolverVisitor();
-      compiler.parseScript('class Foo<T, U> {}');
-      LibraryElement mainApp = compiler.mainApp;
-      ClassElement foo = mainApp.find('Foo');
-      matchResolvedTypes(visitor, 'Foo<int, String> x;', 'Foo', [
-        compiler.resolution.commonElements.intClass,
-        compiler.resolution.commonElements.stringClass
-      ]);
-      matchResolvedTypes(visitor, 'Foo<Foo, Foo> x;', 'Foo', [foo, foo]);
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript('class Foo<T, U> {}');
-      compiler.resolveStatement('Foo<notype, int> x;');
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(1, collector.warnings.length);
-      Expect.equals(MessageKind.CANNOT_RESOLVE_TYPE,
-          collector.warnings.first.message.kind);
-      Expect.equals(0, collector.errors.length);
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript('class Foo<T, U> {}');
-      compiler.resolveStatement('var x = new Foo<notype, int>();');
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(1, collector.warnings.length);
-      Expect.equals(0, collector.errors.length);
-      Expect.equals(MessageKind.CANNOT_RESOLVE_TYPE,
-          collector.warnings.first.message.kind);
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript('class Foo<T> {'
-          '  Foo<T> t;'
-          '  foo(Foo<T> f) {}'
-          '  bar() { g(Foo<T> f) {}; g(); }'
-          '}');
-      LibraryElement mainApp = compiler.mainApp;
-      ClassElement foo = mainApp.find('Foo');
-      foo.ensureResolved(compiler.resolution);
-      MemberElement tMember = foo.lookupLocalMember('t');
-      tMember.computeType(compiler.resolution);
-      MemberElement fooMember = foo.lookupLocalMember('foo');
-      fooMember.computeType(compiler.resolution);
-      compiler.resolver.resolve(foo.lookupLocalMember('bar'));
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length);
-      Expect.equals(0, collector.errors.length);
-    }),
-  ]);
-}
-
-Future testSuperCalls() {
-  return MockCompiler.create((MockCompiler compiler) {
-    String script = """class A { foo() {} }
-                       class B extends A { foo() => super.foo(); }""";
-    compiler.parseScript(script);
-    compiler.resolveStatement("B b;");
-
-    LibraryElement mainApp = compiler.mainApp;
-    ClassElement classB = mainApp.find("B");
-    FunctionElement fooB = classB.lookupLocalMember("foo");
-    ClassElement classA = mainApp.find("A");
-    FunctionElement fooA = classA.lookupLocalMember("foo");
-
-    ResolverVisitor visitor = new ResolverVisitor(
-        compiler.resolution,
-        fooB,
-        new ResolutionRegistry(
-            compiler.backend.target, new CollectingTreeElements(fooB)),
-        scope: new MockTypeVariablesScope(classB.buildScope()));
-    FunctionExpression node =
-        (fooB as FunctionElementX).parseNode(compiler.parsingContext);
-    visitor.visit(node.body);
-    Map mapping = map(visitor);
-
-    Send superCall = node.body.asReturn().expression;
-    FunctionElement called = mapping[superCall];
-    Expect.isNotNull(called);
-    Expect.equals(fooA, called);
-  });
-}
-
-Future testSwitch() {
-  return MockCompiler.create((MockCompiler compiler) {
-    compiler.parseScript("class Foo { foo() {"
-        "switch (null) { case '': break; case 2: break; } } }");
-    compiler.resolveStatement("Foo foo;");
-    LibraryElement mainApp = compiler.mainApp;
-    ClassElement fooElement = mainApp.find("Foo");
-    MethodElement funElement = fooElement.lookupLocalMember("foo");
-    compiler.enqueuer.resolution.applyImpact(new WorldImpactBuilderImpl()
-      ..registerStaticUse(new StaticUse.implicitInvoke(funElement)));
-    compiler.processQueue(compiler.frontendStrategy.elementEnvironment,
-        compiler.enqueuer.resolution, null, compiler.libraryLoader.libraries);
-    DiagnosticCollector collector = compiler.diagnosticCollector;
-    Expect.equals(0, collector.warnings.length);
-    Expect.equals(1, collector.errors.length);
-    Expect.equals(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL,
-        collector.errors.first.message.kind);
-    Expect.equals(2, collector.infos.length);
-    Expect.equals(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE,
-        collector.infos.first.message.kind);
-    Expect.equals(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE,
-        collector.infos.elementAt(1).message.kind);
-  });
-}
-
-Future testThis() {
-  return Future.wait([
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("class Foo { foo() { return this; } }");
-      compiler.resolveStatement("Foo foo;");
-      LibraryElement mainApp = compiler.mainApp;
-      ClassElement fooElement = mainApp.find("Foo");
-      FunctionElement funElement = fooElement.lookupLocalMember("foo");
-      ResolverVisitor visitor = new ResolverVisitor(
-          compiler.resolution,
-          funElement,
-          new ResolutionRegistry(
-              compiler.backend.target, new CollectingTreeElements(funElement)),
-          scope: new MockTypeVariablesScope(fooElement.buildScope()));
-      FunctionExpression function =
-          (funElement as FunctionElementX).parseNode(compiler.parsingContext);
-      visitor.visit(function.body);
-      Map mapping = map(visitor);
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, mapping.length);
-      Expect.equals(0, collector.warnings.length);
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.resolveStatement("main() { return this; }");
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length);
-      Expect.equals(1, collector.errors.length);
-      Expect.equals(MessageKind.NO_INSTANCE_AVAILABLE,
-          collector.errors.first.message.kind);
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("class Foo { static foo() { return this; } }");
-      compiler.resolveStatement("Foo foo;");
-      LibraryElement mainApp = compiler.mainApp;
-      ClassElement fooElement = mainApp.find("Foo");
-      FunctionElement funElement = fooElement.lookupLocalMember("foo");
-      ResolverVisitor visitor = new ResolverVisitor(
-          compiler.resolution,
-          funElement,
-          new ResolutionRegistry(
-              compiler.backend.target, new CollectingTreeElements(funElement)),
-          scope: new MockTypeVariablesScope(fooElement.buildScope()));
-      FunctionExpression function =
-          (funElement as FunctionElementX).parseNode(compiler.parsingContext);
-      visitor.visit(function.body);
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length);
-      Expect.equals(1, collector.errors.length);
-      Expect.equals(MessageKind.NO_INSTANCE_AVAILABLE,
-          collector.errors.first.message.kind);
-    }),
-  ]);
-}
-
-Future testLocalsOne() {
-  return Future.forEach([
-    () => testLocals([
-          ["foo", false]
-        ]),
-    () => testLocals([
-          ["foo", false],
-          ["bar", false]
-        ]),
-    () => testLocals([
-          ["foo", false],
-          ["bar", false],
-          ["foobar", false]
-        ]),
-    () => testLocals([
-          ["foo", true]
-        ]),
-    () => testLocals([
-          ["foo", false],
-          ["bar", true]
-        ]),
-    () => testLocals([
-          ["foo", true],
-          ["bar", true]
-        ]),
-    () => testLocals([
-          ["foo", false],
-          ["bar", false],
-          ["foobar", true]
-        ]),
-    () => testLocals([
-          ["foo", false],
-          ["bar", true],
-          ["foobar", true]
-        ]),
-    () => testLocals([
-          ["foo", true],
-          ["bar", true],
-          ["foobar", true]
-        ]),
-    () => testLocals([
-          ["foo", false],
-          ["foo", false]
-        ]).then((MockCompiler compiler) {
-          DiagnosticCollector collector = compiler.diagnosticCollector;
-          Expect.equals(1, collector.errors.length);
-          Expect.equals(
-              new Message(
-                  MessageTemplate.TEMPLATES[MessageKind.DUPLICATE_DEFINITION],
-                  {'name': 'foo'},
-                  false),
-              collector.errors.first.message);
-        })
-  ], (f) => f());
-}
-
-Future testLocalsTwo() {
-  return MockCompiler.create((MockCompiler compiler) {
-    ResolverVisitor visitor = compiler.resolverVisitor();
-    Node tree = parseStatement("if (true) { var a = 1; var b = 2; }");
-    ResolutionResult result = visitor.visit(tree);
-    Expect.equals(const NoneResult(), result);
-    MethodScope scope = visitor.scope;
-    Expect.equals(0, scope.elements.length);
-    Expect.equals(2, map(visitor).length);
-
-    List<Element> elements = new List<Element>.from(map(visitor).values);
-    Expect.notEquals(elements[0], elements[1]);
-  });
-}
-
-Future testLocalsThree() {
-  return MockCompiler.create((MockCompiler compiler) {
-    ResolverVisitor visitor = compiler.resolverVisitor();
-    Node tree = parseStatement("{ var a = 1; if (true) { a; } }");
-    ResolutionResult result = visitor.visit(tree);
-    Expect.equals(const NoneResult(), result);
-    MethodScope scope = visitor.scope;
-    Expect.equals(0, scope.elements.length);
-    Expect.equals(2, map(visitor).length);
-    List<Element> elements = map(visitor).values.toList();
-    Expect.equals(elements[0], elements[1]);
-  });
-}
-
-Future testLocalsFour() {
-  return MockCompiler.create((MockCompiler compiler) {
-    ResolverVisitor visitor = compiler.resolverVisitor();
-    Node tree = parseStatement("{ var a = 1; if (true) { var a = 1; } }");
-    ResolutionResult result = visitor.visit(tree);
-    Expect.equals(const NoneResult(), result);
-    MethodScope scope = visitor.scope;
-    Expect.equals(0, scope.elements.length);
-    Expect.equals(2, map(visitor).length);
-    List<Element> elements = map(visitor).values.toList();
-    Expect.notEquals(elements[0], elements[1]);
-  });
-}
-
-Future testLocalsFive() {
-  return MockCompiler.create((MockCompiler compiler) {
-    ResolverVisitor visitor = compiler.resolverVisitor();
-    If tree =
-        parseStatement("if (true) { var a = 1; a; } else { var a = 2; a;}");
-    ResolutionResult result = visitor.visit(tree);
-    Expect.equals(const NoneResult(), result);
-    MethodScope scope = visitor.scope;
-    Expect.equals(0, scope.elements.length);
-    Expect.equals(4, map(visitor).length);
-
-    Block thenPart = tree.thenPart;
-    List statements1 = thenPart.statements.nodes.toList();
-    Node def1 = statements1[0].definitions.nodes.head;
-    Node id1 = statements1[1].expression;
-    Expect.equals(
-        visitor.registry.mapping[def1], visitor.registry.mapping[id1]);
-
-    Block elsePart = tree.elsePart;
-    List statements2 = elsePart.statements.nodes.toList();
-    Node def2 = statements2[0].definitions.nodes.head;
-    Node id2 = statements2[1].expression;
-    Expect.equals(
-        visitor.registry.mapping[def2], visitor.registry.mapping[id2]);
-
-    Expect.notEquals(
-        visitor.registry.mapping[def1], visitor.registry.mapping[def2]);
-    Expect.notEquals(
-        visitor.registry.mapping[id1], visitor.registry.mapping[id2]);
-  });
-}
-
-Future testParametersOne() {
-  return MockCompiler.create((MockCompiler compiler) {
-    ResolverVisitor visitor = compiler.resolverVisitor();
-    FunctionExpression tree =
-        parseFunction("void foo(int a) { return a; }", compiler);
-    visitor.visit(tree);
-
-    // Check that an element has been created for the parameter.
-    VariableDefinitions vardef = tree.parameters.nodes.head;
-    Node param = vardef.definitions.nodes.head;
-    Expect.equals(ElementKind.PARAMETER, visitor.registry.mapping[param].kind);
-
-    // Check that 'a' in 'return a' is resolved to the parameter.
-    Block body = tree.body;
-    Return ret = body.statements.nodes.head;
-    Send use = ret.expression;
-    Expect.equals(ElementKind.PARAMETER, visitor.registry.mapping[use].kind);
-    Expect.equals(
-        visitor.registry.mapping[param], visitor.registry.mapping[use]);
-  });
-}
-
-Future testFor() {
-  return MockCompiler.create((MockCompiler compiler) {
-    ResolverVisitor visitor = compiler.resolverVisitor();
-    For tree = parseStatement("for (int i = 0; i < 10; i = i + 1) { i = 5; }");
-    visitor.visit(tree);
-
-    MethodScope scope = visitor.scope;
-    Expect.equals(0, scope.elements.length);
-    Expect.equals(5, map(visitor).length);
-
-    VariableDefinitions initializer = tree.initializer;
-    Node iNode = initializer.definitions.nodes.head;
-    Element iElement = visitor.registry.mapping[iNode];
-
-    // Check that we have the expected nodes. This test relies on the mapping
-    // field to be a linked hash map (preserving insertion order).
-    Expect.isTrue(map(visitor) is LinkedHashMap);
-    List<Node> nodes = map(visitor).keys.toList();
-    List<Element> elements = map(visitor).values.toList();
-
-    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-    //          ^^^^^
-    checkSendSet(iElement, nodes[0], elements[0]);
-
-    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-    //                 ^
-    checkSend(iElement, nodes[1], elements[1]);
-
-    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-    //                             ^
-    checkSend(iElement, nodes[2], elements[2]);
-
-    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-    //                         ^^^^^^^^^
-    checkSendSet(iElement, nodes[3], elements[3]);
-
-    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-    //                                      ^^^^^
-    checkSendSet(iElement, nodes[4], elements[4]);
-  });
-}
-
-checkIdentifier(Element expected, Node node, Element actual) {
-  Expect.isTrue(node is Identifier, node.toDebugString());
-  Expect.equals(expected, actual);
-}
-
-checkSend(Element expected, Node node, Element actual) {
-  Expect.isTrue(node is Send, node.toDebugString());
-  Expect.isTrue(node is! SendSet, node.toDebugString());
-  Expect.equals(expected, actual);
-}
-
-checkSendSet(Element expected, Node node, Element actual) {
-  Expect.isTrue(node is SendSet, node.toDebugString());
-  Expect.equals(expected, actual);
-}
-
-Future testTypeAnnotation() {
-  return MockCompiler.create((MockCompiler compiler) {
-    String statement = "Foo bar;";
-
-    // Test that we get a warning when Foo is not defined.
-    Map mapping = compiler.resolveStatement(statement).map;
-
-    Expect.equals(1, mapping.length); // Only [bar] has an element.
-    DiagnosticCollector collector = compiler.diagnosticCollector;
-    Expect.equals(1, collector.warnings.length);
-
-    Expect.equals(
-        new Message(MessageTemplate.TEMPLATES[MessageKind.CANNOT_RESOLVE_TYPE],
-            {'typeName': 'Foo'}, false),
-        collector.warnings.first.message);
-    collector.clear();
-
-    // Test that there is no warning after defining Foo.
-    compiler.parseScript("class Foo {}");
-    mapping = compiler.resolveStatement(statement).map;
-    Expect.equals(1, mapping.length);
-    Expect.equals(0, collector.warnings.length);
-
-    // Test that 'var' does not create a warning.
-    mapping = compiler.resolveStatement("var foo;").map;
-    Expect.equals(1, mapping.length);
-    Expect.equals(0, collector.warnings.length);
-  });
-}
-
-Future testSuperclass() {
-  return Future.wait([
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("class Foo extends Bar {}");
-      compiler.resolveStatement("Foo bar;");
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(1, collector.errors.length);
-      var cannotResolveBar = new Message(
-          MessageTemplate.TEMPLATES[MessageKind.CANNOT_EXTEND_MALFORMED],
-          {'className': 'Foo', 'malformedType': 'Bar'},
-          false);
-      Expect.equals(cannotResolveBar, collector.errors.first.message);
-      collector.clear();
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("class Foo extends Bar {}");
-      compiler.parseScript("class Bar {}");
-      Map mapping = compiler.resolveStatement("Foo bar;").map;
-      Expect.equals(1, mapping.length);
-
-      LibraryElement mainApp = compiler.mainApp;
-      ClassElement fooElement = mainApp.find('Foo');
-      ClassElement barElement = mainApp.find('Bar');
-      Expect.equals(
-          barElement.computeType(compiler.resolution), fooElement.supertype);
-      Expect.isTrue(fooElement.interfaces.isEmpty);
-      Expect.isTrue(barElement.interfaces.isEmpty);
-    }),
-  ]);
-}
-
-Future testVarSuperclass() {
-  return MockCompiler.create((MockCompiler compiler) {
-    compiler.parseScript("class Foo extends var {}");
-    compiler.resolveStatement("Foo bar;");
-    DiagnosticCollector collector = compiler.diagnosticCollector;
-    Expect.equals(1, collector.errors.length);
-    Expect.equals(
-        new Message(MessageTemplate.TEMPLATES[MessageKind.CANNOT_RESOLVE_TYPE],
-            {'typeName': 'var'}, false),
-        collector.errors.first.message);
-    collector.clear();
-  });
-}
-
-Future testOneInterface() {
-  return MockCompiler.create((MockCompiler compiler) {
-    compiler.parseScript("class Foo implements Bar {}");
-    compiler.resolveStatement("Foo bar;");
-    DiagnosticCollector collector = compiler.diagnosticCollector;
-    Expect.equals(1, collector.errors.length);
-    Expect.equals(
-        new Message(MessageTemplate.TEMPLATES[MessageKind.CANNOT_RESOLVE_TYPE],
-            {'typeName': 'bar'}, false),
-        collector.errors.first.message);
-    collector.clear();
-
-    // Add the abstract class to the world and make sure everything is setup
-    // correctly.
-    compiler.parseScript("abstract class Bar {}");
-
-    compiler.resolveStatement("Foo bar;");
-
-    LibraryElement mainApp = compiler.mainApp;
-    ClassElement fooElement = mainApp.find('Foo');
-    ClassElement barElement = mainApp.find('Bar');
-
-    Expect.equals(null, barElement.supertype);
-    Expect.isTrue(barElement.interfaces.isEmpty);
-
-    Expect.equals(barElement.computeType(compiler.resolution),
-        fooElement.interfaces.head);
-    Expect.equals(1, length(fooElement.interfaces));
-  });
-}
-
-Future testTwoInterfaces() {
-  return MockCompiler.create((MockCompiler compiler) {
-    compiler.parseScript("""abstract class I1 {}
-           abstract class I2 {}
-           class C implements I1, I2 {}""");
-    compiler.resolveStatement("Foo bar;");
-
-    LibraryElement mainApp = compiler.mainApp;
-    ClassElement c = mainApp.find('C');
-    ClassElement i1 = mainApp.find('I1');
-    ClassElement i2 = mainApp.find('I2');
-
-    Expect.equals(2, length(c.interfaces));
-    Expect.equals(i1.computeType(compiler.resolution), at(c.interfaces, 0));
-    Expect.equals(i2.computeType(compiler.resolution), at(c.interfaces, 1));
-  });
-}
-
-Future testFunctionExpression() {
-  return MockCompiler.create((MockCompiler compiler) {
-    var mapping = compiler.resolveStatement("int f() {}").map;
-    Expect.equals(2, mapping.length);
-    Element element;
-    Node node;
-    mapping.forEach((Node n, Element e) {
-      if (n is FunctionExpression) {
-        element = e;
-        node = n;
-      }
-    });
-    Expect.equals(ElementKind.FUNCTION, element.kind);
-    Expect.equals('f', element.name);
-    Expect.equals((element as FunctionElement).node, node);
-  });
-}
-
-Future testNewExpression() {
-  return MockCompiler.create((MockCompiler compiler) {
-    compiler.parseScript("class A {} foo() { print(new A()); }");
-    LibraryElement mainApp = compiler.mainApp;
-    ClassElement aElement = mainApp.find('A');
-
-    FunctionElement fooElement = mainApp.find('foo');
-    compiler.resolver.resolve(fooElement);
-
-    Expect.isNotNull(aElement);
-    Expect.isNotNull(fooElement);
-
-    fooElement.node;
-    compiler.resolver.resolve(fooElement);
-
-    TreeElements elements = compiler.resolveStatement("new A();");
-    NewExpression expression =
-        compiler.parsedTree.asExpressionStatement().expression;
-    Element element = elements[expression.send];
-    Expect.equals(ElementKind.GENERATIVE_CONSTRUCTOR, element.kind);
-    Expect.isTrue(element.isSynthesized);
-  });
-}
-
-Future testTopLevelFields() {
-  return MockCompiler.create((MockCompiler compiler) {
-    compiler.parseScript("int a;");
-    LibraryElement mainApp = compiler.mainApp;
-    VariableElementX element = mainApp.find("a");
-    Expect.equals(ElementKind.FIELD, element.kind);
-    VariableDefinitions node =
-        element.variables.parseNode(element, compiler.parsingContext);
-    NominalTypeAnnotation annotation = node.type;
-    Identifier typeName = annotation.typeName;
-    Expect.equals(typeName.source, 'int');
-
-    compiler.parseScript("var b, c;");
-    VariableElementX bElement = mainApp.find("b");
-    VariableElementX cElement = mainApp.find("c");
-    Expect.equals(ElementKind.FIELD, bElement.kind);
-    Expect.equals(ElementKind.FIELD, cElement.kind);
-    Expect.isTrue(bElement != cElement);
-
-    VariableDefinitions bNode =
-        bElement.variables.parseNode(bElement, compiler.parsingContext);
-    VariableDefinitions cNode =
-        cElement.variables.parseNode(cElement, compiler.parsingContext);
-    Expect.equals(bNode, cNode);
-    Expect.isNull(bNode.type);
-    Expect.isTrue(bNode.modifiers.isVar);
-  });
-}
-
-Future resolveConstructor(String script, String statement, String className,
-    String constructor, int expectedElementCount,
-    {List expectedWarnings: const [],
-    List expectedErrors: const [],
-    List expectedInfos: const [],
-    Map<String, String> corelib}) {
-  MockCompiler compiler = new MockCompiler.internal(coreSource: corelib);
-  return compiler.init().then((_) {
-    compiler.parseScript(script);
-    compiler.resolveStatement(statement);
-    LibraryElement mainApp = compiler.mainApp;
-    ClassElement classElement = mainApp.find(className);
-    Element element;
-    element = classElement.lookupConstructor(constructor);
-    FunctionExpression tree = (element as FunctionElement).node;
-    ResolverVisitor visitor = new ResolverVisitor(
-        compiler.resolution,
-        element,
-        new ResolutionRegistry(
-            compiler.backend.target, new CollectingTreeElements(element)),
-        scope: classElement.buildScope());
-    new InitializerResolver(visitor, element, tree).resolveInitializers();
-    visitor.visit(tree.body);
-    Expect.equals(expectedElementCount, map(visitor).length,
-        "${map(visitor).values} for '$statement' in context of `$script`");
-
-    DiagnosticCollector collector = compiler.diagnosticCollector;
-    compareWarningKinds(script, expectedWarnings, collector.warnings);
-    compareWarningKinds(script, expectedErrors, collector.errors);
-    compareWarningKinds(script, expectedInfos, collector.infos);
-  });
-}
-
-Future testClassHierarchy() {
-  final MAIN = "main";
-  return Future.wait([
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("""class A extends A {}
-                              main() { return new A(); }""");
-      LibraryElement mainApp = compiler.mainApp;
-      FunctionElement mainElement = mainApp.find(MAIN);
-      compiler.resolver.resolve(mainElement);
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length);
-      Expect.equals(1, collector.errors.length);
-      Expect.equals(MessageKind.CYCLIC_CLASS_HIERARCHY,
-          collector.errors.first.message.kind);
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("""class A extends B {}
-                              class B extends A {}
-                              main() { return new A(); }""");
-      LibraryElement mainApp = compiler.mainApp;
-      FunctionElement mainElement = mainApp.find(MAIN);
-      compiler.resolver.resolve(mainElement);
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length);
-      Expect.equals(2, collector.errors.length);
-      Expect.equals(MessageKind.CYCLIC_CLASS_HIERARCHY,
-          collector.errors.first.message.kind);
-      Expect.equals(MessageKind.CANNOT_FIND_UNNAMED_CONSTRUCTOR,
-          collector.errors.elementAt(1).message.kind);
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("""abstract class A extends B {}
-                              abstract class B extends A {}
-                              class C implements A {}
-                              main() { return new C(); }""");
-      LibraryElement mainApp = compiler.mainApp;
-      FunctionElement mainElement = mainApp.find(MAIN);
-      compiler.resolver.resolve(mainElement);
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length);
-      Expect.equals(1, collector.errors.length);
-      Expect.equals(MessageKind.CYCLIC_CLASS_HIERARCHY,
-          collector.errors.first.message.kind);
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("""class A extends B {}
-                              class B extends C {}
-                              class C {}
-                              main() { return new A(); }""");
-      LibraryElement mainApp = compiler.mainApp;
-      FunctionElement mainElement = mainApp.find(MAIN);
-      compiler.resolver.resolve(mainElement);
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length);
-      Expect.equals(0, collector.errors.length);
-      ClassElement aElement = mainApp.find("A");
-      Link<InterfaceType> supertypes = aElement.allSupertypes;
-      Expect.equals(<String>['B', 'C', 'Object'].toString(),
-          asSortedStrings(supertypes).toString());
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("""class A<T> {}
-                              class B<Z,W> extends A<int>
-                                  implements I<Z,List<W>> {}
-                              class I<X,Y> {}
-                              class C extends B<bool,String> {}
-                              main() { return new C(); }""");
-      LibraryElement mainApp = compiler.mainApp;
-      FunctionElement mainElement = mainApp.find(MAIN);
-      compiler.resolver.resolve(mainElement);
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length);
-      Expect.equals(0, collector.errors.length);
-      ClassElement aElement = mainApp.find("C");
-      Link<InterfaceType> supertypes = aElement.allSupertypes;
-      // Object is once per inheritance path, that is from both A and I.
-      Expect.equals(
-          <String>[
-            'A<int>',
-            'B<bool, String>',
-            'I<bool, List<String>>',
-            'Object'
-          ].toString(),
-          asSortedStrings(supertypes).toString());
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("""class A<T> {}
-                              class D extends A<E> {}
-                              class E extends D {}
-                              main() { return new E(); }""");
-      LibraryElement mainApp = compiler.mainApp;
-      FunctionElement mainElement = mainApp.find(MAIN);
-      compiler.resolver.resolve(mainElement);
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length);
-      Expect.equals(0, collector.errors.length);
-      ClassElement aElement = mainApp.find("E");
-      Link<InterfaceType> supertypes = aElement.allSupertypes;
-      Expect.equals(<String>['A<E>', 'D', 'Object'].toString(),
-          asSortedStrings(supertypes).toString());
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("""class A<T> {}
-                              class D extends A<int> implements A<double> {}
-                              main() { return new D(); }""");
-      LibraryElement mainApp = compiler.mainApp;
-      FunctionElement mainElement = mainApp.find(MAIN);
-      compiler.resolver.resolve(mainElement);
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length);
-      Expect.equals(1, collector.errors.length);
-      Expect.equals(
-          MessageKind.MULTI_INHERITANCE, collector.errors.first.message.kind);
-      Expect.equals(0, collector.crashes.length);
-    }),
-  ]);
-}
-
-Future testEnumDeclaration() {
-  final MAIN = "main";
-  return Future.wait([
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("""enum Enum {}
-                              main() { Enum e; }""");
-      LibraryElement mainApp = compiler.mainApp;
-      FunctionElement mainElement = mainApp.find(MAIN);
-      compiler.resolver.resolve(mainElement);
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length,
-          'Unexpected warnings: ${collector.warnings}');
-      Expect.equals(
-          1, collector.errors.length, 'Unexpected errors: ${collector.errors}');
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("""enum Enum { A }
-                              main() { Enum e = Enum.A; }""");
-      LibraryElement mainApp = compiler.mainApp;
-      FunctionElement mainElement = mainApp.find(MAIN);
-      compiler.resolver.resolve(mainElement);
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length,
-          'Unexpected warnings: ${collector.warnings}');
-      Expect.equals(
-          0, collector.errors.length, 'Unexpected errors: ${collector.errors}');
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("""enum Enum { A }
-                              main() { Enum e = Enum.B; }""");
-      LibraryElement mainApp = compiler.mainApp;
-      FunctionElement mainElement = mainApp.find(MAIN);
-      compiler.resolver.resolve(mainElement);
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(1, collector.warnings.length,
-          'Unexpected warnings: ${collector.warnings}');
-      Expect.equals(
-          MessageKind.UNDEFINED_GETTER, collector.warnings.first.message.kind);
-      Expect.equals(
-          0, collector.errors.length, 'Unexpected errors: ${collector.errors}');
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("""enum Enum { A }
-                              main() { List values = Enum.values; }""");
-      LibraryElement mainApp = compiler.mainApp;
-      FunctionElement mainElement = mainApp.find(MAIN);
-      compiler.resolver.resolve(mainElement);
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length,
-          'Unexpected warnings: ${collector.warnings}');
-      Expect.equals(
-          0, collector.errors.length, 'Unexpected errors: ${collector.errors}');
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("""enum Enum { A }
-                              main() { new Enum(0, ''); }""");
-      LibraryElement mainApp = compiler.mainApp;
-      FunctionElement mainElement = mainApp.find(MAIN);
-      compiler.resolver.resolve(mainElement);
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length,
-          'Unexpected warnings: ${collector.warnings}');
-      Expect.equals(
-          1, collector.errors.length, 'Unexpected errors: ${collector.errors}');
-      Expect.equals(MessageKind.CANNOT_INSTANTIATE_ENUM,
-          collector.errors.first.message.kind);
-    }),
-    MockCompiler.create((MockCompiler compiler) {
-      compiler.parseScript("""enum Enum { A }
-                              main() { const Enum(0, ''); }""");
-      LibraryElement mainApp = compiler.mainApp;
-      FunctionElement mainElement = mainApp.find(MAIN);
-      compiler.resolver.resolve(mainElement);
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length,
-          'Unexpected warnings: ${collector.warnings}');
-      Expect.equals(
-          1, collector.errors.length, 'Unexpected errors: ${collector.errors}');
-      Expect.equals(MessageKind.CANNOT_INSTANTIATE_ENUM,
-          collector.errors.first.message.kind);
-    }),
-  ]);
-}
-
-Future testInitializers() {
-  return Future.forEach([
-    () {
-      String script = """class A {
-                    int foo; int bar;
-                    A() : this.foo = 1, bar = 2;
-                  }""";
-      return resolveConstructor(script, "A a = new A();", "A", "", 2);
-    },
-    () {
-      String script = """class A {
-               int foo; A a;
-               A() : a.foo = 1;
-             }""";
-      return resolveConstructor(script, "A a = new A();", "A", "", 0,
-          expectedWarnings: [],
-          expectedErrors: [MessageKind.INVALID_RECEIVER_IN_INITIALIZER]);
-    },
-    () {
-      String script = """class A {
-               int foo;
-               A() : this.foo = 1, this.foo = 2;
-             }""";
-      return resolveConstructor(script, "A a = new A();", "A", "", 2,
-          expectedInfos: [MessageKind.ALREADY_INITIALIZED],
-          expectedErrors: [MessageKind.DUPLICATE_INITIALIZER]);
-    },
-    () {
-      String script = """class A {
-               A() : this.foo = 1;
-             }""";
-      return resolveConstructor(script, "A a = new A();", "A", "", 1,
-          expectedWarnings: [], expectedErrors: [MessageKind.CANNOT_RESOLVE]);
-    },
-    () {
-      String script = """class A {
-               int foo;
-               int bar;
-               A() : this.foo = bar;
-             }""";
-      return resolveConstructor(script, "A a = new A();", "A", "", 2,
-          expectedWarnings: [],
-          expectedErrors: [MessageKind.NO_INSTANCE_AVAILABLE]);
-    },
-    () {
-      String script = """class A {
-               int foo() => 42;
-               A() : foo();
-             }""";
-      return resolveConstructor(script, "A a = new A();", "A", "", 0,
-          expectedWarnings: [],
-          expectedErrors: [MessageKind.CONSTRUCTOR_CALL_EXPECTED]);
-    },
-    () {
-      String script = """class A {
-               int i;
-               A.a() : this.b(0);
-               A.b(int i);
-             }""";
-      return resolveConstructor(script, "A a = new A.a();", "A", "a", 1);
-    },
-    () {
-      String script = """class A {
-               int i;
-               A.a() : i = 42, this(0);
-               A(int i);
-             }""";
-      return resolveConstructor(script, "A a = new A.a();", "A", "a", 2,
-          expectedWarnings: [],
-          expectedErrors: [
-            MessageKind.REDIRECTING_CONSTRUCTOR_HAS_INITIALIZER
-          ]);
-    },
-    () {
-      String script = """class A {
-               int i;
-               A(i);
-             }
-             class B extends A {
-               B() : super(0);
-             }""";
-      return resolveConstructor(script, "B a = new B();", "B", "", 1);
-    },
-    () {
-      String script = """class A {
-               int i;
-               A(i);
-             }
-             class B extends A {
-               B() : super(0), super(1);
-             }""";
-      return resolveConstructor(script, "B b = new B();", "B", "", 2,
-          expectedWarnings: [],
-          expectedErrors: [MessageKind.DUPLICATE_SUPER_INITIALIZER]);
-    },
-    () {
-      String script = "";
-      final INVALID_OBJECT = const {
-        'Object': 'class Object { Object() : super(); }'
-      };
-      return resolveConstructor(
-          script, "Object o = new Object();", "Object", "", 1,
-          expectedWarnings: [],
-          expectedErrors: [MessageKind.SUPER_INITIALIZER_IN_OBJECT],
-          corelib: INVALID_OBJECT);
-    },
-  ], (f) => f());
-}
-
-Future testConstantExpressions() {
-  const Map<String, List<String>> testedConstants = const {
-    'null': const ['null'],
-    'true': const ['true'],
-    '0': const ['0'],
-    '0.0': const ['0.0'],
-    '"foo"': const ['"foo"'],
-    '#a': const ['#a'],
-    '0 + 1': const ['0', '1', '0 + 1'],
-    '0 * 1': const ['0', '1', '0 * 1'],
-    '0 * 1 + 2': const ['0', '1', '0 * 1', '2', '0 * 1 + 2'],
-    '0 + 1 * 2': const ['0', '1', '2', '1 * 2', '0 + 1 * 2'],
-    '-(1)': const ['1', '-1'],
-    '-(1 * 4)': const ['1', '4', '1 * 4', '-(1 * 4)'],
-    'true ? 0 : 1': const ['true', '0', '1', 'true ? 0 : 1'],
-    '"a" "b"': const ['"a"', '"b"', '"ab"'],
-    '"a" "b" "c"': const ['"a"', '"b"', '"c"', '"bc"', r'"a${"bc"}"'],
-    r'"a${0}b"': const ['"a"', '0', '"b"', r'"a${0}b"'],
-    r'"a${0}b${1}"': const ['"a"', '0', '"b"', '1', '""', r'"a${0}b${1}"'],
-    'true || false': const ['true', 'false', 'true || false'],
-    'true && false': const ['true', 'false', 'true && false'],
-    '!true': const ['true', '!true'],
-    'const []': const ['const []'],
-    'const <int>[]': const ['const <int>[]'],
-    'const [0, 1, 2]': const ['0', '1', '2', 'const [0, 1, 2]'],
-    'const <int>[0, 1, 2]': const ['0', '1', '2', 'const <int>[0, 1, 2]'],
-    'const {}': const ['const {}'],
-    'const <String, int>{}': const ['const <String, int>{}'],
-    'const {"a": 0, "b": 1, "c": 2}': const [
-      '"a"',
-      '0',
-      '"b"',
-      '1',
-      '"c"',
-      '2',
-      'const {"a": 0, "b": 1, "c": 2}'
-    ],
-    'const <String, int>{"a": 0, "b": 1, "c": 2}': const [
-      '"a"',
-      '0',
-      '"b"',
-      '1',
-      '"c"',
-      '2',
-      'const <String, int>{"a": 0, "b": 1, "c": 2}'
-    ],
-  };
-  return Future.forEach(testedConstants.keys, (String constant) {
-    return MockCompiler.create((MockCompiler compiler) {
-      CollectingTreeElements elements =
-          compiler.resolveStatement("main() => $constant;");
-      List<String> expectedConstants = testedConstants[constant];
-      DiagnosticCollector collector = compiler.diagnosticCollector;
-      Expect.equals(0, collector.warnings.length);
-      Expect.equals(0, collector.errors.length);
-      List<ConstantExpression> constants = elements.constants;
-      String constantsText =
-          '[${constants.map((c) => c.toDartText()).join(', ')}]';
-      Expect.equals(
-          expectedConstants.length,
-          constants.length,
-          "Expected ${expectedConstants.length} constants for `${constant}` "
-          "found $constantsText.");
-      for (int index = 0; index < expectedConstants.length; index++) {
-        Expect.equals(
-            expectedConstants[index],
-            constants[index].toDartText(),
-            "Expected ${expectedConstants} for `$constant`, "
-            "found $constantsText.");
-      }
-    });
-  });
-}
-
-map(ResolverVisitor visitor) {
-  CollectingTreeElements elements = visitor.registry.mapping;
-  return elements.map;
-}
-
-at(Link link, int index) => (index == 0) ? link.head : at(link.tail, index - 1);
-
-List<String> asSortedStrings(Link link) {
-  List<String> result = <String>[];
-  for (; !link.isEmpty; link = link.tail) result.add(link.head.toString());
-  result.sort((s1, s2) => s1.compareTo(s2));
-  return result;
-}
-
-Future compileScript(String source) {
-  Uri uri = new Uri(scheme: 'source');
-  MockCompiler compiler = mockCompilerFor(source, uri);
-  compiler.diagnosticHandler = createHandler(compiler, source);
-  return compiler.run(uri).then((_) {
-    return compiler;
-  });
-}
-
-checkMemberResolved(compiler, className, memberName) {
-  ClassElement cls = findElement(compiler, className);
-  MemberElement memberElement = cls.lookupLocalMember(memberName);
-  Expect.isNotNull(memberElement);
-  Expect.isTrue(compiler.resolutionWorldBuilder.isMemberUsed(memberElement));
-}
-
-testToString() {
-  final script = r"class C { toString() => 'C'; } main() { '${new C()}'; }";
-  asyncTest(() => compileScript(script).then((compiler) {
-        checkMemberResolved(compiler, 'C', 'toString');
-      }));
-}
-
-operatorName(op, isUnary) {
-  return Elements.constructOperatorName(op, isUnary);
-}
-
-testIndexedOperator() {
-  final script = r"""
-      class C {
-        operator[](ix) => ix;
-        operator[]=(ix, v) {}
-      }
-      main() { var c = new C(); c[0]++; }""";
-  asyncTest(() => compileScript(script).then((compiler) {
-        checkMemberResolved(compiler, 'C', operatorName('[]', false));
-        checkMemberResolved(compiler, 'C', operatorName('[]=', false));
-      }));
-}
-
-testIncrementsAndDecrements() {
-  final script = r"""
-      class A { operator+(o)=>null; }
-      class B { operator+(o)=>null; }
-      class C { operator-(o)=>null; }
-      class D { operator-(o)=>null; }
-      main() {
-        var a = new A();
-        a++;
-        var b = new B();
-        ++b;
-        var c = new C();
-        c--;
-        var d = new D();
-        --d;
-      }""";
-  asyncTest(() => compileScript(script).then((compiler) {
-        checkMemberResolved(compiler, 'A', operatorName('+', false));
-        checkMemberResolved(compiler, 'B', operatorName('+', false));
-        checkMemberResolved(compiler, 'C', operatorName('-', false));
-        checkMemberResolved(compiler, 'D', operatorName('-', false));
-      }));
-}
-
-testOverrideHashCodeCheck() {
-  final script = r"""
-      class A {
-        operator==(other) => true;
-      }
-      class B {
-        operator==(other) => true;
-        get hashCode => 0;
-      }
-      main() {
-        new A() == new B();
-      }""";
-  asyncTest(() => compileScript(script).then((compiler) {
-        DiagnosticCollector collector = compiler.diagnosticCollector;
-        Expect.equals(0, collector.warnings.length);
-        Expect.equals(0, collector.infos.length);
-        Expect.equals(1, collector.hints.length);
-        Expect.equals(MessageKind.OVERRIDE_EQUALS_NOT_HASH_CODE,
-            collector.hints.first.message.kind);
-        Expect.equals(0, collector.errors.length);
-      }));
-}
-
-testConstConstructorAndNonFinalFields() {
-  void expect(compiler, List errors, List infos) {
-    DiagnosticCollector collector = compiler.diagnosticCollector;
-    Expect.equals(errors.length, collector.errors.length);
-    for (int i = 0; i < errors.length; i++) {
-      Expect.equals(errors[i], collector.errors.elementAt(i).message.kind);
-    }
-    Expect.equals(0, collector.warnings.length);
-    Expect.equals(infos.length, collector.infos.length);
-    for (int i = 0; i < infos.length; i++) {
-      Expect.equals(infos[i], collector.infos.elementAt(i).message.kind);
-    }
-  }
-
-  final script1 = r"""
-      class A {
-        var a;
-        const A(this.a);
-      }
-      main() {
-        new A(0);
-      }""";
-  asyncTest(() => compileScript(script1).then((compiler) {
-        expect(compiler, [MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS],
-            [MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_FIELD]);
-      }));
-
-  final script2 = r"""
-      class A {
-        var a;
-        var b;
-        const A(this.a, this.b);
-        const A.named(this.a, this.b);
-      }
-      main() {
-        new A(0, 1);
-      }""";
-  asyncTest(() => compileScript(script2).then((compiler) {
-        expect(compiler, [
-          MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS
-        ], [
-          MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_CONSTRUCTOR,
-          MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_CONSTRUCTOR,
-          MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_FIELD,
-          MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_FIELD
-        ]);
-      }));
-}
-
-testCantAssignMethods() {
-  // Can't override local functions
-  checkWarningOn('''
-      main() {
-        mname() { mname = 2; };
-        mname();
-      }
-      ''', [MessageKind.ASSIGNING_METHOD]);
-
-  checkWarningOn('''
-      main() {
-        mname() { };
-        mname = 3;
-      }
-      ''', [MessageKind.ASSIGNING_METHOD]);
-
-  // Can't override top-level functions
-  checkWarningOn('''
-      m() {}
-      main() { m = 4; }
-      ''', [
-    MessageKind.ASSIGNING_METHOD,
-    // TODO(johnniwinther): Avoid duplicate warnings.
-    MessageKind.NOT_ASSIGNABLE
-  ]);
-
-  // Can't override instance methods
-  checkWarningOn('''
-      main() { new B().bar(); }
-      class B {
-        mname() {}
-        bar() {
-          mname = () => null;
-        }
-      }
-      ''', [MessageKind.UNDEFINED_SETTER]);
-  checkWarningOn('''
-      main() { new B().bar(); }
-      class B {
-        mname() {}
-        bar() {
-          this.mname = () => null;
-        }
-      }
-      ''', [MessageKind.UNDEFINED_SETTER]);
-
-  // Can't override super methods
-  checkWarningOn('''
-      main() { new B().bar(); }
-      class A {
-        mname() {}
-      }
-      class B extends A {
-        bar() {
-          super.mname = () => 6;
-        }
-      }
-      ''', [
-    MessageKind.ASSIGNING_METHOD_IN_SUPER,
-    // TODO(johnniwinther): Avoid duplicate warnings.
-    MessageKind.UNDEFINED_SETTER
-  ]);
-
-  // But index operators should be OK
-  checkWarningOn('''
-      main() { new B().bar(); }
-      class B {
-        operator[]=(x, y) {}
-        bar() {
-          this[1] = 3; // This is OK
-        }
-      }
-      ''', []);
-  checkWarningOn('''
-      main() { new B().bar(); }
-      class A {
-        operator[]=(x, y) {}
-      }
-      class B extends A {
-        bar() {
-          super[1] = 3; // This is OK
-        }
-      }
-      ''', []);
-}
-
-testCantAssignFinalAndConsts() {
-  // Can't write final or const locals.
-  checkWarningOn('''
-      main() {
-        final x = 1;
-        x = 2;
-      }
-      ''', [MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER]);
-  checkWarningOn('''
-      main() {
-        const x = 1;
-        x = 2;
-      }
-      ''', [MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER]);
-  checkWarningOn('''
-      final x = 1;
-      main() { x = 3; }
-      ''', [MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER]);
-
-  checkWarningOn('''
-      const x = 1;
-      main() { x = 3; }
-      ''', [MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER]);
-
-  // Detect assignments to final fields:
-  checkWarningOn('''
-      main() => new B().m();
-      class B {
-        final x = 1;
-        m() { x = 2; }
-      }
-      ''', [MessageKind.UNDEFINED_SETTER]);
-
-  // ... even if 'this' is explicit:
-  checkWarningOn('''
-      main() => new B().m();
-      class B {
-        final x = 1;
-        m() { this.x = 2; }
-      }
-      ''', [MessageKind.UNDEFINED_SETTER]);
-
-  // ... and in super class:
-  checkWarningOn('''
-      main() => new B().m();
-      class A {
-        final x = 1;
-      }
-      class B extends A {
-        m() { super.x = 2; }
-      }
-      ''', [
-    MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER,
-    // TODO(johnniwinther): Avoid duplicate warnings.
-    MessageKind.UNDEFINED_SETTER
-  ]);
-
-  // But non-final fields are OK:
-  checkWarningOn('''
-      main() => new B().m();
-      class A {
-        int x = 1;
-      }
-      class B extends A {
-        m() { super.x = 2; }
-      }
-      ''', []);
-
-  // Check getter without setter.
-  checkWarningOn('''
-      main() => new B().m();
-      class A {
-        get x => 1;
-      }
-      class B extends A {
-        m() { super.x = 2; }
-      }
-      ''', [
-    MessageKind.UNDEFINED_SUPER_SETTER,
-    // TODO(johnniwinther): Avoid duplicate warnings.
-    MessageKind.UNDEFINED_SETTER
-  ]);
-}
-
-/// Helper to test that [script] produces all the given [warnings].
-checkWarningOn(String script, List<MessageKind> warnings) {
-  Expect.isTrue(warnings.length >= 0 && warnings.length <= 2);
-  asyncTest(() => compileScript(script).then((compiler) {
-        DiagnosticCollector collector = compiler.diagnosticCollector;
-        Expect.equals(0, collector.errors.length,
-            'Unexpected errors in\n$script\n${collector.errors}');
-        Expect.equals(
-            warnings.length,
-            collector.warnings.length,
-            'Unexpected warnings in\n$script\n'
-            'Expected:$warnings\nFound:${collector.warnings}');
-        for (int i = 0; i < warnings.length; i++) {
-          Expect.equals(
-              warnings[i], collector.warnings.elementAt(i).message.kind);
-        }
-      }));
-}
-
-testAwaitHint() {
-  check(String script, {String className, String functionName}) {
-    var prefix = className == null
-        ? "Cannot resolve 'await'"
-        : "No member named 'await' in class '$className'";
-    var where =
-        functionName == null ? 'the enclosing function' : "'$functionName'";
-    asyncTest(() => compileScript(script).then((compiler) {
-          DiagnosticCollector collector = compiler.diagnosticCollector;
-          Expect.equals(0, collector.errors.length);
-          Expect.equals(1, collector.warnings.length);
-          Expect.equals(
-              "$prefix.\n"
-              "Did you mean to add the 'async' marker to $where?",
-              '${collector.warnings.first.message}');
-        }));
-  }
-
-  check('main() { await -3; }', functionName: 'main');
-  check('main() { () => await -3; }');
-  check('foo() => await -3; main() => foo();', functionName: 'foo');
-  check('''
-    class A {
-      m() => await - 3;
-    }
-    main() => new A().m();
-  ''', className: 'A', functionName: 'm');
-  check('''
-    class A {
-      static m() => await - 3;
-    }
-    main() => A.m();
-  ''', functionName: 'm');
-  check('''
-    class A {
-      m() => () => await - 3;
-    }
-    main() => new A().m();
-  ''', className: 'A');
-}
diff --git a/tests/compiler/dart2js/old_frontend/scanner_offset_length_test.dart b/tests/compiler/dart2js/old_frontend/scanner_offset_length_test.dart
deleted file mode 100644
index fe30615..0000000
--- a/tests/compiler/dart2js/old_frontend/scanner_offset_length_test.dart
+++ /dev/null
@@ -1,50 +0,0 @@
-// 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.
-
-import "package:expect/expect.dart";
-import 'package:front_end/src/fasta/scanner.dart';
-
-Token scan(String text) =>
-    new StringScanner(text, includeComments: true).tokenize();
-
-check(String text) {
-  Token token = scan(text);
-  while (token.kind != EOF_TOKEN) {
-    Expect.equals(token.lexeme.length, token.charCount);
-
-    var start = token.charOffset;
-    var end = token.charOffset + token.charCount;
-
-    Expect.isTrue(start < text.length,
-        'start=$start < text.length=${text.length}: $text');
-
-    Expect.isTrue(
-        end <= text.length, 'end=$end <= text.length=${text.length}: $text');
-
-    Expect.isTrue(start <= end, 'start=$end <= end=$end: $text');
-
-    var substring = text.substring(start, end);
-
-    Expect.stringEquals(
-        token.lexeme,
-        substring,
-        'token.value=${token.lexeme} == '
-        'text.substring(start,end)=${substring}: $text');
-
-    print('$text: [$start,$end]:$token');
-
-    token = token.next;
-  }
-}
-
-main() {
-  check('foo'); // identifier
-  check('\'\''); // empty string
-  check('\'foo\''); // simple string
-  check('\'\$foo\''); // interpolation, identifier
-  check('\'\${foo}\''); // interpolation, expression
-
-  check('//'); // single line comment
-  check('/**/'); // multi line comment
-}
diff --git a/tests/compiler/dart2js/old_frontend/scanner_test.dart b/tests/compiler/dart2js/old_frontend/scanner_test.dart
deleted file mode 100644
index 9cd8ba1..0000000
--- a/tests/compiler/dart2js/old_frontend/scanner_test.dart
+++ /dev/null
@@ -1,210 +0,0 @@
-// 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.
-
-import "package:expect/expect.dart";
-import 'package:front_end/src/fasta/scanner.dart';
-import 'package:front_end/src/fasta/scanner/characters.dart';
-import 'package:front_end/src/scanner/token.dart' show TokenType;
-import 'dart:typed_data';
-
-Token scan(List<int> bytes) {
-  List<int> zeroTerminated = new Uint8List(bytes.length + 1);
-  zeroTerminated.setRange(0, bytes.length, bytes);
-  zeroTerminated[bytes.length] = 0;
-  return new Utf8BytesScanner(zeroTerminated).tokenize();
-}
-
-Token scanUTF8(List<int> bytes) {
-  int l = bytes.length;
-  List<int> stringLiteral = new Uint8List(l + 3);
-  stringLiteral[0] = 0x27; // single quote
-  stringLiteral[l + 1] = 0x27; // single quote
-  // The bytes given to the scanner must be 0-terminated.
-  stringLiteral[l + 2] = $EOF;
-  for (int i = 0; i < l; i++) {
-    stringLiteral[i + 1] = bytes[i];
-  }
-  return new Utf8BytesScanner(stringLiteral).tokenize();
-}
-
-bool isRunningOnJavaScript() => identical(1, 1.0);
-
-main() {
-  // Google favorite: "Îñţérñåţîöñåļîžåţîờñ".
-  Token token = scanUTF8([
-    0xc3,
-    0x8e,
-    0xc3,
-    0xb1,
-    0xc5,
-    0xa3,
-    0xc3,
-    0xa9,
-    0x72,
-    0xc3,
-    0xb1,
-    0xc3,
-    0xa5,
-    0xc5,
-    0xa3,
-    0xc3,
-    0xae,
-    0xc3,
-    0xb6,
-    0xc3,
-    0xb1,
-    0xc3,
-    0xa5,
-    0xc4,
-    0xbc,
-    0xc3,
-    0xae,
-    0xc5,
-    0xbe,
-    0xc3,
-    0xa5,
-    0xc5,
-    0xa3,
-    0xc3,
-    0xae,
-    0xe1,
-    0xbb,
-    0x9d,
-    0xc3,
-    0xb1
-  ]);
-  Expect.stringEquals("'Îñţérñåţîöñåļîžåţîờñ'", token.lexeme);
-
-  // Blueberry porridge in Danish: "blåbærgrød".
-  token = scanUTF8([
-    0x62,
-    0x6c,
-    0xc3,
-    0xa5,
-    0x62,
-    0xc3,
-    0xa6,
-    0x72,
-    0x67,
-    0x72,
-    0xc3,
-    0xb8,
-    0x64
-  ]);
-  Expect.stringEquals("'blåbærgrød'", token.lexeme);
-
-  // "சிவா அணாமாைல", that is "Siva Annamalai" in Tamil.
-  token = scanUTF8([
-    0xe0,
-    0xae,
-    0x9a,
-    0xe0,
-    0xae,
-    0xbf,
-    0xe0,
-    0xae,
-    0xb5,
-    0xe0,
-    0xae,
-    0xbe,
-    0x20,
-    0xe0,
-    0xae,
-    0x85,
-    0xe0,
-    0xae,
-    0xa3,
-    0xe0,
-    0xae,
-    0xbe,
-    0xe0,
-    0xae,
-    0xae,
-    0xe0,
-    0xae,
-    0xbe,
-    0xe0,
-    0xaf,
-    0x88,
-    0xe0,
-    0xae,
-    0xb2
-  ]);
-  Expect.stringEquals("'சிவா அணாமாைல'", token.lexeme);
-
-  // "िसवा अणामालै", that is "Siva Annamalai" in Devanagari.
-  token = scanUTF8([
-    0xe0,
-    0xa4,
-    0xbf,
-    0xe0,
-    0xa4,
-    0xb8,
-    0xe0,
-    0xa4,
-    0xb5,
-    0xe0,
-    0xa4,
-    0xbe,
-    0x20,
-    0xe0,
-    0xa4,
-    0x85,
-    0xe0,
-    0xa4,
-    0xa3,
-    0xe0,
-    0xa4,
-    0xbe,
-    0xe0,
-    0xa4,
-    0xae,
-    0xe0,
-    0xa4,
-    0xbe,
-    0xe0,
-    0xa4,
-    0xb2,
-    0xe0,
-    0xa5,
-    0x88
-  ]);
-  Expect.stringEquals("'िसवा अणामालै'", token.lexeme);
-
-  if (!isRunningOnJavaScript()) {
-    // DESERET CAPITAL LETTER BEE, unicode 0x10412(0xD801+0xDC12)
-    // UTF-8: F0 90 90 92
-    token = scanUTF8([0xf0, 0x90, 0x90, 0x92]);
-    Expect.stringEquals("'𐐒'", token.lexeme);
-  } else {
-    print('Skipping non-BMP character test');
-  }
-
-  // Regression test for issue 1761.
-  // "#!"
-  token = scan([0x23, 0x21]);
-  Expect.equals(token.type, TokenType.SCRIPT_TAG); // Treated as a comment.
-
-  // Regression test for issue 1761.
-  // "#! Hello, World!"
-  token = scan([
-    0x23,
-    0x21,
-    0x20,
-    0x48,
-    0x65,
-    0x6c,
-    0x6c,
-    0x6f,
-    0x2c,
-    0x20,
-    0x57,
-    0x6f,
-    0x72,
-    0x6c,
-    0x64,
-    0x21
-  ]);
-  Expect.equals(token.type, TokenType.SCRIPT_TAG); // Treated as a comment.
-}
diff --git a/tests/compiler/dart2js/old_frontend/semantic_visitor_test.dart b/tests/compiler/dart2js/old_frontend/semantic_visitor_test.dart
deleted file mode 100644
index 3ce95aa..0000000
--- a/tests/compiler/dart2js/old_frontend/semantic_visitor_test.dart
+++ /dev/null
@@ -1,732 +0,0 @@
-// Copyright (c) 2015, 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 dart2js.semantics_visitor_test;
-
-import 'dart:async';
-import 'dart:mirrors';
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/constants/expressions.dart';
-import 'package:compiler/src/diagnostics/spannable.dart';
-import 'package:compiler/src/diagnostics/messages.dart' show MessageKind;
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/elements/elements.dart';
-import 'package:compiler/src/elements/names.dart';
-import 'package:compiler/src/elements/operators.dart';
-import 'package:compiler/src/elements/resolution_types.dart';
-import 'package:compiler/src/resolution/semantic_visitor.dart';
-import 'package:compiler/src/resolution/tree_elements.dart';
-import 'package:compiler/src/tree/tree.dart';
-import 'package:compiler/src/universe/call_structure.dart' show CallStructure;
-import 'package:compiler/src/universe/selector.dart' show Selector;
-import '../memory_compiler.dart';
-
-part 'semantic_visitor_test_send_data.dart';
-part 'semantic_visitor_test_send_visitor.dart';
-part 'semantic_visitor_test_decl_data.dart';
-part 'semantic_visitor_test_decl_visitor.dart';
-
-class Visit {
-  final VisitKind method;
-  final element;
-  final rhs;
-  final arguments;
-  final receiver;
-  final name;
-  final expression;
-  final left;
-  final right;
-  final type;
-  final operator;
-  final index;
-  final getter;
-  final setter;
-  final constant;
-  final selector;
-  final parameters;
-  final body;
-  final target;
-  final targetType;
-  final initializers;
-  final error;
-
-  const Visit(this.method,
-      {this.element,
-      this.rhs,
-      this.arguments,
-      this.receiver,
-      this.name,
-      this.expression,
-      this.left,
-      this.right,
-      this.type,
-      this.operator,
-      this.index,
-      this.getter,
-      this.setter,
-      this.constant,
-      this.selector,
-      this.parameters,
-      this.body,
-      this.target,
-      this.targetType,
-      this.initializers,
-      this.error});
-
-  int get hashCode => toString().hashCode;
-
-  bool operator ==(other) => '$this' == '$other';
-
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write('method=$method');
-    if (element != null) {
-      sb.write(',element=$element');
-    }
-    if (rhs != null) {
-      sb.write(',rhs=$rhs');
-    }
-    if (arguments != null) {
-      sb.write(',arguments=$arguments');
-    }
-    if (receiver != null) {
-      sb.write(',receiver=$receiver');
-    }
-    if (name != null) {
-      sb.write(',name=$name');
-    }
-    if (expression != null) {
-      sb.write(',expression=$expression');
-    }
-    if (left != null) {
-      sb.write(',left=$left');
-    }
-    if (right != null) {
-      sb.write(',right=$right');
-    }
-    if (type != null) {
-      sb.write(',type=$type');
-    }
-    if (operator != null) {
-      sb.write(',operator=$operator');
-    }
-    if (index != null) {
-      sb.write(',index=$index');
-    }
-    if (getter != null) {
-      sb.write(',getter=$getter');
-    }
-    if (setter != null) {
-      sb.write(',setter=$setter');
-    }
-    if (constant != null) {
-      sb.write(',constant=$constant');
-    }
-    if (selector != null) {
-      sb.write(',selector=$selector');
-    }
-    if (parameters != null) {
-      sb.write(',parameters=$parameters');
-    }
-    if (body != null) {
-      sb.write(',body=$body');
-    }
-    if (target != null) {
-      sb.write(',target=$target');
-    }
-    if (targetType != null) {
-      sb.write(',targetType=$targetType');
-    }
-    if (initializers != null) {
-      sb.write(',initializers=$initializers');
-    }
-    if (error != null) {
-      sb.write(',error=$error');
-    }
-    return sb.toString();
-  }
-}
-
-class Test {
-  final String codeByPrefix;
-  final bool isDeferred;
-  final String code;
-  final /*Visit | List<Visit>*/ expectedVisits;
-  final String cls;
-  final String method;
-
-  const Test(this.code, this.expectedVisits)
-      : cls = null,
-        method = 'm',
-        codeByPrefix = null,
-        isDeferred = false;
-  const Test.clazz(this.code, this.expectedVisits,
-      {this.cls: 'C', this.method: 'm'})
-      : codeByPrefix = null,
-        isDeferred = false;
-  const Test.prefix(this.codeByPrefix, this.code, this.expectedVisits,
-      {this.isDeferred: false})
-      : cls = null,
-        method = 'm';
-
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.writeln();
-    sb.writeln(code);
-    if (codeByPrefix != null) {
-      sb.writeln('imported by prefix:');
-      sb.writeln(codeByPrefix);
-    }
-    return sb.toString();
-  }
-}
-
-const List<VisitKind> UNTESTABLE_KINDS = const <VisitKind>[
-  // A final field shadowing a non-final field is currently not supported in
-  // resolution.
-  VisitKind.VISIT_SUPER_FIELD_FIELD_COMPOUND,
-  VisitKind.VISIT_SUPER_FIELD_FIELD_SET_IF_NULL,
-  VisitKind.VISIT_SUPER_FIELD_FIELD_PREFIX,
-  VisitKind.VISIT_SUPER_FIELD_FIELD_POSTFIX,
-  // Combination of method and setter with the same name is currently not
-  // supported by the element model.
-  VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND,
-  VisitKind.VISIT_STATIC_METHOD_SETTER_SET_IF_NULL,
-  VisitKind.VISIT_STATIC_METHOD_SETTER_PREFIX,
-  VisitKind.VISIT_STATIC_METHOD_SETTER_POSTFIX,
-  VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_COMPOUND,
-  VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_SET_IF_NULL,
-  VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_PREFIX,
-  VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_POSTFIX,
-  VisitKind.VISIT_SUPER_METHOD_SETTER_COMPOUND,
-  VisitKind.VISIT_SUPER_METHOD_SETTER_SET_IF_NULL,
-  VisitKind.VISIT_SUPER_METHOD_SETTER_PREFIX,
-  VisitKind.VISIT_SUPER_METHOD_SETTER_POSTFIX,
-  // The only undefined unary, `+`, is currently handled and skipped in the
-  // parser.
-  VisitKind.ERROR_UNDEFINED_UNARY_EXPRESSION,
-  // Constant expression are currently not computed during resolution.
-  VisitKind.VISIT_CONSTANT_GET,
-  VisitKind.VISIT_CONSTANT_INVOKE,
-];
-
-main(List<String> arguments) {
-  Set<VisitKind> kinds = new Set<VisitKind>.from(VisitKind.values);
-  asyncTest(() => Future.forEach([
-        () {
-          return test(kinds, arguments, SEND_TESTS,
-              (elements) => new SemanticSendTestVisitor(elements));
-        },
-        () {
-          return test(kinds, arguments, DECL_TESTS,
-              (elements) => new SemanticDeclarationTestVisitor(elements));
-        },
-        () {
-          Set<VisitKind> unvisitedKindSet = kinds.toSet()
-            ..removeAll(UNTESTABLE_KINDS);
-          List<VisitKind> unvisitedKindList = unvisitedKindSet.toList();
-          unvisitedKindList..sort((a, b) => a.index.compareTo(b.index));
-
-          Expect.isTrue(unvisitedKindList.isEmpty,
-              "Untested visit kinds:\n  ${unvisitedKindList.join(',\n  ')},\n");
-
-          Set<VisitKind> testedUntestableKinds = UNTESTABLE_KINDS.toSet()
-            ..removeAll(kinds);
-          Expect.isTrue(
-              testedUntestableKinds.isEmpty,
-              "Tested untestable visit kinds (remove from UNTESTABLE_KINDS):\n  "
-              "${testedUntestableKinds.join(',\n  ')},\n");
-        },
-        () {
-          ClassMirror mirror1 = reflectType(SemanticSendTestVisitor);
-          Set<Symbol> symbols1 = mirror1.declarations.keys.toSet();
-          ClassMirror mirror2 = reflectType(SemanticSendVisitor);
-          Set<Symbol> symbols2 = mirror2.declarations.values
-              .where((m) =>
-                  m is MethodMirror &&
-                  !m.isConstructor &&
-                  m.simpleName != #apply)
-              .map((m) => m.simpleName)
-              .toSet();
-          symbols2.removeAll(symbols1);
-          Expect.isTrue(symbols2.isEmpty,
-              "Untested visit methods:\n  ${symbols2.join(',\n  ')},\n");
-        }
-      ], (f) => f()));
-}
-
-Future test(
-    Set<VisitKind> unvisitedKinds,
-    List<String> arguments,
-    Map<String, List<Test>> TESTS,
-    SemanticTestVisitor createVisitor(TreeElements elements)) async {
-  Map<String, String> sourceFiles = {};
-  Map<String, Test> testMap = {};
-  StringBuffer mainSource = new StringBuffer();
-  int index = 0;
-  TESTS.forEach((String group, List<Test> tests) {
-    if (arguments.isNotEmpty && !arguments.contains(group)) return;
-
-    tests.forEach((Test test) {
-      StringBuffer testSource = new StringBuffer();
-      if (test.codeByPrefix != null) {
-        String prefixFilename = 'pre$index.dart';
-        sourceFiles[prefixFilename] = test.codeByPrefix;
-        if (test.isDeferred) {
-          testSource.writeln("import '$prefixFilename' deferred as p;");
-        } else {
-          testSource.writeln("import '$prefixFilename' as p;");
-        }
-      }
-
-      String filename = 'lib$index.dart';
-      testSource.writeln(test.code);
-      sourceFiles[filename] = testSource.toString();
-      mainSource.writeln("import '$filename';");
-      testMap[filename] = test;
-      index++;
-    });
-  });
-  mainSource.writeln("main() {}");
-  sourceFiles['main.dart'] = mainSource.toString();
-
-  CompilationResult result = await runCompiler(
-      memorySourceFiles: sourceFiles,
-      options: [Flags.analyzeAll, Flags.analyzeOnly, Flags.useOldFrontend]);
-  Compiler compiler = result.compiler;
-  testMap.forEach((String filename, Test test) {
-    LibraryElement library =
-        compiler.libraryLoader.lookupLibrary(Uri.parse('memory:$filename'));
-    Element element;
-    String cls = test.cls;
-    String method = test.method;
-    if (cls == null) {
-      element = library.find(method);
-    } else {
-      ClassElement classElement = library.find(cls);
-      Expect.isNotNull(
-          classElement,
-          "Class '$cls' not found in:\n"
-          "${library.compilationUnit.script.text}");
-      element = classElement.localLookup(method);
-    }
-    var expectedVisits = test.expectedVisits;
-    if (expectedVisits == null) {
-      Expect.isTrue(
-          element.isMalformed,
-          "Element '$method' expected to be have parse errors in:\n"
-          "${library.compilationUnit.script.text}");
-      return;
-    } else if (expectedVisits is! List) {
-      expectedVisits = [expectedVisits];
-    }
-    Expect.isFalse(
-        element.isMalformed,
-        "Element '$method' is not expected to be have parse errors in:\n"
-        "${library.compilationUnit.script.text}");
-
-    void testAstElement(AstElement astElement) {
-      Expect.isNotNull(
-          astElement,
-          "Element '$method' not found in:\n"
-          "${library.compilationUnit.script.text}");
-      ResolvedAst resolvedAst = astElement.resolvedAst;
-      SemanticTestVisitor visitor = createVisitor(resolvedAst.elements);
-      try {
-        compiler.reporter.withCurrentElement(resolvedAst.element, () {
-          //print(resolvedAst.node.toDebugString());
-          resolvedAst.node.accept(visitor);
-        });
-      } catch (e, s) {
-        Expect.fail("$e:\n$s\nIn test:\n"
-            "${library.compilationUnit.script.text}");
-      }
-      Expect.listEquals(
-          expectedVisits,
-          visitor.visits,
-          "In test:\n"
-          "${library.compilationUnit.script.text}\n\n"
-          "Expected: $expectedVisits\n"
-          "Found: ${visitor.visits}");
-      unvisitedKinds.removeAll(visitor.visits.map((visit) => visit.method));
-    }
-
-    if (element.isAbstractField) {
-      AbstractFieldElement abstractFieldElement = element;
-      if (abstractFieldElement.getter != null) {
-        testAstElement(abstractFieldElement.getter);
-      } else if (abstractFieldElement.setter != null) {
-        testAstElement(abstractFieldElement.setter);
-      }
-    } else {
-      testAstElement(element);
-    }
-  });
-}
-
-abstract class SemanticTestVisitor extends TraversalVisitor {
-  List<Visit> visits = <Visit>[];
-
-  SemanticTestVisitor(TreeElements elements) : super(elements);
-
-  apply(Node node, arg) => node.accept(this);
-
-  internalError(Spannable spannable, String message) {
-    throw new SpannableAssertionFailure(spannable, message);
-  }
-}
-
-enum VisitKind {
-  VISIT_PARAMETER_GET,
-  VISIT_PARAMETER_SET,
-  VISIT_PARAMETER_INVOKE,
-  VISIT_PARAMETER_COMPOUND,
-  VISIT_PARAMETER_SET_IF_NULL,
-  VISIT_PARAMETER_PREFIX,
-  VISIT_PARAMETER_POSTFIX,
-  VISIT_FINAL_PARAMETER_SET,
-  VISIT_FINAL_PARAMETER_COMPOUND,
-  VISIT_FINAL_PARAMETER_SET_IF_NULL,
-  VISIT_FINAL_PARAMETER_PREFIX,
-  VISIT_FINAL_PARAMETER_POSTFIX,
-  VISIT_LOCAL_VARIABLE_GET,
-  VISIT_LOCAL_VARIABLE_SET,
-  VISIT_LOCAL_VARIABLE_INVOKE,
-  VISIT_LOCAL_VARIABLE_COMPOUND,
-  VISIT_LOCAL_VARIABLE_SET_IF_NULL,
-  VISIT_LOCAL_VARIABLE_PREFIX,
-  VISIT_LOCAL_VARIABLE_POSTFIX,
-  VISIT_LOCAL_VARIABLE_DECL,
-  VISIT_LOCAL_CONSTANT_DECL,
-  VISIT_FINAL_LOCAL_VARIABLE_SET,
-  VISIT_FINAL_LOCAL_VARIABLE_COMPOUND,
-  VISIT_FINAL_LOCAL_VARIABLE_SET_IF_NULL,
-  VISIT_FINAL_LOCAL_VARIABLE_PREFIX,
-  VISIT_FINAL_LOCAL_VARIABLE_POSTFIX,
-  VISIT_LOCAL_FUNCTION_GET,
-  VISIT_LOCAL_FUNCTION_INVOKE,
-  VISIT_LOCAL_FUNCTION_INCOMPATIBLE_INVOKE,
-  VISIT_LOCAL_FUNCTION_DECL,
-  VISIT_CLOSURE_DECL,
-  VISIT_LOCAL_FUNCTION_SET,
-  VISIT_LOCAL_FUNCTION_COMPOUND,
-  VISIT_LOCAL_FUNCTION_SET_IF_NULL,
-  VISIT_LOCAL_FUNCTION_PREFIX,
-  VISIT_LOCAL_FUNCTION_POSTFIX,
-  VISIT_STATIC_FIELD_GET,
-  VISIT_STATIC_FIELD_SET,
-  VISIT_STATIC_FIELD_INVOKE,
-  VISIT_STATIC_FIELD_COMPOUND,
-  VISIT_STATIC_FIELD_SET_IF_NULL,
-  VISIT_STATIC_FIELD_PREFIX,
-  VISIT_STATIC_FIELD_POSTFIX,
-  VISIT_STATIC_FIELD_DECL,
-  VISIT_STATIC_CONSTANT_DECL,
-  VISIT_STATIC_GETTER_GET,
-  VISIT_STATIC_GETTER_SET,
-  VISIT_STATIC_GETTER_INVOKE,
-  VISIT_STATIC_SETTER_GET,
-  VISIT_STATIC_SETTER_SET,
-  VISIT_STATIC_SETTER_INVOKE,
-  VISIT_STATIC_GETTER_SETTER_COMPOUND,
-  VISIT_STATIC_GETTER_SETTER_SET_IF_NULL,
-  VISIT_STATIC_METHOD_SETTER_COMPOUND,
-  VISIT_STATIC_METHOD_SETTER_SET_IF_NULL,
-  VISIT_STATIC_GETTER_SETTER_PREFIX,
-  VISIT_STATIC_GETTER_SETTER_POSTFIX,
-  VISIT_STATIC_GETTER_DECL,
-  VISIT_STATIC_SETTER_DECL,
-  VISIT_FINAL_STATIC_FIELD_SET,
-  VISIT_STATIC_FINAL_FIELD_COMPOUND,
-  VISIT_STATIC_FINAL_FIELD_SET_IF_NULL,
-  VISIT_STATIC_FINAL_FIELD_POSTFIX,
-  VISIT_STATIC_FINAL_FIELD_PREFIX,
-  VISIT_STATIC_FUNCTION_GET,
-  VISIT_STATIC_FUNCTION_SET,
-  VISIT_STATIC_FUNCTION_INVOKE,
-  VISIT_STATIC_FUNCTION_INCOMPATIBLE_INVOKE,
-  VISIT_STATIC_FUNCTION_DECL,
-  VISIT_STATIC_METHOD_SETTER_PREFIX,
-  VISIT_STATIC_METHOD_SETTER_POSTFIX,
-  VISIT_UNRESOLVED_STATIC_GETTER_COMPOUND,
-  VISIT_UNRESOLVED_STATIC_GETTER_SET_IF_NULL,
-  VISIT_UNRESOLVED_STATIC_SETTER_COMPOUND,
-  VISIT_UNRESOLVED_STATIC_SETTER_SET_IF_NULL,
-  VISIT_STATIC_METHOD_COMPOUND,
-  VISIT_STATIC_METHOD_SET_IF_NULL,
-  VISIT_UNRESOLVED_STATIC_GETTER_PREFIX,
-  VISIT_UNRESOLVED_STATIC_SETTER_PREFIX,
-  VISIT_STATIC_METHOD_PREFIX,
-  VISIT_UNRESOLVED_STATIC_GETTER_POSTFIX,
-  VISIT_UNRESOLVED_STATIC_SETTER_POSTFIX,
-  VISIT_STATIC_METHOD_POSTFIX,
-  VISIT_TOP_LEVEL_FIELD_GET,
-  VISIT_TOP_LEVEL_FIELD_SET,
-  VISIT_TOP_LEVEL_FIELD_INVOKE,
-  VISIT_FINAL_TOP_LEVEL_FIELD_SET,
-  VISIT_TOP_LEVEL_FIELD_COMPOUND,
-  VISIT_TOP_LEVEL_FIELD_SET_IF_NULL,
-  VISIT_TOP_LEVEL_FIELD_PREFIX,
-  VISIT_TOP_LEVEL_FIELD_POSTFIX,
-  VISIT_TOP_LEVEL_FIELD_DECL,
-  VISIT_TOP_LEVEL_CONSTANT_DECL,
-  VISIT_TOP_LEVEL_FINAL_FIELD_COMPOUND,
-  VISIT_TOP_LEVEL_FINAL_FIELD_SET_IF_NULL,
-  VISIT_TOP_LEVEL_FINAL_FIELD_POSTFIX,
-  VISIT_TOP_LEVEL_FINAL_FIELD_PREFIX,
-  VISIT_TOP_LEVEL_GETTER_GET,
-  VISIT_TOP_LEVEL_GETTER_SET,
-  VISIT_TOP_LEVEL_GETTER_INVOKE,
-  VISIT_TOP_LEVEL_SETTER_GET,
-  VISIT_TOP_LEVEL_SETTER_SET,
-  VISIT_TOP_LEVEL_SETTER_INVOKE,
-  VISIT_TOP_LEVEL_GETTER_SETTER_COMPOUND,
-  VISIT_TOP_LEVEL_GETTER_SETTER_SET_IF_NULL,
-  VISIT_TOP_LEVEL_GETTER_SETTER_PREFIX,
-  VISIT_TOP_LEVEL_GETTER_SETTER_POSTFIX,
-  VISIT_TOP_LEVEL_GETTER_DECL,
-  VISIT_TOP_LEVEL_SETTER_DECL,
-  VISIT_TOP_LEVEL_FUNCTION_GET,
-  VISIT_TOP_LEVEL_FUNCTION_SET,
-  VISIT_TOP_LEVEL_FUNCTION_INVOKE,
-  VISIT_TOP_LEVEL_FUNCTION_INCOMPATIBLE_INVOKE,
-  VISIT_TOP_LEVEL_FUNCTION_DECL,
-  VISIT_TOP_LEVEL_METHOD_SETTER_COMPOUND,
-  VISIT_TOP_LEVEL_METHOD_SETTER_SET_IF_NULL,
-  VISIT_TOP_LEVEL_METHOD_SETTER_PREFIX,
-  VISIT_TOP_LEVEL_METHOD_SETTER_POSTFIX,
-  VISIT_UNRESOLVED_TOP_LEVEL_GETTER_COMPOUND,
-  VISIT_UNRESOLVED_TOP_LEVEL_GETTER_SET_IF_NULL,
-  VISIT_UNRESOLVED_TOP_LEVEL_SETTER_COMPOUND,
-  VISIT_UNRESOLVED_TOP_LEVEL_SETTER_SET_IF_NULL,
-  VISIT_TOP_LEVEL_METHOD_COMPOUND,
-  VISIT_TOP_LEVEL_METHOD_SET_IF_NULL,
-  VISIT_UNRESOLVED_TOP_LEVEL_GETTER_PREFIX,
-  VISIT_UNRESOLVED_TOP_LEVEL_SETTER_PREFIX,
-  VISIT_TOP_LEVEL_METHOD_PREFIX,
-  VISIT_UNRESOLVED_TOP_LEVEL_GETTER_POSTFIX,
-  VISIT_UNRESOLVED_TOP_LEVEL_SETTER_POSTFIX,
-  VISIT_TOP_LEVEL_METHOD_POSTFIX,
-  VISIT_DYNAMIC_PROPERTY_GET,
-  VISIT_DYNAMIC_PROPERTY_SET,
-  VISIT_DYNAMIC_PROPERTY_INVOKE,
-  VISIT_DYNAMIC_PROPERTY_COMPOUND,
-  VISIT_DYNAMIC_PROPERTY_SET_IF_NULL,
-  VISIT_DYNAMIC_PROPERTY_PREFIX,
-  VISIT_DYNAMIC_PROPERTY_POSTFIX,
-  VISIT_THIS_GET,
-  VISIT_THIS_INVOKE,
-  VISIT_THIS_PROPERTY_GET,
-  VISIT_THIS_PROPERTY_SET,
-  VISIT_THIS_PROPERTY_INVOKE,
-  VISIT_THIS_PROPERTY_COMPOUND,
-  VISIT_THIS_PROPERTY_SET_IF_NULL,
-  VISIT_THIS_PROPERTY_PREFIX,
-  VISIT_THIS_PROPERTY_POSTFIX,
-  VISIT_SUPER_FIELD_GET,
-  VISIT_SUPER_FIELD_SET,
-  VISIT_FINAL_SUPER_FIELD_SET,
-  VISIT_SUPER_FIELD_INVOKE,
-  VISIT_SUPER_FIELD_COMPOUND,
-  VISIT_SUPER_FIELD_SET_IF_NULL,
-  VISIT_SUPER_FIELD_PREFIX,
-  VISIT_SUPER_FIELD_POSTFIX,
-  VISIT_SUPER_FINAL_FIELD_COMPOUND,
-  VISIT_SUPER_FINAL_FIELD_SET_IF_NULL,
-  VISIT_SUPER_FINAL_FIELD_PREFIX,
-  VISIT_SUPER_FINAL_FIELD_POSTFIX,
-  VISIT_SUPER_FIELD_FIELD_COMPOUND,
-  VISIT_SUPER_FIELD_FIELD_SET_IF_NULL,
-  VISIT_SUPER_FIELD_FIELD_PREFIX,
-  VISIT_SUPER_FIELD_FIELD_POSTFIX,
-  VISIT_SUPER_GETTER_GET,
-  VISIT_SUPER_GETTER_SET,
-  VISIT_SUPER_GETTER_INVOKE,
-  VISIT_SUPER_SETTER_GET,
-  VISIT_SUPER_SETTER_SET,
-  VISIT_SUPER_SETTER_INVOKE,
-  VISIT_SUPER_GETTER_SETTER_COMPOUND,
-  VISIT_SUPER_GETTER_SETTER_SET_IF_NULL,
-  VISIT_SUPER_GETTER_FIELD_COMPOUND,
-  VISIT_SUPER_GETTER_FIELD_SET_IF_NULL,
-  VISIT_SUPER_FIELD_SETTER_COMPOUND,
-  VISIT_SUPER_FIELD_SETTER_SET_IF_NULL,
-  VISIT_SUPER_GETTER_SETTER_PREFIX,
-  VISIT_SUPER_GETTER_FIELD_PREFIX,
-  VISIT_SUPER_FIELD_SETTER_PREFIX,
-  VISIT_SUPER_GETTER_SETTER_POSTFIX,
-  VISIT_SUPER_GETTER_FIELD_POSTFIX,
-  VISIT_SUPER_FIELD_SETTER_POSTFIX,
-  VISIT_SUPER_METHOD_GET,
-  VISIT_SUPER_METHOD_SET,
-  VISIT_SUPER_METHOD_INVOKE,
-  VISIT_SUPER_METHOD_INCOMPATIBLE_INVOKE,
-  VISIT_SUPER_METHOD_SETTER_COMPOUND,
-  VISIT_SUPER_METHOD_SETTER_SET_IF_NULL,
-  VISIT_SUPER_METHOD_SETTER_PREFIX,
-  VISIT_SUPER_METHOD_SETTER_POSTFIX,
-  VISIT_SUPER_METHOD_COMPOUND,
-  VISIT_SUPER_METHOD_SET_IF_NULL,
-  VISIT_SUPER_METHOD_PREFIX,
-  VISIT_SUPER_METHOD_POSTFIX,
-  VISIT_UNRESOLVED_GET,
-  VISIT_UNRESOLVED_SET,
-  VISIT_UNRESOLVED_INVOKE,
-  VISIT_UNRESOLVED_SUPER_GET,
-  VISIT_UNRESOLVED_SUPER_INVOKE,
-  VISIT_UNRESOLVED_SUPER_SET,
-  VISIT_BINARY,
-  VISIT_INDEX,
-  VISIT_EQUALS,
-  VISIT_NOT_EQUALS,
-  VISIT_INDEX_PREFIX,
-  VISIT_INDEX_POSTFIX,
-  VISIT_SUPER_BINARY,
-  VISIT_UNRESOLVED_SUPER_BINARY,
-  VISIT_SUPER_INDEX,
-  VISIT_UNRESOLVED_SUPER_INDEX,
-  VISIT_SUPER_EQUALS,
-  VISIT_SUPER_NOT_EQUALS,
-  VISIT_SUPER_INDEX_PREFIX,
-  VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND,
-  VISIT_UNRESOLVED_SUPER_GETTER_SET_IF_NULL,
-  VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND,
-  VISIT_UNRESOLVED_SUPER_SETTER_SET_IF_NULL,
-  VISIT_UNRESOLVED_SUPER_GETTER_PREFIX,
-  VISIT_UNRESOLVED_SUPER_SETTER_PREFIX,
-  VISIT_UNRESOLVED_SUPER_INDEX_PREFIX,
-  VISIT_UNRESOLVED_SUPER_GETTER_INDEX_PREFIX,
-  VISIT_UNRESOLVED_SUPER_SETTER_INDEX_PREFIX,
-  VISIT_SUPER_INDEX_POSTFIX,
-  VISIT_UNRESOLVED_SUPER_GETTER_POSTFIX,
-  VISIT_UNRESOLVED_SUPER_SETTER_POSTFIX,
-  VISIT_UNRESOLVED_SUPER_INDEX_POSTFIX,
-  VISIT_UNRESOLVED_SUPER_GETTER_INDEX_POSTFIX,
-  VISIT_UNRESOLVED_SUPER_SETTER_INDEX_POSTFIX,
-  VISIT_UNRESOLVED_SUPER_COMPOUND,
-  VISIT_UNRESOLVED_SUPER_SET_IF_NULL,
-  VISIT_UNRESOLVED_SUPER_PREFIX,
-  VISIT_UNRESOLVED_SUPER_POSTFIX,
-  VISIT_UNARY,
-  VISIT_SUPER_UNARY,
-  VISIT_UNRESOLVED_SUPER_UNARY,
-  VISIT_NOT,
-  VISIT_EXPRESSION_INVOKE,
-  VISIT_CLASS_TYPE_LITERAL_GET,
-  VISIT_CLASS_TYPE_LITERAL_SET,
-  VISIT_CLASS_TYPE_LITERAL_INVOKE,
-  VISIT_CLASS_TYPE_LITERAL_COMPOUND,
-  VISIT_CLASS_TYPE_LITERAL_SET_IF_NULL,
-  VISIT_CLASS_TYPE_LITERAL_PREFIX,
-  VISIT_CLASS_TYPE_LITERAL_POSTFIX,
-  VISIT_TYPEDEF_TYPE_LITERAL_GET,
-  VISIT_TYPEDEF_TYPE_LITERAL_SET,
-  VISIT_TYPEDEF_TYPE_LITERAL_INVOKE,
-  VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND,
-  VISIT_TYPEDEF_TYPE_LITERAL_SET_IF_NULL,
-  VISIT_TYPEDEF_TYPE_LITERAL_PREFIX,
-  VISIT_TYPEDEF_TYPE_LITERAL_POSTFIX,
-  VISIT_TYPE_VARIABLE_TYPE_LITERAL_GET,
-  VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET,
-  VISIT_TYPE_VARIABLE_TYPE_LITERAL_INVOKE,
-  VISIT_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND,
-  VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET_IF_NULL,
-  VISIT_TYPE_VARIABLE_TYPE_LITERAL_PREFIX,
-  VISIT_TYPE_VARIABLE_TYPE_LITERAL_POSTFIX,
-  VISIT_DYNAMIC_TYPE_LITERAL_GET,
-  VISIT_DYNAMIC_TYPE_LITERAL_SET,
-  VISIT_DYNAMIC_TYPE_LITERAL_INVOKE,
-  VISIT_DYNAMIC_TYPE_LITERAL_COMPOUND,
-  VISIT_DYNAMIC_TYPE_LITERAL_SET_IF_NULL,
-  VISIT_DYNAMIC_TYPE_LITERAL_PREFIX,
-  VISIT_DYNAMIC_TYPE_LITERAL_POSTFIX,
-  VISIT_INDEX_SET,
-  VISIT_COMPOUND_INDEX_SET,
-  VISIT_SUPER_INDEX_SET,
-  VISIT_UNRESOLVED_SUPER_INDEX_SET,
-  VISIT_SUPER_COMPOUND_INDEX_SET,
-  VISIT_UNRESOLVED_SUPER_COMPOUND_INDEX_SET,
-  VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND_INDEX_SET,
-  VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND_INDEX_SET,
-  VISIT_INDEX_SET_IF_NULL,
-  VISIT_SUPER_INDEX_SET_IF_NULL,
-  VISIT_UNRESOLVED_SUPER_INDEX_SET_IF_NULL,
-  VISIT_UNRESOLVED_SUPER_GETTER_INDEX_SET_IF_NULL,
-  VISIT_UNRESOLVED_SUPER_SETTER_INDEX_SET_IF_NULL,
-  VISIT_LOGICAL_AND,
-  VISIT_LOGICAL_OR,
-  VISIT_IS,
-  VISIT_IS_NOT,
-  VISIT_AS,
-  VISIT_CONST_CONSTRUCTOR_INVOKE,
-  VISIT_BOOL_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
-  VISIT_INT_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
-  VISIT_STRING_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
-  VISIT_GENERATIVE_CONSTRUCTOR_INVOKE,
-  VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_INVOKE,
-  VISIT_FACTORY_CONSTRUCTOR_INVOKE,
-  VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
-  VISIT_CONSTRUCTOR_INCOMPATIBLE_INVOKE,
-  ERROR_NON_CONSTANT_CONSTRUCTOR_INVOKE,
-  VISIT_SUPER_CONSTRUCTOR_INVOKE,
-  VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE,
-  VISIT_THIS_CONSTRUCTOR_INVOKE,
-  VISIT_FIELD_INITIALIZER,
-  VISIT_UNRESOLVED_CLASS_CONSTRUCTOR_INVOKE,
-  VISIT_UNRESOLVED_CONSTRUCTOR_INVOKE,
-  VISIT_ABSTRACT_CLASS_CONSTRUCTOR_INVOKE,
-  VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
-  VISIT_INSTANCE_GETTER_DECL,
-  VISIT_INSTANCE_SETTER_DECL,
-  VISIT_INSTANCE_METHOD_DECL,
-  VISIT_ABSTRACT_GETTER_DECL,
-  VISIT_ABSTRACT_SETTER_DECL,
-  VISIT_ABSTRACT_METHOD_DECL,
-  VISIT_INSTANCE_FIELD_DECL,
-  VISIT_GENERATIVE_CONSTRUCTOR_DECL,
-  VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_DECL,
-  VISIT_FACTORY_CONSTRUCTOR_DECL,
-  VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL,
-  VISIT_REQUIRED_PARAMETER_DECL,
-  VISIT_OPTIONAL_PARAMETER_DECL,
-  VISIT_NAMED_PARAMETER_DECL,
-  VISIT_REQUIRED_INITIALIZING_FORMAL_DECL,
-  VISIT_OPTIONAL_INITIALIZING_FORMAL_DECL,
-  VISIT_NAMED_INITIALIZING_FORMAL_DECL,
-  VISIT_UNRESOLVED_COMPOUND,
-  VISIT_UNRESOLVED_SET_IF_NULL,
-  VISIT_UNRESOLVED_PREFIX,
-  VISIT_UNRESOLVED_POSTFIX,
-  VISIT_IF_NULL,
-  VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_GET,
-  VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_SET,
-  VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_INVOKE,
-  VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_COMPOUND,
-  VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_SET_IF_NULL,
-  VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_PREFIX,
-  VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_POSTFIX,
-  ERROR_UNDEFINED_UNARY_EXPRESSION,
-  ERROR_UNDEFINED_BINARY_EXPRESSION,
-  ERROR_INVALID_GET,
-  ERROR_INVALID_INVOKE,
-  ERROR_INVALID_SET,
-  ERROR_INVALID_PREFIX,
-  ERROR_INVALID_POSTFIX,
-  ERROR_INVALID_COMPOUND,
-  ERROR_INVALID_SET_IF_NULL,
-  ERROR_INVALID_UNARY,
-  ERROR_INVALID_EQUALS,
-  ERROR_INVALID_NOT_EQUALS,
-  ERROR_INVALID_BINARY,
-  ERROR_INVALID_INDEX,
-  ERROR_INVALID_INDEX_SET,
-  ERROR_INVALID_COMPOUND_INDEX_SET,
-  ERROR_INVALID_INDEX_PREFIX,
-  ERROR_INVALID_INDEX_POSTFIX,
-  VISIT_CONSTANT_GET,
-  VISIT_CONSTANT_INVOKE,
-  PREVISIT_DEFERRED_ACCESS,
-}
diff --git a/tests/compiler/dart2js/old_frontend/semantic_visitor_test_decl_data.dart b/tests/compiler/dart2js/old_frontend/semantic_visitor_test_decl_data.dart
deleted file mode 100644
index 6a51b43..0000000
--- a/tests/compiler/dart2js/old_frontend/semantic_visitor_test_decl_data.dart
+++ /dev/null
@@ -1,625 +0,0 @@
-// Copyright (c) 2015, 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 dart2js.semantics_visitor_test;
-
-const Map<String, List<Test>> DECL_TESTS = const {
-  'Function declarations': const [
-    const Test('''
-        m(a, b) {}
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-          element: 'function(m)', parameters: '(a,b)', body: '{}'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#b)', index: 1),
-    ]),
-    const Test('''
-        m(a, [b]) {}
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-          element: 'function(m)', parameters: '(a,[b])', body: '{}'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#a)', index: 0),
-      const Visit(VisitKind.VISIT_OPTIONAL_PARAMETER_DECL,
-          element: 'parameter(m#b)', index: 1, constant: 'null'),
-    ]),
-    const Test('''
-        m(a, [b = null]) {}
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-          element: 'function(m)', parameters: '(a,[b=null])', body: '{}'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#a)', index: 0),
-      const Visit(VisitKind.VISIT_OPTIONAL_PARAMETER_DECL,
-          element: 'parameter(m#b)', constant: 'null', index: 1),
-    ]),
-    const Test('''
-        m(a, [b = 42]) {}
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-          element: 'function(m)', parameters: '(a,[b=42])', body: '{}'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#a)', index: 0),
-      const Visit(VisitKind.VISIT_OPTIONAL_PARAMETER_DECL,
-          element: 'parameter(m#b)', constant: 42, index: 1),
-    ]),
-    const Test('''
-        m(a, {b}) {}
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-          element: 'function(m)', parameters: '(a,{b})', body: '{}'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#a)', index: 0),
-      const Visit(VisitKind.VISIT_NAMED_PARAMETER_DECL,
-          element: 'parameter(m#b)', constant: 'null'),
-    ]),
-    const Test('''
-        m(a, {b: null}) {}
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-          element: 'function(m)', parameters: '(a,{b: null})', body: '{}'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#a)', index: 0),
-      const Visit(VisitKind.VISIT_NAMED_PARAMETER_DECL,
-          element: 'parameter(m#b)', constant: 'null'),
-    ]),
-    const Test('''
-        m(a, {b:42}) {}
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-          element: 'function(m)', parameters: '(a,{b: 42})', body: '{}'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#a)', index: 0),
-      const Visit(VisitKind.VISIT_NAMED_PARAMETER_DECL,
-          element: 'parameter(m#b)', constant: 42),
-    ]),
-    const Test('''
-        get m => null;
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_DECL,
-          element: 'getter(m)', body: '=>null;'),
-    ]),
-    const Test('''
-        set m(a) {}
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_DECL,
-          element: 'setter(m)', parameters: '(a)', body: '{}'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#a)', index: 0),
-    ]),
-    const Test.clazz('''
-        class C {
-          static m(a, b) {}
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_STATIC_FUNCTION_DECL,
-          element: 'function(C#m)', parameters: '(a,b)', body: '{}'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#b)', index: 1),
-    ]),
-    const Test.clazz('''
-        class C {
-          static get m => null;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_STATIC_GETTER_DECL,
-          element: 'getter(C#m)', body: '=>null;'),
-    ]),
-    const Test.clazz('''
-        class C {
-          static set m(a) {}
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_STATIC_SETTER_DECL,
-          element: 'setter(C#m)', parameters: '(a)', body: '{}'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#a)', index: 0),
-    ]),
-    const Test.clazz('''
-        class C {
-          m(a, b) {}
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_INSTANCE_METHOD_DECL,
-          element: 'function(C#m)', parameters: '(a,b)', body: '{}'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#b)', index: 1),
-    ]),
-    const Test.clazz('''
-        class C {
-          get m => null;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_INSTANCE_GETTER_DECL,
-          element: 'getter(C#m)', body: '=>null;'),
-    ]),
-    const Test.clazz('''
-        class C {
-          set m(a) {}
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_INSTANCE_SETTER_DECL,
-          element: 'setter(C#m)', parameters: '(a)', body: '{}'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#a)', index: 0),
-    ]),
-    const Test.clazz('''
-        abstract class C {
-          m(a, b);
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_ABSTRACT_METHOD_DECL,
-          element: 'function(C#m)', parameters: '(a,b)'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#b)', index: 1),
-    ]),
-    const Test.clazz('''
-        abstract class C {
-          get m;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_ABSTRACT_GETTER_DECL, element: 'getter(C#m)'),
-    ]),
-    const Test.clazz('''
-        abstract class C {
-          set m(a);
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_ABSTRACT_SETTER_DECL,
-          element: 'setter(C#m)', parameters: '(a)'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#a)', index: 0),
-    ]),
-    const Test('''
-        m(a, b) {}
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-          element: 'function(m)', parameters: '(a,b)', body: '{}'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(m#b)', index: 1),
-    ]),
-    const Test('''
-        m() {
-          local(a, b) {}
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-          element: 'function(m)', parameters: '()', body: '{local(a,b){}}'),
-      const Visit(VisitKind.VISIT_LOCAL_FUNCTION_DECL,
-          element: 'function(m#local)', parameters: '(a,b)', body: '{}'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(local#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(local#b)', index: 1),
-    ]),
-    const Test('''
-        m() => (a, b) {};
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-          element: 'function(m)', parameters: '()', body: '=>(a,b){};'),
-      const Visit(VisitKind.VISIT_CLOSURE_DECL,
-          element: 'function(m#)', parameters: '(a,b)', body: '{}'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#b)', index: 1),
-    ]),
-  ],
-  'Constructor declarations': const [
-    const Test.clazz('''
-        class C {
-          C(a, b);
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL,
-          element: 'generative_constructor(C#)',
-          parameters: '(a,b)',
-          body: ';'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#b)', index: 1),
-      const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE,
-          element: 'generative_constructor(Object#)', type: 'Object'),
-    ], method: ''),
-    const Test.clazz('''
-        class C {
-          var b;
-          C(a, this.b);
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL,
-          element: 'generative_constructor(C#)',
-          parameters: '(a,this.b)',
-          body: ';'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_INITIALIZING_FORMAL_DECL,
-          element: 'initializing_formal(#b)', index: 1),
-      const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE,
-          element: 'generative_constructor(Object#)', type: 'Object'),
-    ], method: ''),
-    const Test.clazz('''
-        class C {
-          var b;
-          C(a, [this.b = 42]);
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL,
-          element: 'generative_constructor(C#)',
-          parameters: '(a,[this.b=42])',
-          body: ';'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#a)', index: 0),
-      const Visit(VisitKind.VISIT_OPTIONAL_INITIALIZING_FORMAL_DECL,
-          element: 'initializing_formal(#b)', constant: 42, index: 1),
-      const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE,
-          element: 'generative_constructor(Object#)', type: 'Object'),
-    ], method: ''),
-    const Test.clazz('''
-        class C {
-          var b;
-          C(a, {this.b: 42});
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL,
-          element: 'generative_constructor(C#)',
-          parameters: '(a,{this.b: 42})',
-          body: ';'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#a)', index: 0),
-      const Visit(VisitKind.VISIT_NAMED_INITIALIZING_FORMAL_DECL,
-          element: 'initializing_formal(#b)', constant: 42),
-      const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE,
-          element: 'generative_constructor(Object#)', type: 'Object'),
-    ], method: ''),
-    const Test.clazz('''
-        class C {
-          C(a, b) : super();
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL,
-          element: 'generative_constructor(C#)',
-          parameters: '(a,b)',
-          body: ';'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#b)', index: 1),
-      const Visit(VisitKind.VISIT_SUPER_CONSTRUCTOR_INVOKE,
-          element: 'generative_constructor(Object#)',
-          type: 'Object',
-          arguments: '()',
-          selector: 'CallStructure(arity=0)'),
-    ], method: ''),
-    const Test.clazz('''
-        class C {
-          var field;
-          C(a, b) : this.field = a;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL,
-          element: 'generative_constructor(C#)',
-          parameters: '(a,b)',
-          body: ';'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#b)', index: 1),
-      const Visit(VisitKind.VISIT_FIELD_INITIALIZER,
-          element: 'field(C#field)', rhs: 'a'),
-      const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE,
-          element: 'generative_constructor(Object#)', type: 'Object'),
-    ], method: ''),
-    const Test.clazz('''
-        class C {
-          var field1;
-          var field2;
-          C(a, b) : this.field1 = a, this.field2 = b;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL,
-          element: 'generative_constructor(C#)',
-          parameters: '(a,b)',
-          body: ';'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#b)', index: 1),
-      const Visit(VisitKind.VISIT_FIELD_INITIALIZER,
-          element: 'field(C#field1)', rhs: 'a'),
-      const Visit(VisitKind.VISIT_FIELD_INITIALIZER,
-          element: 'field(C#field2)', rhs: 'b'),
-      const Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE,
-          element: 'generative_constructor(Object#)', type: 'Object'),
-    ], method: ''),
-    const Test.clazz('''
-        class C {
-          C(a, b) : this._(a, b);
-          C._(a, b);
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_DECL,
-          element: 'generative_constructor(C#)',
-          parameters: '(a,b)',
-          initializers: ':this._(a,b)'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#b)', index: 1),
-      const Visit(VisitKind.VISIT_THIS_CONSTRUCTOR_INVOKE,
-          element: 'generative_constructor(C#_)',
-          arguments: '(a,b)',
-          selector: 'CallStructure(arity=2)'),
-    ], method: ''),
-    const Test.clazz('''
-        class C {
-          factory C(a, b) => null;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_FACTORY_CONSTRUCTOR_DECL,
-          element: 'factory_constructor(C#)',
-          parameters: '(a,b)',
-          body: '=>null;'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#b)', index: 1),
-    ], method: ''),
-    const Test.clazz('''
-        class C {
-          factory C(a, b) = C._;
-          C._(a, b);
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL,
-          element: 'factory_constructor(C#)',
-          parameters: '(a,b)',
-          target: 'generative_constructor(C#_)',
-          type: 'C'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#b)', index: 1),
-    ], method: ''),
-    const Test.clazz('''
-        class C {
-          factory C(a, b) = D;
-        }
-        class D<T> {
-          D(a, b);
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL,
-          element: 'factory_constructor(C#)',
-          parameters: '(a,b)',
-          target: 'generative_constructor(D#)',
-          type: 'D'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#b)', index: 1),
-    ], method: ''),
-    const Test.clazz('''
-        class C {
-          factory C(a, b) = D<int>;
-        }
-        class D<T> {
-          D(a, b);
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL,
-          element: 'factory_constructor(C#)',
-          parameters: '(a,b)',
-          target: 'generative_constructor(D#)',
-          type: 'D<int>'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#b)', index: 1),
-    ], method: ''),
-    const Test.clazz('''
-        class C {
-          factory C(a, b) = D<int>;
-        }
-        class D<T> {
-          factory D(a, b) = E<D<T>>;
-        }
-        class E<S> {
-          E(a, b);
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL,
-          element: 'factory_constructor(C#)',
-          parameters: '(a,b)',
-          target: 'factory_constructor(D#)',
-          type: 'D<int>'),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#a)', index: 0),
-      const Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-          element: 'parameter(#b)', index: 1),
-    ], method: ''),
-  ],
-  "Field declarations": const [
-    const Test.clazz('''
-        class C {
-          var m;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_INSTANCE_FIELD_DECL, element: 'field(C#m)'),
-    ]),
-    const Test.clazz('''
-        class C {
-          var m, n;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_INSTANCE_FIELD_DECL, element: 'field(C#m)'),
-      const Visit(VisitKind.VISIT_INSTANCE_FIELD_DECL, element: 'field(C#n)'),
-    ]),
-    const Test.clazz('''
-        class C {
-          var m = 42;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_INSTANCE_FIELD_DECL,
-          element: 'field(C#m)', rhs: 42),
-    ]),
-    const Test('''
-        m() {
-          var local;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-          element: 'function(m)', parameters: '()', body: '{var local;}'),
-      const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL,
-          element: 'variable(m#local)'),
-    ]),
-    const Test('''
-        m() {
-          var local = 42;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-          element: 'function(m)', parameters: '()', body: '{var local=42;}'),
-      const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL,
-          element: 'variable(m#local)', rhs: 42),
-    ]),
-    const Test('''
-        m() {
-          const local = 42;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-          element: 'function(m)', parameters: '()', body: '{const local=42;}'),
-      const Visit(VisitKind.VISIT_LOCAL_CONSTANT_DECL,
-          element: 'variable(m#local)', constant: 42),
-    ]),
-    const Test('''
-        m() {
-          var local1, local2;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-          element: 'function(m)',
-          parameters: '()',
-          body: '{var local1,local2;}'),
-      const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL,
-          element: 'variable(m#local1)'),
-      const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL,
-          element: 'variable(m#local2)'),
-    ]),
-    const Test('''
-        m() {
-          var local1 = 42, local2 = true;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-          element: 'function(m)',
-          parameters: '()',
-          body: '{var local1=42,local2=true;}'),
-      const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL,
-          element: 'variable(m#local1)', rhs: 42),
-      const Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL,
-          element: 'variable(m#local2)', rhs: true),
-    ]),
-    const Test('''
-        m() {
-          const local1 = 42, local2 = true;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-          element: 'function(m)',
-          parameters: '()',
-          body: '{const local1=42,local2=true;}'),
-      const Visit(VisitKind.VISIT_LOCAL_CONSTANT_DECL,
-          element: 'variable(m#local1)', constant: 42),
-      const Visit(VisitKind.VISIT_LOCAL_CONSTANT_DECL,
-          element: 'variable(m#local2)', constant: true),
-    ]),
-    const Test.clazz('''
-        class C {
-          static var m;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, element: 'field(C#m)'),
-    ]),
-    const Test.clazz('''
-        class C {
-          static var m, n;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, element: 'field(C#m)'),
-      const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, element: 'field(C#n)'),
-    ]),
-    const Test.clazz('''
-        class C {
-          static var k, l, m, n;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, element: 'field(C#k)'),
-      const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, element: 'field(C#l)'),
-      const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, element: 'field(C#m)'),
-      const Visit(VisitKind.VISIT_STATIC_FIELD_DECL, element: 'field(C#n)'),
-    ]),
-    const Test.clazz('''
-        class C {
-          static var m = 42;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_STATIC_FIELD_DECL,
-          element: 'field(C#m)', rhs: 42),
-    ]),
-    const Test.clazz('''
-        class C {
-          static var m = 42, n = true;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_STATIC_FIELD_DECL,
-          element: 'field(C#m)', rhs: 42),
-      const Visit(VisitKind.VISIT_STATIC_FIELD_DECL,
-          element: 'field(C#n)', rhs: true),
-    ]),
-    const Test.clazz('''
-        class C {
-          static const m = 42;
-        }
-        ''', const [
-      const Visit(VisitKind.VISIT_STATIC_CONSTANT_DECL,
-          element: 'field(C#m)', constant: 42),
-    ]),
-    const Test('''
-        var m;
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_DECL, element: 'field(m)'),
-    ]),
-    const Test('''
-        var m, n;
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_DECL, element: 'field(m)'),
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_DECL, element: 'field(n)'),
-    ]),
-    const Test('''
-        var m = 42;
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_DECL,
-          element: 'field(m)', rhs: 42),
-    ]),
-    const Test('''
-        const m = 42;
-        ''', const [
-      const Visit(VisitKind.VISIT_TOP_LEVEL_CONSTANT_DECL,
-          element: 'field(m)', constant: 42),
-    ]),
-  ],
-};
diff --git a/tests/compiler/dart2js/old_frontend/semantic_visitor_test_decl_visitor.dart b/tests/compiler/dart2js/old_frontend/semantic_visitor_test_decl_visitor.dart
deleted file mode 100644
index 41055c6..0000000
--- a/tests/compiler/dart2js/old_frontend/semantic_visitor_test_decl_visitor.dart
+++ /dev/null
@@ -1,370 +0,0 @@
-// Copyright (c) 2015, 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 dart2js.semantics_visitor_test;
-
-class SemanticDeclarationTestVisitor extends SemanticTestVisitor {
-  SemanticDeclarationTestVisitor(TreeElements elements) : super(elements);
-
-  @override
-  errorUnresolvedSuperConstructorInvoke(
-      Send node, Element element, NodeList arguments, Selector selector, arg) {
-    // TODO: implement errorUnresolvedSuperConstructorInvoke
-  }
-
-  @override
-  errorUnresolvedThisConstructorInvoke(
-      Send node, Element element, NodeList arguments, Selector selector, arg) {
-    // TODO: implement errorUnresolvedThisConstructorInvoke
-  }
-
-  @override
-  visitAbstractMethodDeclaration(
-      FunctionExpression node, MethodElement method, NodeList parameters, arg) {
-    visits.add(new Visit(VisitKind.VISIT_ABSTRACT_METHOD_DECL,
-        element: method, parameters: parameters));
-    applyParameters(parameters, arg);
-  }
-
-  @override
-  visitClosureDeclaration(FunctionExpression node,
-      LocalFunctionElement function, NodeList parameters, Node body, arg) {
-    visits.add(new Visit(VisitKind.VISIT_CLOSURE_DECL,
-        element: function, parameters: parameters, body: body));
-    applyParameters(parameters, arg);
-    apply(body, arg);
-  }
-
-  @override
-  visitFactoryConstructorDeclaration(FunctionExpression node,
-      ConstructorElement constructor, NodeList parameters, Node body, arg) {
-    visits.add(new Visit(VisitKind.VISIT_FACTORY_CONSTRUCTOR_DECL,
-        element: constructor, parameters: parameters, body: body));
-    applyParameters(parameters, arg);
-    apply(body, arg);
-  }
-
-  @override
-  visitFieldInitializer(
-      SendSet node, FieldElement field, Node initializer, arg) {
-    visits.add(new Visit(VisitKind.VISIT_FIELD_INITIALIZER,
-        element: field, rhs: initializer));
-    apply(initializer, arg);
-  }
-
-  @override
-  visitGenerativeConstructorDeclaration(
-      FunctionExpression node,
-      ConstructorElement constructor,
-      NodeList parameters,
-      NodeList initializers,
-      Node body,
-      arg) {
-    visits.add(new Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_DECL,
-        element: constructor, parameters: parameters, body: body));
-    applyParameters(parameters, arg);
-    applyInitializers(node, arg);
-    apply(body, arg);
-  }
-
-  @override
-  visitInstanceMethodDeclaration(FunctionExpression node, MethodElement method,
-      NodeList parameters, Node body, arg) {
-    visits.add(new Visit(VisitKind.VISIT_INSTANCE_METHOD_DECL,
-        element: method, parameters: parameters, body: body));
-    applyParameters(parameters, arg);
-    apply(body, arg);
-  }
-
-  @override
-  visitLocalFunctionDeclaration(FunctionExpression node,
-      LocalFunctionElement function, NodeList parameters, Node body, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_DECL,
-        element: function, parameters: parameters, body: body));
-    applyParameters(parameters, arg);
-    apply(body, arg);
-  }
-
-  @override
-  visitRedirectingFactoryConstructorDeclaration(
-      FunctionExpression node,
-      ConstructorElement constructor,
-      NodeList parameters,
-      ResolutionInterfaceType redirectionType,
-      ConstructorElement redirectionTarget,
-      arg) {
-    visits.add(new Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL,
-        element: constructor,
-        parameters: parameters,
-        target: redirectionTarget,
-        type: redirectionType));
-    applyParameters(parameters, arg);
-  }
-
-  @override
-  visitRedirectingGenerativeConstructorDeclaration(
-      FunctionExpression node,
-      ConstructorElement constructor,
-      NodeList parameters,
-      NodeList initializers,
-      arg) {
-    visits.add(new Visit(
-        VisitKind.VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_DECL,
-        element: constructor,
-        parameters: parameters,
-        initializers: initializers));
-    applyParameters(parameters, arg);
-    applyInitializers(node, arg);
-  }
-
-  @override
-  visitStaticFunctionDeclaration(FunctionExpression node,
-      MethodElement function, NodeList parameters, Node body, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_DECL,
-        element: function, parameters: parameters, body: body));
-    applyParameters(parameters, arg);
-    apply(body, arg);
-  }
-
-  @override
-  visitSuperConstructorInvoke(
-      Send node,
-      ConstructorElement superConstructor,
-      ResolutionInterfaceType type,
-      NodeList arguments,
-      CallStructure callStructure,
-      arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_CONSTRUCTOR_INVOKE,
-        element: superConstructor,
-        type: type,
-        arguments: arguments,
-        selector: callStructure));
-    super.visitSuperConstructorInvoke(
-        node, superConstructor, type, arguments, callStructure, arg);
-  }
-
-  @override
-  visitImplicitSuperConstructorInvoke(FunctionExpression node,
-      ConstructorElement superConstructor, ResolutionInterfaceType type, arg) {
-    visits.add(new Visit(VisitKind.VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE,
-        element: superConstructor, type: type));
-    super
-        .visitImplicitSuperConstructorInvoke(node, superConstructor, type, arg);
-  }
-
-  @override
-  visitThisConstructorInvoke(Send node, ConstructorElement thisConstructor,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_THIS_CONSTRUCTOR_INVOKE,
-        element: thisConstructor,
-        arguments: arguments,
-        selector: callStructure));
-    super.visitThisConstructorInvoke(
-        node, thisConstructor, arguments, callStructure, arg);
-  }
-
-  @override
-  visitTopLevelFunctionDeclaration(FunctionExpression node,
-      MethodElement function, NodeList parameters, Node body, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_DECL,
-        element: function, parameters: parameters, body: body));
-    applyParameters(parameters, arg);
-    apply(body, arg);
-  }
-
-  @override
-  errorUnresolvedFieldInitializer(
-      SendSet node, Element element, Node initializer, arg) {
-    // TODO: implement errorUnresolvedFieldInitializer
-  }
-
-  @override
-  visitOptionalParameterDeclaration(
-      VariableDefinitions node,
-      Node definition,
-      ParameterElement parameter,
-      ConstantExpression defaultValue,
-      int index,
-      arg) {
-    visits.add(new Visit(VisitKind.VISIT_OPTIONAL_PARAMETER_DECL,
-        element: parameter,
-        constant: defaultValue != null ? defaultValue.toDartText() : null,
-        index: index));
-  }
-
-  @override
-  visitParameterDeclaration(VariableDefinitions node, Node definition,
-      ParameterElement parameter, int index, arg) {
-    visits.add(new Visit(VisitKind.VISIT_REQUIRED_PARAMETER_DECL,
-        element: parameter, index: index));
-  }
-
-  @override
-  visitInitializingFormalDeclaration(VariableDefinitions node, Node definition,
-      InitializingFormalElement initializingFormal, int index, arg) {
-    visits.add(new Visit(VisitKind.VISIT_REQUIRED_INITIALIZING_FORMAL_DECL,
-        element: initializingFormal, index: index));
-  }
-
-  @override
-  visitLocalVariableDeclaration(VariableDefinitions node, Node definition,
-      LocalVariableElement variable, Node initializer, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_DECL,
-        element: variable, rhs: initializer));
-    if (initializer != null) {
-      apply(initializer, arg);
-    }
-  }
-
-  @override
-  visitLocalConstantDeclaration(VariableDefinitions node, Node definition,
-      LocalVariableElement variable, ConstantExpression constant, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOCAL_CONSTANT_DECL,
-        element: variable, constant: constant.toDartText()));
-  }
-
-  @override
-  visitNamedInitializingFormalDeclaration(
-      VariableDefinitions node,
-      Node definition,
-      InitializingFormalElement initializingFormal,
-      ConstantExpression defaultValue,
-      arg) {
-    visits.add(new Visit(VisitKind.VISIT_NAMED_INITIALIZING_FORMAL_DECL,
-        element: initializingFormal,
-        constant: defaultValue != null ? defaultValue.toDartText() : null));
-  }
-
-  @override
-  visitNamedParameterDeclaration(VariableDefinitions node, Node definition,
-      ParameterElement parameter, ConstantExpression defaultValue, arg) {
-    visits.add(new Visit(VisitKind.VISIT_NAMED_PARAMETER_DECL,
-        element: parameter,
-        constant: defaultValue != null ? defaultValue.toDartText() : null));
-  }
-
-  @override
-  visitOptionalInitializingFormalDeclaration(
-      VariableDefinitions node,
-      Node definition,
-      InitializingFormalElement initializingFormal,
-      ConstantExpression defaultValue,
-      int index,
-      arg) {
-    visits.add(new Visit(VisitKind.VISIT_OPTIONAL_INITIALIZING_FORMAL_DECL,
-        element: initializingFormal,
-        constant: defaultValue != null ? defaultValue.toDartText() : null,
-        index: index));
-  }
-
-  @override
-  visitInstanceFieldDeclaration(VariableDefinitions node, Node definition,
-      FieldElement field, Node initializer, arg) {
-    visits.add(new Visit(VisitKind.VISIT_INSTANCE_FIELD_DECL,
-        element: field, rhs: initializer));
-    if (initializer != null) {
-      apply(initializer, arg);
-    }
-  }
-
-  @override
-  visitStaticConstantDeclaration(VariableDefinitions node, Node definition,
-      FieldElement field, ConstantExpression constant, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_CONSTANT_DECL,
-        element: field, constant: constant.toDartText()));
-  }
-
-  @override
-  visitStaticFieldDeclaration(VariableDefinitions node, Node definition,
-      FieldElement field, Node initializer, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_DECL,
-        element: field, rhs: initializer));
-    if (initializer != null) {
-      apply(initializer, arg);
-    }
-  }
-
-  @override
-  visitTopLevelConstantDeclaration(VariableDefinitions node, Node definition,
-      FieldElement field, ConstantExpression constant, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_CONSTANT_DECL,
-        element: field, constant: constant.toDartText()));
-  }
-
-  @override
-  visitTopLevelFieldDeclaration(VariableDefinitions node, Node definition,
-      FieldElement field, Node initializer, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_DECL,
-        element: field, rhs: initializer));
-    if (initializer != null) {
-      apply(initializer, arg);
-    }
-  }
-
-  @override
-  visitAbstractGetterDeclaration(
-      FunctionExpression node, MethodElement getter, arg) {
-    visits
-        .add(new Visit(VisitKind.VISIT_ABSTRACT_GETTER_DECL, element: getter));
-  }
-
-  @override
-  visitAbstractSetterDeclaration(
-      FunctionExpression node, MethodElement setter, NodeList parameters, arg) {
-    visits.add(new Visit(VisitKind.VISIT_ABSTRACT_SETTER_DECL,
-        element: setter, parameters: parameters));
-    applyParameters(parameters, arg);
-  }
-
-  @override
-  visitInstanceGetterDeclaration(
-      FunctionExpression node, MethodElement getter, Node body, arg) {
-    visits.add(new Visit(VisitKind.VISIT_INSTANCE_GETTER_DECL,
-        element: getter, body: body));
-    apply(body, arg);
-  }
-
-  @override
-  visitInstanceSetterDeclaration(FunctionExpression node, MethodElement setter,
-      NodeList parameters, Node body, arg) {
-    visits.add(new Visit(VisitKind.VISIT_INSTANCE_SETTER_DECL,
-        element: setter, parameters: parameters, body: body));
-    applyParameters(parameters, arg);
-    apply(body, arg);
-  }
-
-  @override
-  visitTopLevelGetterDeclaration(
-      FunctionExpression node, MethodElement getter, Node body, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_DECL,
-        element: getter, body: body));
-    apply(body, arg);
-  }
-
-  @override
-  visitTopLevelSetterDeclaration(FunctionExpression node, MethodElement setter,
-      NodeList parameters, Node body, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_DECL,
-        element: setter, parameters: parameters, body: body));
-    applyParameters(parameters, arg);
-    apply(body, arg);
-  }
-
-  @override
-  visitStaticGetterDeclaration(
-      FunctionExpression node, MethodElement getter, Node body, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_DECL,
-        element: getter, body: body));
-    apply(body, arg);
-  }
-
-  @override
-  visitStaticSetterDeclaration(FunctionExpression node, MethodElement setter,
-      NodeList parameters, Node body, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_SETTER_DECL,
-        element: setter, parameters: parameters, body: body));
-    applyParameters(parameters, arg);
-    apply(body, arg);
-  }
-}
diff --git a/tests/compiler/dart2js/old_frontend/semantic_visitor_test_send_data.dart b/tests/compiler/dart2js/old_frontend/semantic_visitor_test_send_data.dart
deleted file mode 100644
index b324d78..0000000
--- a/tests/compiler/dart2js/old_frontend/semantic_visitor_test_send_data.dart
+++ /dev/null
@@ -1,4184 +0,0 @@
-// Copyright (c) 2015, 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 dart2js.semantics_visitor_test;
-
-const Map<String, List<Test>> SEND_TESTS = const {
-  'Parameters': const [
-    // Parameters
-    const Test('m(o) => o;',
-        const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#o)')),
-    const Test(
-        'm(o) { o = 42; }',
-        const Visit(VisitKind.VISIT_PARAMETER_SET,
-            element: 'parameter(m#o)', rhs: '42')),
-    const Test(
-        'm(o) { o(null, 42); }',
-        const Visit(VisitKind.VISIT_PARAMETER_INVOKE,
-            element: 'parameter(m#o)',
-            arguments: '(null,42)',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        'm(final o) { o = 42; }',
-        const Visit(VisitKind.VISIT_FINAL_PARAMETER_SET,
-            element: 'parameter(m#o)', rhs: '42')),
-  ],
-  'Local variables': const [
-    // Local variables
-    const Test(
-        'm() { var o; return o; }',
-        const Visit(VisitKind.VISIT_LOCAL_VARIABLE_GET,
-            element: 'variable(m#o)')),
-    const Test(
-        'm() { var o; o = 42; }',
-        const Visit(VisitKind.VISIT_LOCAL_VARIABLE_SET,
-            element: 'variable(m#o)', rhs: '42')),
-    const Test(
-        'm() { var o; o(null, 42); }',
-        const Visit(VisitKind.VISIT_LOCAL_VARIABLE_INVOKE,
-            element: 'variable(m#o)',
-            arguments: '(null,42)',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        'm() { final o = 0; o = 42; }',
-        const Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_SET,
-            element: 'variable(m#o)', rhs: '42')),
-    const Test(
-        'm() { const o = 0; o = 42; }',
-        const Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_SET,
-            element: 'variable(m#o)', rhs: '42')),
-  ],
-  'Local functions': const [
-    // Local functions
-    const Test(
-        'm() { o(a, b) {}; return o; }',
-        const Visit(VisitKind.VISIT_LOCAL_FUNCTION_GET,
-            element: 'function(m#o)')),
-    const Test(
-        'm() { o(a, b) {}; o(null, 42); }',
-        const Visit(VisitKind.VISIT_LOCAL_FUNCTION_INVOKE,
-            element: 'function(m#o)',
-            arguments: '(null,42)',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        'm() { o(a) {}; o(null, 42); }',
-        const Visit(VisitKind.VISIT_LOCAL_FUNCTION_INCOMPATIBLE_INVOKE,
-            element: 'function(m#o)',
-            arguments: '(null,42)',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        'm() { o(a, b) {}; o = 42; }',
-        const Visit(VisitKind.VISIT_LOCAL_FUNCTION_SET,
-            element: 'function(m#o)', rhs: '42')),
-  ],
-  'Static fields': const [
-    // Static fields
-    const Test('''
-        class C { static var o; }
-        m() => C.o;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_GET, element: 'field(C#o)')),
-    const Test.clazz('''
-        class C {
-          static var o;
-          m() => o;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_GET, element: 'field(C#o)')),
-    const Test.clazz('''
-        class C {
-          static var o;
-          m() => C.o;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_GET, element: 'field(C#o)')),
-    const Test.prefix('''
-        class C {
-          static var o;
-        }
-        ''', 'm() => p.C.o;',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_GET, element: 'field(C#o)')),
-    const Test.clazz(
-        '''
-        class C {
-          var o;
-          static m() => o;
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_GET,
-            error: MessageKind.NO_INSTANCE_AVAILABLE)),
-    const Test.prefix(
-        '''
-        class C {
-          static var o;
-        }
-        ''',
-        'm() => p.C.o;',
-        const [
-          const Visit(VisitKind.PREVISIT_DEFERRED_ACCESS, element: 'prefix(p)'),
-          const Visit(VisitKind.VISIT_STATIC_FIELD_GET, element: 'field(C#o)'),
-        ],
-        isDeferred: true),
-    const Test('''
-        class C {
-          var o;
-        }
-        m() => C.o;
-        ''', const Visit(VisitKind.VISIT_UNRESOLVED_GET, name: 'o')),
-    const Test('''
-        class C {
-          var o;
-        }
-        m() { C.o = 42; }
-        ''', const Visit(VisitKind.VISIT_UNRESOLVED_SET, name: 'o', rhs: '42')),
-    const Test('''
-        class C {
-          C.o();
-        }
-        m() => C.o;
-        ''', const Visit(VisitKind.VISIT_UNRESOLVED_GET, name: 'o')),
-    const Test.prefix(
-        '''
-        ''',
-        'm() => p.C.o;',
-        const [
-          const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_GET,
-              receiver: 'p.C', name: 'o'),
-          const Visit(VisitKind.VISIT_UNRESOLVED_GET, name: 'C'),
-        ]),
-    const Test.prefix('''
-        class C {
-        }
-        ''', 'm() => p.C.o;',
-        const Visit(VisitKind.VISIT_UNRESOLVED_GET, name: 'o')),
-    const Test.prefix(
-        '''
-        ''',
-        'm() => p.C.o;',
-        const [
-          const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_GET,
-              receiver: 'p.C', name: 'o'),
-          const Visit(VisitKind.PREVISIT_DEFERRED_ACCESS, element: 'prefix(p)'),
-          const Visit(VisitKind.VISIT_UNRESOLVED_GET, name: 'C'),
-        ],
-        isDeferred: true),
-    const Test.prefix(
-        '''
-        class C {
-        }
-        ''',
-        'm() => p.C.o;',
-        const [
-          const Visit(VisitKind.PREVISIT_DEFERRED_ACCESS, element: 'prefix(p)'),
-          const Visit(VisitKind.VISIT_UNRESOLVED_GET, name: 'o'),
-        ],
-        isDeferred: true),
-    const Test('''
-        class C {}
-        m() => C.this;
-        ''', null),
-    const Test(
-        '''
-        class C {
-          static var o;
-        }
-        m() { C.o = 42; }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_SET,
-            element: 'field(C#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static var o;
-          m() { o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_SET,
-            element: 'field(C#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static var o;
-          m() { C.o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_SET,
-            element: 'field(C#o)', rhs: '42')),
-    const Test.prefix(
-        '''
-        class C {
-          static var o;
-        }
-        ''',
-        'm() { p.C.o = 42; }',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_SET,
-            element: 'field(C#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          var o;
-          static m() { o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_SET,
-            error: MessageKind.NO_INSTANCE_AVAILABLE, rhs: '42')),
-    const Test(
-        '''
-        class C {
-          static var o;
-        }
-        m() { C.o(null, 42); }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE,
-            element: 'field(C#o)', arguments: '(null,42)')),
-    const Test.clazz(
-        '''
-        class C {
-          static var o;
-          m() { o(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE,
-            element: 'field(C#o)', arguments: '(null,42)')),
-    const Test.clazz(
-        '''
-        class C {
-          static var o;
-          m() { C.o(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE,
-            element: 'field(C#o)', arguments: '(null,42)')),
-    const Test.clazz(
-        '''
-        class C {
-          var o;
-          static m() { o(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_INVOKE,
-            error: MessageKind.NO_INSTANCE_AVAILABLE, arguments: '(null,42)')),
-    const Test.prefix(
-        '''
-        class C {
-          static var o;
-        }
-        ''',
-        'm() { p.C.o(null, 42); }',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE,
-            element: 'field(C#o)', arguments: '(null,42)')),
-    const Test(
-        '''
-        class C {}
-        m() => C.this(null, 42);
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_INVOKE,
-            error: MessageKind.THIS_PROPERTY, arguments: '(null,42)')),
-    const Test(
-        '''
-        class C { static final o = 0; }
-        m() { C.o = 42; }
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_STATIC_FIELD_SET,
-            element: 'field(C#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static final o = 0;
-          m() { o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_STATIC_FIELD_SET,
-            element: 'field(C#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static final o = 0;
-          m() { C.o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_STATIC_FIELD_SET,
-            element: 'field(C#o)', rhs: '42')),
-    const Test.prefix(
-        '''
-        class C {
-          static final o = 0;
-        }
-        ''',
-        'm() { p.C.o = 42; }',
-        const Visit(VisitKind.VISIT_FINAL_STATIC_FIELD_SET,
-            element: 'field(C#o)', rhs: '42')),
-    const Test(
-        '''
-        class C { static const o = 0; }
-        m() { C.o = 42; }
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_STATIC_FIELD_SET,
-            element: 'field(C#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static const o = 0;
-          m() { o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_STATIC_FIELD_SET,
-            element: 'field(C#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static const o = 0;
-          m() { C.o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_STATIC_FIELD_SET,
-            element: 'field(C#o)', rhs: '42')),
-    const Test.prefix(
-        '''
-        class C {
-          static const o = 0;
-        }
-        ''',
-        'm() { p.C.o = 42; }',
-        const Visit(VisitKind.VISIT_FINAL_STATIC_FIELD_SET,
-            element: 'field(C#o)', rhs: '42')),
-  ],
-  'Static properties': const [
-    // Static properties
-    const Test('''
-        class C {
-          static get o => null;
-        }
-        m() => C.o;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_GET, element: 'getter(C#o)')),
-    const Test.clazz('''
-        class C {
-          static get o => null;
-          m() => o;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_GET, element: 'getter(C#o)')),
-    const Test.clazz('''
-        class C {
-          static get o => null;
-          m() => C.o;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_GET, element: 'getter(C#o)')),
-    const Test.prefix('''
-        class C {
-          static get o => null;
-        }
-        ''', 'm() => p.C.o;',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_GET, element: 'getter(C#o)')),
-    const Test(
-        '''
-        class C { static get o => 42; }
-        m() { C.o = 42; }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SET,
-            element: 'getter(C#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static get o => 42;
-          m() { o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SET,
-            element: 'getter(C#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static get o => 42;
-          m() { C.o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SET,
-            element: 'getter(C#o)', rhs: '42')),
-    const Test.prefix(
-        '''
-        class C {
-          static get o => 42;
-        }
-        ''',
-        'm() { p.C.o = 42; }',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SET,
-            element: 'getter(C#o)', rhs: '42')),
-    const Test('''
-        class C {
-          static set o(_) {}
-        }
-        m() => C.o;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_SETTER_GET, element: 'setter(C#o)')),
-    const Test.clazz('''
-        class C {
-          static set o(_) {}
-          m() => o;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_SETTER_GET, element: 'setter(C#o)')),
-
-    const Test.clazz('''
-        class C {
-          static set o(_) {}
-          m() => C.o;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_SETTER_GET, element: 'setter(C#o)')),
-    const Test.prefix('''
-        class C {
-          static set o(_) {}
-        }
-        ''', 'm() => p.C.o;',
-        const Visit(VisitKind.VISIT_STATIC_SETTER_GET, element: 'setter(C#o)')),
-    const Test(
-        '''
-        class C { static set o(_) {} }
-        m() { C.o = 42; }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_SETTER_SET,
-            element: 'setter(C#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static set o(_) {}
-          m() { o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_SETTER_SET,
-            element: 'setter(C#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static set o(_) {}
-          m() { C.o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_SETTER_SET,
-            element: 'setter(C#o)', rhs: '42')),
-    const Test.prefix(
-        '''
-        class C {
-          static set o(_) {}
-        }
-        ''',
-        'm() { p.C.o = 42; }',
-        const Visit(VisitKind.VISIT_STATIC_SETTER_SET,
-            element: 'setter(C#o)', rhs: '42')),
-    const Test(
-        '''
-        class C { static get o => null; }
-        m() => C.o(null, 42);
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE,
-            element: 'getter(C#o)', arguments: '(null,42)')),
-    const Test.clazz(
-        '''
-        class C {
-          static get o => null;
-          m() { o(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE,
-            element: 'getter(C#o)', arguments: '(null,42)')),
-    const Test.clazz(
-        '''
-        class C {
-          static get o => null;
-          m() { C.o(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE,
-            element: 'getter(C#o)', arguments: '(null,42)')),
-    const Test.prefix(
-        '''
-        class C {
-          static get o => null;
-        }
-        ''',
-        'm() { p.C.o(null, 42); }',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE,
-            element: 'getter(C#o)', arguments: '(null,42)')),
-    const Test(
-        '''
-        class C { static set o(_) {} }
-        m() => C.o(null, 42);
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_SETTER_INVOKE,
-            element: 'setter(C#o)', arguments: '(null,42)')),
-    const Test.clazz(
-        '''
-        class C {
-          static set o(_) {}
-          m() { o(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_SETTER_INVOKE,
-            element: 'setter(C#o)', arguments: '(null,42)')),
-    const Test.clazz(
-        '''
-        class C {
-          static set o(_) {}
-          m() { C.o(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_SETTER_INVOKE,
-            element: 'setter(C#o)', arguments: '(null,42)')),
-    const Test.prefix(
-        '''
-        class C {
-          static set o(_) {}
-        }
-        ''',
-        'm() { p.C.o(null, 42); }',
-        const Visit(VisitKind.VISIT_STATIC_SETTER_INVOKE,
-            element: 'setter(C#o)', arguments: '(null,42)')),
-  ],
-  'Static functions': const [
-    // Static functions
-    const Test(
-        '''
-        class C { static o(a, b) {} }
-        m() => C.o;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FUNCTION_GET,
-            element: 'function(C#o)')),
-    const Test.clazz(
-        '''
-        class C {
-          static o(a, b) {}
-          m() => o;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FUNCTION_GET,
-            element: 'function(C#o)')),
-    const Test.clazz(
-        '''
-        class C {
-          static o(a, b) {}
-          m() => C.o;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FUNCTION_GET,
-            element: 'function(C#o)')),
-    const Test.prefix(
-        '''
-        class C { static o(a, b) {} }
-        ''',
-        '''
-        m() => p.C.o;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FUNCTION_GET,
-            element: 'function(C#o)')),
-    const Test(
-        '''
-        class C { static o(a, b) {} }
-        m() { C.o = 42; }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FUNCTION_SET,
-            element: 'function(C#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static o(a, b) {}
-          m() { o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FUNCTION_SET,
-            element: 'function(C#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static o(a, b) {}
-          m() { C.o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FUNCTION_SET,
-            element: 'function(C#o)', rhs: '42')),
-    const Test.prefix(
-        '''
-        class C { static o(a, b) {} }
-        ''',
-        '''
-        m() { p.C.o = 42; }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FUNCTION_SET,
-            element: 'function(C#o)', rhs: '42')),
-    const Test(
-        '''
-        class C { static o(a, b) {} }
-        m() => C.o(null, 42);
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE,
-            element: 'function(C#o)', arguments: '(null,42)')),
-    const Test.clazz(
-        '''
-        class C {
-          static o(a, b) {}
-          m() { o(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE,
-            element: 'function(C#o)', arguments: '(null,42)')),
-    const Test.clazz(
-        '''
-        class C {
-          static o(a, b) {}
-          m() { C.o(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE,
-            element: 'function(C#o)', arguments: '(null,42)')),
-    const Test.prefix(
-        '''
-        class C {
-          static o(a, b) {}
-        }
-        ''',
-        'm() { p.C.o(null, 42); }',
-        const Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE,
-            element: 'function(C#o)', arguments: '(null,42)')),
-    const Test(
-        '''
-        class C { static o(a, b) {} }
-        m() => C.o(null);
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FUNCTION_INCOMPATIBLE_INVOKE,
-            element: 'function(C#o)', arguments: '(null)')),
-  ],
-  'Top level fields': const [
-    // Top level fields
-    const Test('''
-        var o;
-        m() => o;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_GET, element: 'field(o)')),
-    const Test.prefix('''
-        var o;
-        ''', 'm() => p.o;',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_GET, element: 'field(o)')),
-    const Test.prefix(
-        '''
-        var o;
-        ''',
-        'm() => p.o;',
-        const [
-          const Visit(VisitKind.PREVISIT_DEFERRED_ACCESS, element: 'prefix(p)'),
-          const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_GET, element: 'field(o)'),
-        ],
-        isDeferred: true),
-    const Test.prefix('''
-        ''', 'm() => p.o;',
-        const Visit(VisitKind.VISIT_UNRESOLVED_GET, name: 'o')),
-    const Test.prefix(
-        '''
-        ''',
-        'm() => p.o;',
-        const [
-          const Visit(VisitKind.PREVISIT_DEFERRED_ACCESS, element: 'prefix(p)'),
-          const Visit(VisitKind.VISIT_UNRESOLVED_GET, name: 'o'),
-        ],
-        isDeferred: true),
-    const Test.prefix(
-        '''
-        ''',
-        'm() => p;',
-        const Visit(VisitKind.ERROR_INVALID_GET,
-            error: MessageKind.PREFIX_AS_EXPRESSION)),
-    const Test(
-        '''
-        var o;
-        m() { o = 42; }
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_SET,
-            element: 'field(o)', rhs: '42')),
-    const Test.prefix(
-        '''
-        var o;
-        ''',
-        'm() { p.o = 42; }',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_SET,
-            element: 'field(o)', rhs: '42')),
-    const Test.prefix(
-        '''
-        ''',
-        'm() { p = 42; }',
-        const Visit(VisitKind.ERROR_INVALID_SET,
-            error: MessageKind.PREFIX_AS_EXPRESSION, rhs: '42')),
-    const Test(
-        '''
-        final o = 0;
-        m() { o = 42; }
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_TOP_LEVEL_FIELD_SET,
-            element: 'field(o)', rhs: '42')),
-    const Test.prefix(
-        '''
-        final o = 0;
-        ''',
-        'm() { p.o = 42; }',
-        const Visit(VisitKind.VISIT_FINAL_TOP_LEVEL_FIELD_SET,
-            element: 'field(o)', rhs: '42')),
-    const Test(
-        '''
-        const o = 0;
-        m() { o = 42; }
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_TOP_LEVEL_FIELD_SET,
-            element: 'field(o)', rhs: '42')),
-    const Test.prefix(
-        '''
-        const o = 0;
-        ''',
-        'm() { p.o = 42; }',
-        const Visit(VisitKind.VISIT_FINAL_TOP_LEVEL_FIELD_SET,
-            element: 'field(o)', rhs: '42')),
-    const Test(
-        '''
-        var o;
-        m() { o(null, 42); }
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_INVOKE,
-            element: 'field(o)', arguments: '(null,42)')),
-    const Test.prefix(
-        '''
-        var o;
-        ''',
-        'm() { p.o(null, 42); }',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_INVOKE,
-            element: 'field(o)', arguments: '(null,42)')),
-    const Test.prefix(
-        '''
-        ''',
-        'm() { p(null, 42); }',
-        const Visit(VisitKind.ERROR_INVALID_INVOKE,
-            error: MessageKind.PREFIX_AS_EXPRESSION, arguments: '(null,42)')),
-    const Test('''
-        m() => o;
-        ''', const Visit(VisitKind.VISIT_UNRESOLVED_GET, name: 'o')),
-    const Test('''
-        m() { o = 42; }
-        ''', const Visit(VisitKind.VISIT_UNRESOLVED_SET, name: 'o', rhs: '42')),
-  ],
-  'Top level properties': const [
-    // Top level properties
-    const Test(
-        '''
-        get o => null;
-        m() => o;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_GET,
-            element: 'getter(o)')),
-    const Test.prefix(
-        '''
-        get o => null;
-        ''',
-        '''
-        m() => p.o;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_GET,
-            element: 'getter(o)')),
-    const Test(
-        '''
-        set o(_) {}
-        m() => o;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_GET,
-            element: 'setter(o)')),
-    const Test.prefix(
-        '''
-        set o(_) {}
-        ''',
-        '''
-        m() => p.o;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_GET,
-            element: 'setter(o)')),
-    const Test(
-        '''
-        get o => null;
-        m() { o = 42; }
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SET,
-            element: 'getter(o)', rhs: '42')),
-    const Test.prefix(
-        '''
-        get o => null;
-        ''',
-        'm() { p.o = 42; }',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SET,
-            element: 'getter(o)', rhs: '42')),
-    const Test(
-        '''
-        set o(_) {}
-        m() { o = 42; }
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_SET,
-            element: 'setter(o)', rhs: '42')),
-    const Test.prefix(
-        '''
-        set o(_) {}
-        ''',
-        'm() { p.o = 42; }',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_SET,
-            element: 'setter(o)', rhs: '42')),
-    const Test(
-        '''
-        get o => null;
-        m() => o(null, 42);
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_INVOKE,
-            element: 'getter(o)', arguments: '(null,42)')),
-    const Test.prefix(
-        '''
-        get o => null;
-        ''',
-        'm() { p.o(null, 42); }',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_INVOKE,
-            element: 'getter(o)', arguments: '(null,42)')),
-    const Test(
-        '''
-        set o(_) {}
-        m() => o(null, 42);
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_INVOKE,
-            element: 'setter(o)', arguments: '(null,42)')),
-    const Test.prefix(
-        '''
-        set o(_) {}
-        ''',
-        'm() { p.o(null, 42); }',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_INVOKE,
-            element: 'setter(o)', arguments: '(null,42)')),
-  ],
-  'Top level functions': const [
-    // Top level functions
-    const Test(
-        '''
-        o(a, b) {}
-        m() => o;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_GET,
-            element: 'function(o)')),
-    const Test(
-        '''
-        o(a, b) {}
-        m() => o(null, 42);
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INVOKE,
-            element: 'function(o)', arguments: '(null,42)')),
-    const Test(
-        '''
-        o(a, b) {}
-        m() => o(null);
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INCOMPATIBLE_INVOKE,
-            element: 'function(o)', arguments: '(null)')),
-    const Test.prefix(
-        '''
-        o(a, b) {}
-        ''',
-        'm() { p.o(null, 42); }',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INVOKE,
-            element: 'function(o)', arguments: '(null,42)')),
-    const Test(
-        '''
-        m() => o(null, 42);
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_INVOKE,
-            name: 'o', arguments: '(null,42)')),
-    const Test.prefix(
-        '''
-        o(a, b) {}
-        ''',
-        'm() => p.o(null, 42);',
-        const [
-          const Visit(VisitKind.PREVISIT_DEFERRED_ACCESS, element: 'prefix(p)'),
-          const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INVOKE,
-              element: 'function(o)', arguments: '(null,42)'),
-        ],
-        isDeferred: true),
-    const Test.prefix(
-        '''
-        ''',
-        'm() => p.o(null, 42);',
-        const Visit(VisitKind.VISIT_UNRESOLVED_INVOKE,
-            name: 'o', arguments: '(null,42)')),
-    const Test.prefix(
-        '''
-        ''',
-        'm() => p.o(null, 42);',
-        const [
-          const Visit(VisitKind.PREVISIT_DEFERRED_ACCESS, element: 'prefix(p)'),
-          const Visit(VisitKind.VISIT_UNRESOLVED_INVOKE,
-              name: 'o', arguments: '(null,42)'),
-        ],
-        isDeferred: true),
-    const Test.prefix(
-        '''
-        ''',
-        'm() => p(null, 42);',
-        const Visit(VisitKind.ERROR_INVALID_INVOKE,
-            error: MessageKind.PREFIX_AS_EXPRESSION, arguments: '(null,42)')),
-    const Test(
-        '''
-        o(a, b) {}
-        m() { o = 42; }
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_SET,
-            element: 'function(o)', rhs: '42')),
-    const Test.prefix(
-        '''
-        o(a, b) {}
-        ''',
-        'm() { p.o = 42; }',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_SET,
-            element: 'function(o)', rhs: '42')),
-  ],
-  'Dynamic properties': const [
-    // Dynamic properties
-    const Test('m(o) => o.foo;', const [
-      const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_GET,
-          receiver: 'o', name: 'foo'),
-      const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#o)'),
-    ]),
-    const Test('m(o) { o.foo = 42; }', const [
-      const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_SET,
-          receiver: 'o', name: 'foo', rhs: '42'),
-      const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#o)'),
-    ]),
-    const Test('m(o) { o.foo(null, 42); }', const [
-      const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_INVOKE,
-          receiver: 'o', name: 'foo', arguments: '(null,42)'),
-      const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#o)'),
-    ]),
-  ],
-  'This access': const [
-    // This access
-    const Test.clazz('''
-        class C {
-          m() => this;
-        }
-        ''', const Visit(VisitKind.VISIT_THIS_GET)),
-    const Test.clazz('''
-        class C {
-          call(a, b) {}
-          m() { this(null, 42); }
-        }
-        ''', const Visit(VisitKind.VISIT_THIS_INVOKE, arguments: '(null,42)')),
-    const Test.clazz(
-        '''
-        class C {
-          call(a, b) {}
-          static m() { this(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_INVOKE,
-            error: MessageKind.NO_THIS_AVAILABLE, arguments: '(null,42)')),
-  ],
-  'This properties': const [
-    // This properties
-    const Test.clazz('''
-        class C {
-          var foo;
-          m() => foo;
-        }
-        ''', const Visit(VisitKind.VISIT_THIS_PROPERTY_GET, name: 'foo')),
-    const Test.clazz('''
-        class C {
-          var foo;
-          m() => this.foo;
-        }
-        ''', const Visit(VisitKind.VISIT_THIS_PROPERTY_GET, name: 'foo')),
-    const Test.clazz('''
-        class C {
-          get foo => null;
-          m() => foo;
-        }
-        ''', const Visit(VisitKind.VISIT_THIS_PROPERTY_GET, name: 'foo')),
-    const Test.clazz(
-        '''
-        class C {
-          var foo;
-          static m() => this.foo;
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_GET,
-            error: MessageKind.NO_THIS_AVAILABLE)),
-    const Test.clazz('''
-        class C {
-          get foo => null;
-          m() => this.foo;
-        }
-        ''', const Visit(VisitKind.VISIT_THIS_PROPERTY_GET, name: 'foo')),
-    const Test.clazz('''
-        class C {
-          var foo;
-          m() { foo = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_THIS_PROPERTY_SET, name: 'foo', rhs: '42')),
-    const Test.clazz('''
-        class C {
-          var foo;
-          m() { this.foo = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_THIS_PROPERTY_SET, name: 'foo', rhs: '42')),
-    const Test.clazz('''
-        class C {
-          set foo(_) {}
-          m() { foo = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_THIS_PROPERTY_SET, name: 'foo', rhs: '42')),
-    const Test.clazz('''
-        class C {
-          set foo(_) {}
-          m() { this.foo = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_THIS_PROPERTY_SET, name: 'foo', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          var foo;
-          m() { foo(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_THIS_PROPERTY_INVOKE,
-            name: 'foo', arguments: '(null,42)')),
-    const Test.clazz(
-        '''
-        class C {
-          var foo;
-          m() { this.foo(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_THIS_PROPERTY_INVOKE,
-            name: 'foo', arguments: '(null,42)')),
-    const Test.clazz(
-        '''
-        class C {
-          var foo;
-          static m() { this.foo(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_INVOKE,
-            error: MessageKind.NO_THIS_AVAILABLE, arguments: '(null,42)')),
-  ],
-  'Super fields': const [
-    // Super fields
-    const Test.clazz('''
-        class B {
-          var o;
-        }
-        class C extends B {
-          m() => super.o;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_FIELD_GET, element: 'field(B#o)')),
-    const Test.clazz(
-        '''
-        class B {
-          var o;
-        }
-        class C extends B {
-          m() { super.o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_FIELD_SET,
-            element: 'field(B#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          final o = 0;
-        }
-        class C extends B {
-          m() { super.o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_SUPER_FIELD_SET,
-            element: 'field(B#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          var o;
-        }
-        class C extends B {
-          m() { super.o(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_FIELD_INVOKE,
-            element: 'field(B#o)', arguments: '(null,42)')),
-    const Test.clazz('''
-        class B {
-        }
-        class C extends B {
-          m() => super.o;
-        }
-        ''', const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GET)),
-    const Test.clazz('''
-    class B {
-    }
-    class C extends B {
-      m() => super.o = 42;
-    }
-    ''', const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SET, rhs: '42')),
-  ],
-  'Super properties': const [
-    // Super properties
-    const Test.clazz('''
-        class B {
-          get o => null;
-        }
-        class C extends B {
-          m() => super.o;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_GETTER_GET, element: 'getter(B#o)')),
-    const Test.clazz('''
-        class B {
-          set o(_) {}
-        }
-        class C extends B {
-          m() => super.o;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_SETTER_GET, element: 'setter(B#o)')),
-    const Test.clazz(
-        '''
-        class B {
-          get o => 0;
-        }
-        class C extends B {
-          m() { super.o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_GETTER_SET,
-            element: 'getter(B#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          set o(_) {}
-        }
-        class C extends B {
-          m() { super.o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_SETTER_SET,
-            element: 'setter(B#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          get o => null;
-        }
-        class C extends B {
-          m() { super.o(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_GETTER_INVOKE,
-            element: 'getter(B#o)', arguments: '(null,42)')),
-    const Test.clazz(
-        '''
-        class B {
-          set o(_) {}
-        }
-        class C extends B {
-          m() { super.o(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_SETTER_INVOKE,
-            element: 'setter(B#o)', arguments: '(null,42)')),
-  ],
-  'Super methods': const [
-    // Super methods
-    const Test.clazz(
-        '''
-        class B {
-          o(a, b) {}
-        }
-        class C extends B {
-          m() => super.o;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_METHOD_GET,
-            element: 'function(B#o)')),
-    const Test.clazz(
-        '''
-        class B {
-          o(a, b) {}
-        }
-        class C extends B {
-          m() { super.o = 42; }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_METHOD_SET,
-            element: 'function(B#o)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          o(a, b) {}
-        }
-        class C extends B {
-          m() { super.o(null, 42); }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_METHOD_INVOKE,
-            element: 'function(B#o)', arguments: '(null,42)')),
-    const Test.clazz(
-        '''
-        class B {
-          o(a, b) {}
-        }
-        class C extends B {
-          m() { super.o(null); }
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_METHOD_INCOMPATIBLE_INVOKE,
-            element: 'function(B#o)', arguments: '(null)')),
-    const Test.clazz(
-        '''
-            class B {
-            }
-            class C extends B {
-              m() => super.o(null, 42);
-            }
-            ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INVOKE,
-            arguments: '(null,42)')),
-  ],
-  'Expression invoke': const [
-    // Expression invoke
-    const Test(
-        'm() => (a, b){}(null, 42);',
-        const Visit(VisitKind.VISIT_EXPRESSION_INVOKE,
-            receiver: '(a,b){}', arguments: '(null,42)')),
-  ],
-  'Class type literals': const [
-    // Class type literals
-    const Test('''
-        class C {}
-        m() => C;
-        ''',
-        const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_GET, constant: 'C')),
-    const Test(
-        '''
-        class C {}
-        m() => C(null, 42);
-        ''',
-        const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_INVOKE,
-            constant: 'C', arguments: '(null,42)')),
-    const Test(
-        '''
-        class C {}
-        m() => C = 42;
-        ''',
-        const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_SET,
-            constant: 'C', rhs: '42')),
-    const Test(
-        '''
-        class C {}
-        m() => C += 42;
-        ''',
-        const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_COMPOUND,
-            constant: 'C', operator: '+=', rhs: '42')),
-    const Test(
-        '''
-        class C {}
-        m() => C ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_SET_IF_NULL,
-            constant: 'C', rhs: '42')),
-    const Test(
-        '''
-        class C {}
-        m() => ++C;
-        ''',
-        const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_PREFIX,
-            constant: 'C', operator: '++')),
-    const Test(
-        '''
-        class C {}
-        m() => C--;
-        ''',
-        const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_POSTFIX,
-            constant: 'C', operator: '--')),
-    const Test('''
-        class C {}
-        m() => (C).hashCode;
-        ''', const [
-      const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_GET,
-          receiver: '(C)', name: 'hashCode'),
-      const Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_GET, constant: 'C'),
-    ]),
-  ],
-  'Typedef type literals': const [
-    // Typedef type literals
-    const Test('''
-        typedef F();
-        m() => F;
-        ''',
-        const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_GET, constant: 'F')),
-    const Test(
-        '''
-        typedef F();
-        m() => F(null, 42);
-        ''',
-        const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_INVOKE,
-            constant: 'F', arguments: '(null,42)')),
-    const Test(
-        '''
-        typedef F();
-        m() => F = 42;
-        ''',
-        const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_SET,
-            constant: 'F', rhs: '42')),
-    const Test(
-        '''
-        typedef F();
-        m() => F += 42;
-        ''',
-        const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND,
-            constant: 'F', operator: '+=', rhs: '42')),
-    const Test(
-        '''
-        typedef F();
-        m() => F ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_SET_IF_NULL,
-            constant: 'F', rhs: '42')),
-    const Test(
-        '''
-        typedef F();
-        m() => ++F;
-        ''',
-        const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_PREFIX,
-            constant: 'F', operator: '++')),
-    const Test(
-        '''
-        typedef F();
-        m() => F--;
-        ''',
-        const Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_POSTFIX,
-            constant: 'F', operator: '--')),
-  ],
-  'Type variable type literals': const [
-    // Type variable type literals
-    const Test.clazz(
-        '''
-        class C<T> {
-          m() => T;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_GET,
-            element: 'type_variable(C#T)')),
-    const Test.clazz(
-        '''
-        class C<T> {
-          m() => T(null, 42);
-        }
-        ''',
-        const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_INVOKE,
-            element: 'type_variable(C#T)', arguments: '(null,42)')),
-    const Test.clazz(
-        '''
-        class C<T> {
-          m() => T = 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET,
-            element: 'type_variable(C#T)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C<T> {
-          m() => T += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND,
-            element: 'type_variable(C#T)', operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C<T> {
-          m() => T ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET_IF_NULL,
-            element: 'type_variable(C#T)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C<T> {
-          m() => ++T;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_PREFIX,
-            element: 'type_variable(C#T)', operator: '++')),
-    const Test.clazz(
-        '''
-        class C<T> {
-          m() => T--;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_POSTFIX,
-            element: 'type_variable(C#T)', operator: '--')),
-    const Test.clazz(
-        '''
-        class C<T> {
-          static m() => T;
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_GET,
-            error: MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER)),
-    const Test.clazz(
-        '''
-        class C<T> {
-          static m() => T(null, 42);
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_INVOKE,
-            error: MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER,
-            arguments: '(null,42)')),
-    const Test.clazz(
-        '''
-        class C<T> {
-          static m() => T ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_SET_IF_NULL,
-            error: MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER, rhs: '42')),
-    const Test.clazz(
-        '''
-        class C<T> {
-          static m() => T ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_SET_IF_NULL,
-            error: MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER, rhs: '42')),
-    const Test.clazz(
-        '''
-        class C<T> {
-          static m() => ++T;
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_PREFIX,
-            error: MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER,
-            operator: '++')),
-    const Test.clazz(
-        '''
-        class C<T> {
-          static m() => T--;
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_POSTFIX,
-            error: MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER,
-            operator: '--')),
-  ],
-  'Dynamic type literals': const [
-    // Dynamic type literals
-    const Test(
-        '''
-        m() => dynamic;
-        ''',
-        const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_GET,
-            constant: 'dynamic')),
-    const Test(
-        '''
-        m() { dynamic(null, 42); }
-        ''',
-        const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_INVOKE,
-            constant: 'dynamic', arguments: '(null,42)')),
-    const Test(
-        '''
-        m() => dynamic = 42;
-        ''',
-        const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_SET,
-            constant: 'dynamic', rhs: '42')),
-    const Test(
-        '''
-        m() => dynamic += 42;
-        ''',
-        const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_COMPOUND,
-            constant: 'dynamic', operator: '+=', rhs: '42')),
-    const Test(
-        '''
-        m() => dynamic ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_SET_IF_NULL,
-            constant: 'dynamic', rhs: '42')),
-    const Test(
-        '''
-        m() => ++dynamic;
-        ''',
-        const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_PREFIX,
-            constant: 'dynamic', operator: '++')),
-    const Test(
-        '''
-        m() => dynamic--;
-        ''',
-        const Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_POSTFIX,
-            constant: 'dynamic', operator: '--')),
-  ],
-  'Assert': const [
-    // Assert
-    const Test(
-        '''
-        m() { assert(m()); }
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INVOKE,
-            element: 'function(m)', arguments: '()')),
-  ],
-  'Logical and': const [
-    // Logical and
-    const Test('''
-        m() => true && false;
-        ''',
-        const Visit(VisitKind.VISIT_LOGICAL_AND, left: 'true', right: 'false')),
-  ],
-  'Logical or': const [
-    // Logical or
-    const Test('''
-        m() => true || false;
-        ''',
-        const Visit(VisitKind.VISIT_LOGICAL_OR, left: 'true', right: 'false')),
-  ],
-  'Is test': const [
-    // Is test
-    const Test('''
-        class C {}
-        m() => 0 is C;
-        ''', const Visit(VisitKind.VISIT_IS, expression: '0', type: 'C')),
-  ],
-  'Is not test': const [
-    // Is not test
-    const Test('''
-        class C {}
-        m() => 0 is! C;
-        ''', const Visit(VisitKind.VISIT_IS_NOT, expression: '0', type: 'C')),
-  ],
-  'As test': const [
-    // As test
-    const Test('''
-        class C {}
-        m() => 0 as C;
-        ''', const Visit(VisitKind.VISIT_AS, expression: '0', type: 'C')),
-  ],
-  'Binary operators': const [
-    // Binary operators
-    const Test(
-        '''
-        m() => 2 + 3;
-        ''',
-        const Visit(VisitKind.VISIT_BINARY,
-            left: '2', operator: '+', right: '3')),
-    const Test(
-        '''
-        m() => 2 - 3;
-        ''',
-        const Visit(VisitKind.VISIT_BINARY,
-            left: '2', operator: '-', right: '3')),
-    const Test(
-        '''
-        m() => 2 * 3;
-        ''',
-        const Visit(VisitKind.VISIT_BINARY,
-            left: '2', operator: '*', right: '3')),
-    const Test(
-        '''
-        m() => 2 / 3;
-        ''',
-        const Visit(VisitKind.VISIT_BINARY,
-            left: '2', operator: '/', right: '3')),
-    const Test(
-        '''
-        m() => 2 ~/ 3;
-        ''',
-        const Visit(VisitKind.VISIT_BINARY,
-            left: '2', operator: '~/', right: '3')),
-    const Test(
-        '''
-        m() => 2 % 3;
-        ''',
-        const Visit(VisitKind.VISIT_BINARY,
-            left: '2', operator: '%', right: '3')),
-    const Test(
-        '''
-        m() => 2 << 3;
-        ''',
-        const Visit(VisitKind.VISIT_BINARY,
-            left: '2', operator: '<<', right: '3')),
-    const Test(
-        '''
-        m() => 2 >> 3;
-        ''',
-        const Visit(VisitKind.VISIT_BINARY,
-            left: '2', operator: '>>', right: '3')),
-    const Test(
-        '''
-        m() => 2 <= 3;
-        ''',
-        const Visit(VisitKind.VISIT_BINARY,
-            left: '2', operator: '<=', right: '3')),
-    const Test(
-        '''
-        m() => 2 < 3;
-        ''',
-        const Visit(VisitKind.VISIT_BINARY,
-            left: '2', operator: '<', right: '3')),
-    const Test(
-        '''
-        m() => 2 >= 3;
-        ''',
-        const Visit(VisitKind.VISIT_BINARY,
-            left: '2', operator: '>=', right: '3')),
-    const Test(
-        '''
-        m() => 2 > 3;
-        ''',
-        const Visit(VisitKind.VISIT_BINARY,
-            left: '2', operator: '>', right: '3')),
-    const Test(
-        '''
-        m() => 2 & 3;
-        ''',
-        const Visit(VisitKind.VISIT_BINARY,
-            left: '2', operator: '&', right: '3')),
-    const Test(
-        '''
-        m() => 2 | 3;
-        ''',
-        const Visit(VisitKind.VISIT_BINARY,
-            left: '2', operator: '|', right: '3')),
-    const Test(
-        '''
-        m() => 2 ^ 3;
-        ''',
-        const Visit(VisitKind.VISIT_BINARY,
-            left: '2', operator: '^', right: '3')),
-    const Test.clazz(
-        '''
-        class B {
-          operator +(_) => null;
-        }
-        class C extends B {
-          m() => super + 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_BINARY,
-            element: 'function(B#+)', operator: '+', right: '42')),
-    const Test.clazz(
-        '''
-        class B {}
-        class C extends B {
-          m() => super + 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_BINARY,
-            operator: '+', right: '42')),
-    const Test(
-        '''
-        m() => 2 === 3;
-        ''',
-        const Visit(VisitKind.ERROR_UNDEFINED_BINARY_EXPRESSION,
-            left: '2', operator: '===', right: '3')),
-    const Test(
-        '''
-        m() => 2 !== 3;
-        ''',
-        const Visit(VisitKind.ERROR_UNDEFINED_BINARY_EXPRESSION,
-            left: '2', operator: '!==', right: '3')),
-    const Test.clazz(
-        '''
-        class B {
-          operator +(_) => null;
-        }
-        class C extends B {
-          static m() => super + 42;
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_BINARY,
-            error: MessageKind.NO_SUPER_IN_STATIC, operator: '+', right: '42')),
-  ],
-  'Index': const [
-    // Index
-    const Test('''
-        m() => 2[3];
-        ''', const Visit(VisitKind.VISIT_INDEX, receiver: '2', index: '3')),
-    const Test(
-        '''
-        m() => --2[3];
-        ''',
-        const Visit(VisitKind.VISIT_INDEX_PREFIX,
-            receiver: '2', index: '3', operator: '--')),
-    const Test(
-        '''
-        m() => 2[3]++;
-        ''',
-        const Visit(VisitKind.VISIT_INDEX_POSTFIX,
-            receiver: '2', index: '3', operator: '++')),
-    const Test.clazz(
-        '''
-        class B {
-          operator [](_) => null;
-        }
-        class C extends B {
-          m() => super[42];
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_INDEX,
-            element: 'function(B#[])', index: '42')),
-    const Test.clazz('''
-        class B {
-        }
-        class C extends B {
-          m() => super[42];
-        }
-        ''', const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX, index: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          operator [](_) => null;
-        }
-        class C extends B {
-          static m() => super[42];
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_INDEX,
-            error: MessageKind.NO_SUPER_IN_STATIC, index: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          operator [](_) => null;
-          operator []=(a, b) {}
-        }
-        class C extends B {
-          m() => ++super[42];
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_INDEX_PREFIX,
-            getter: 'function(B#[])',
-            setter: 'function(B#[]=)',
-            index: '42',
-            operator: '++')),
-    const Test.clazz(
-        '''
-        class B {
-          operator []=(a, b) {}
-        }
-        class C extends B {
-          m() => ++super[42];
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_INDEX_PREFIX,
-            setter: 'function(B#[]=)', index: '42', operator: '++')),
-    const Test.clazz(
-        '''
-        class B {
-        }
-        class C extends B {
-          m() => ++super[42];
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_PREFIX,
-            index: '42', operator: '++')),
-    const Test.clazz(
-        '''
-        class B {
-          operator [](_) => null;
-        }
-        class C extends B {
-          m() => ++super[42];
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_INDEX_PREFIX,
-            getter: 'function(B#[])', index: '42', operator: '++')),
-    const Test.clazz(
-        '''
-        class B {
-          operator [](_) => null;
-          operator []=(a, b) {}
-        }
-        class C extends B {
-          static m() => ++super[42];
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_INDEX_PREFIX,
-            error: MessageKind.NO_SUPER_IN_STATIC,
-            index: '42',
-            operator: '++')),
-    const Test.clazz(
-        '''
-        class B {
-          operator [](_) => null;
-          operator []=(a, b) {}
-        }
-        class C extends B {
-          m() => super[42]--;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_INDEX_POSTFIX,
-            getter: 'function(B#[])',
-            setter: 'function(B#[]=)',
-            index: '42',
-            operator: '--')),
-    const Test.clazz(
-        '''
-        class B {
-          operator []=(a, b) {}
-        }
-        class C extends B {
-          m() => super[42]--;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_INDEX_POSTFIX,
-            setter: 'function(B#[]=)', index: '42', operator: '--')),
-    const Test.clazz(
-        '''
-        class B {
-        }
-        class C extends B {
-          m() => super[42]--;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_POSTFIX,
-            index: '42', operator: '--')),
-    const Test.clazz(
-        '''
-        class B {
-          operator [](_) => null;
-        }
-        class C extends B {
-          m() => super[42]--;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_INDEX_POSTFIX,
-            getter: 'function(B#[])', index: '42', operator: '--')),
-    const Test.clazz(
-        '''
-        class B {
-          operator [](_) => null;
-          operator []=(a, b) {}
-        }
-        class C extends B {
-          static m() => super[42]--;
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_INDEX_POSTFIX,
-            error: MessageKind.NO_SUPER_IN_STATIC,
-            index: '42',
-            operator: '--')),
-    const Test(
-        '''
-        m() => [][42] ??= 0;
-        ''',
-        const Visit(VisitKind.VISIT_INDEX_SET_IF_NULL,
-            receiver: '[] ', index: '42', rhs: '0')),
-    const Test.clazz(
-        '''
-        class B {
-          operator [](_) => null;
-          operator []=(a, b) {}
-        }
-        class C extends B {
-          m() => super[42] ??= 0;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_INDEX_SET_IF_NULL,
-            getter: 'function(B#[])',
-            setter: 'function(B#[]=)',
-            index: '42',
-            rhs: '0')),
-    const Test.clazz(
-        '''
-        class B {
-          operator []=(a, b) {}
-        }
-        class C extends B {
-          m() => super[42] ??= 0;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_INDEX_SET_IF_NULL,
-            setter: 'function(B#[]=)', index: '42', rhs: '0')),
-    const Test.clazz(
-        '''
-        class B {
-          operator [](_) => null;
-        }
-        class C extends B {
-          m() => super[42] ??= 0;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_INDEX_SET_IF_NULL,
-            getter: 'function(B#[])', index: '42', rhs: '0')),
-    const Test.clazz(
-        '''
-        class B {
-        }
-        class C extends B {
-          m() => super[42] ??= 0;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_SET_IF_NULL,
-            index: '42', rhs: '0')),
-  ],
-  'Equals': const [
-    // Equals
-    const Test('''
-        m() => 2 == 3;
-        ''', const Visit(VisitKind.VISIT_EQUALS, left: '2', right: '3')),
-    const Test.clazz(
-        '''
-        class B {
-          operator ==(_) => null;
-        }
-        class C extends B {
-          m() => super == 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_EQUALS,
-            element: 'function(B#==)', right: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          operator ==(_) => null;
-        }
-        class C extends B {
-          static m() => super == 42;
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_EQUALS,
-            error: MessageKind.NO_SUPER_IN_STATIC, right: '42')),
-  ],
-  'Not equals': const [
-    // Not equals
-    const Test('''
-        m() => 2 != 3;
-        ''', const Visit(VisitKind.VISIT_NOT_EQUALS, left: '2', right: '3')),
-    const Test.clazz(
-        '''
-        class B {
-          operator ==(_) => null;
-        }
-        class C extends B {
-          m() => super != 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_NOT_EQUALS,
-            element: 'function(B#==)', right: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          operator ==(_) => null;
-        }
-        class C extends B {
-          static m() => super != 42;
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_NOT_EQUALS,
-            error: MessageKind.NO_SUPER_IN_STATIC, right: '42')),
-  ],
-  'Unary expression': const [
-    // Unary expression
-    const Test('''
-        m() => -false;
-        ''',
-        const Visit(VisitKind.VISIT_UNARY, expression: 'false', operator: '-')),
-    const Test('''
-        m() => ~false;
-        ''',
-        const Visit(VisitKind.VISIT_UNARY, expression: 'false', operator: '~')),
-    const Test.clazz(
-        '''
-        class B {
-          operator -() => null;
-        }
-        class C extends B {
-          m() => -super;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_UNARY,
-            element: 'function(B#unary-)', operator: '-')),
-    const Test.clazz('''
-        class B {
-        }
-        class C extends B {
-          m() => -super;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_UNARY, operator: '-')),
-    const Test.clazz(
-        '''
-        class B {
-          operator ~() => null;
-        }
-        class C extends B {
-          m() => ~super;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_UNARY,
-            element: 'function(B#~)', operator: '~')),
-    const Test.clazz(
-        '''
-        class B {
-          operator -() => null;
-        }
-        class C extends B {
-          static m() => -super;
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_UNARY,
-            error: MessageKind.NO_SUPER_IN_STATIC, operator: '-')),
-    const Test('''
-        m() => !0;
-        ''', const Visit(VisitKind.VISIT_NOT, expression: '0')),
-  ],
-  'Index set': const [
-    // Index set
-    const Test(
-        '''
-        m() => 0[1] = 2;
-        ''',
-        const Visit(VisitKind.VISIT_INDEX_SET,
-            receiver: '0', index: '1', rhs: '2')),
-    const Test.clazz(
-        '''
-        class B {
-          operator []=(a, b) {}
-        }
-        class C extends B {
-          m() => super[1] = 2;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_INDEX_SET,
-            element: 'function(B#[]=)', index: '1', rhs: '2')),
-    const Test.clazz(
-        '''
-        class B {
-        }
-        class C extends B {
-          m() => super[1] = 2;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_SET,
-            index: '1', rhs: '2')),
-    const Test.clazz(
-        '''
-        class B {
-          operator []=(a, b) {}
-        }
-        class C extends B {
-          static m() => super[1] = 2;
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_INDEX_SET,
-            error: MessageKind.NO_SUPER_IN_STATIC, index: '1', rhs: '2')),
-  ],
-  'Compound assignment': const [
-    // Compound assignment
-    const Test('''
-        m(a) => a.b += 42;
-        ''', const [
-      const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_COMPOUND,
-          receiver: 'a', name: 'b', operator: '+=', rhs: '42'),
-      const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#a)')
-    ]),
-    const Test(
-        '''
-        m(a) => a += 42;
-        ''',
-        const Visit(VisitKind.VISIT_PARAMETER_COMPOUND,
-            element: 'parameter(m#a)', operator: '+=', rhs: '42')),
-    const Test(
-        '''
-        m(final a) => a += 42;
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_PARAMETER_COMPOUND,
-            element: 'parameter(m#a)', operator: '+=', rhs: '42')),
-    const Test(
-        '''
-        m() {
-          var a;
-          a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_LOCAL_VARIABLE_COMPOUND,
-            element: 'variable(m#a)', operator: '+=', rhs: '42')),
-    const Test(
-        '''
-        m() {
-          final a = 0;
-          a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_COMPOUND,
-            element: 'variable(m#a)', operator: '+=', rhs: '42')),
-    const Test(
-        '''
-        m() {
-          a() {}
-          a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_LOCAL_FUNCTION_COMPOUND,
-            element: 'function(m#a)', operator: '+=', rhs: '42')),
-    const Test(
-        '''
-        var a;
-        m() => a += 42;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_COMPOUND,
-            element: 'field(a)', operator: '+=', rhs: '42')),
-    const Test(
-        '''
-        get a => 0;
-        set a(_) {}
-        m() => a += 42;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_COMPOUND,
-            getter: 'getter(a)',
-            setter: 'setter(a)',
-            operator: '+=',
-            rhs: '42')),
-    const Test(
-        '''
-        class C {
-          static var a;
-        }
-        m() => C.a += 42;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND,
-            element: 'field(C#a)', operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static var a;
-          m() => C.a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND,
-            element: 'field(C#a)', operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static var a;
-          m() => a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND,
-            element: 'field(C#a)', operator: '+=', rhs: '42')),
-    const Test.prefix(
-        '''
-        class C {
-          static var a;
-        }
-        ''',
-        '''
-        m() => p.C.a += 42;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND,
-            element: 'field(C#a)', operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          var o;
-          static m() { o += 42; }
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_COMPOUND,
-            error: MessageKind.NO_INSTANCE_AVAILABLE,
-            operator: '+=',
-            rhs: '42')),
-    const Test.prefix(
-        '''
-        ''',
-        '''
-        m() { p += 42; }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_COMPOUND,
-            error: MessageKind.PREFIX_AS_EXPRESSION,
-            operator: '+=',
-            rhs: '42')),
-    const Test(
-        '''
-        class C {
-          static get a => 0;
-          static set a(_) {}
-        }
-        m() => C.a += 42;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND,
-            getter: 'getter(C#a)',
-            setter: 'setter(C#a)',
-            operator: '+=',
-            rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static get a => 0;
-          static set a(_) {}
-          m() => C.a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND,
-            getter: 'getter(C#a)',
-            setter: 'setter(C#a)',
-            operator: '+=',
-            rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static get a => 0;
-          static set a(_) {}
-          m() => a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND,
-            getter: 'getter(C#a)',
-            setter: 'setter(C#a)',
-            operator: '+=',
-            rhs: '42')),
-    const Test.prefix(
-        '''
-        class C {
-          static get a => 0;
-          static set a(_) {}
-        }
-        ''',
-        '''
-        m() => p.C.a += 42;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND,
-            getter: 'getter(C#a)',
-            setter: 'setter(C#a)',
-            operator: '+=',
-            rhs: '42')),
-    // TODO(johnniwinther): Enable these when dart2js supports method and setter
-    // with the same name.
-    /*const Test(
-        '''
-        class C {
-          static a() {}
-          static set a(_) {}
-        }
-        m() => C.a += 42;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND,
-            getter: 'function(C#a)', setter: 'setter(C#a)',
-            operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static a() {}
-          static set a(_) {}
-          m() => C.a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND,
-            getter: 'function(C#a)', setter: 'setter(C#a)',
-            operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static a() {}
-          static set a(_) {}
-          m() => a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND,
-            getter: 'function(C#a)', setter: 'setter(C#a)',
-            operator: '+=', rhs: '42')),
-    const Test.prefix(
-        '''
-        class C {
-          static a() {}
-          static set a(_) {}
-        }
-        ''',
-        '''
-        m() => p.C.a += 42;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND,
-            getter: 'function(C#a)', setter: 'setter(C#a)',
-            operator: '+=', rhs: '42')),*/
-    const Test.clazz(
-        '''
-        class C {
-          var a;
-          m() => a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_THIS_PROPERTY_COMPOUND,
-            operator: '+=', name: 'a', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          var a = 0;
-          m() => this.a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_THIS_PROPERTY_COMPOUND,
-            name: 'a', operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          var a = 0;
-        }
-        class C extends B {
-          m() => super.a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_FIELD_COMPOUND,
-            element: 'field(B#a)', operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          final a = 0;
-        }
-        class C extends B {
-          m() => super.a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_FINAL_FIELD_COMPOUND,
-            element: 'field(B#a)', operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          get a => 0;
-          set a (_) {}
-        }
-        class C extends B {
-          m() => super.a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_COMPOUND,
-            getter: 'getter(B#a)',
-            setter: 'setter(B#a)',
-            operator: '+=',
-            rhs: '42')),
-    const Test.clazz(
-        '''
-        class A {
-          get a => 0;
-        }
-        class B extends A {
-          set a (_) {}
-        }
-        class C extends B {
-          m() => super.a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_COMPOUND,
-            getter: 'getter(A#a)',
-            setter: 'setter(B#a)',
-            operator: '+=',
-            rhs: '42')),
-    const Test.clazz(
-        '''
-        class A {
-          var a;
-        }
-        class B extends A {
-          get a => 0;
-        }
-
-        class C extends B {
-          m() => super.a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_COMPOUND,
-            getter: 'getter(B#a)',
-            setter: 'field(A#a)',
-            operator: '+=',
-            rhs: '42')),
-    const Test.clazz(
-        '''
-        class A {
-          var a;
-        }
-        class B extends A {
-          set a(_) {}
-        }
-
-        class C extends B {
-          m() => super.a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_COMPOUND,
-            getter: 'field(A#a)',
-            setter: 'setter(B#a)',
-            operator: '+=',
-            rhs: '42')),
-    const Test.clazz(
-        '''
-        class A {
-          var a;
-        }
-        class B extends A {
-          final a = 0;
-        }
-
-        class C extends B {
-          m() => super.a += 42;
-        }
-        ''',
-        // TODO(johnniwinther): Change this to
-        // [VISIT_SUPER_FIELD_FIELD_COMPOUND] when dart2js supports shadow
-        // setters.
-        const Visit(VisitKind.VISIT_SUPER_FINAL_FIELD_COMPOUND,
-            element: 'field(B#a)', operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          a() {}
-        }
-        class C extends B {
-          m() => super.a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_METHOD_COMPOUND,
-            element: 'function(B#a)', operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-        }
-        class C extends B {
-          m() => super.a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_COMPOUND,
-            operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          set a(_) {}
-        }
-        class C extends B {
-          m() => super.a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND,
-            setter: 'setter(B#a)', operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          get a => 42;
-        }
-        class C extends B {
-          m() => super.a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND,
-            getter: 'getter(B#a)', operator: '+=', rhs: '42')),
-
-    const Test.clazz(
-        '''
-        class C {
-          static set a(var value) { }
-          m() => a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_COMPOUND,
-            setter: 'setter(C#a)', operator: '+=', rhs: '42')),
-
-    const Test.clazz(
-        '''
-        class C {
-          static get a => 42;
-          m() => C.a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_COMPOUND,
-            getter: 'getter(C#a)', operator: '+=', rhs: '42')),
-
-    const Test.clazz(
-        '''
-        class C {
-          static final a = 42;
-          m() => C.a += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_COMPOUND,
-            element: 'field(C#a)', operator: '+=', rhs: '42')),
-
-    const Test(
-        '''
-        class C {
-          static a(var value) { }
-        }
-        m() => C.a += 42;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_METHOD_COMPOUND,
-            element: 'function(C#a)', operator: '+=', rhs: '42')),
-
-    const Test(
-        '''
-        set a(var value) { }
-        m() => a += 42;
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_COMPOUND,
-            setter: 'setter(a)', operator: '+=', rhs: '42')),
-
-    const Test(
-        '''
-        get a => 42;
-        m() => a += 42;
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_COMPOUND,
-            getter: 'getter(a)', operator: '+=', rhs: '42')),
-
-    const Test(
-        '''
-        a(var value) { }
-        m() => a += 42;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_COMPOUND,
-            element: 'function(a)', operator: '+=', rhs: '42')),
-
-    const Test(
-        '''
-        final a = 42;
-        m() => a += 42;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_COMPOUND,
-            element: 'field(a)', operator: '+=', rhs: '42')),
-
-    const Test(
-        '''
-        m() => unresolved += 42;
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_COMPOUND,
-            operator: '+=', rhs: '42')),
-  ],
-  'Compound index assignment': const [
-    // Compound index assignment
-    const Test(
-        '''
-        m() => 0[1] += 42;
-        ''',
-        const Visit(VisitKind.VISIT_COMPOUND_INDEX_SET,
-            receiver: '0', index: '1', operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          operator [](_) {}
-          operator []=(a, b) {}
-        }
-        class C extends B {
-          m() => super[1] += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_COMPOUND_INDEX_SET,
-            getter: 'function(B#[])',
-            setter: 'function(B#[]=)',
-            index: '1',
-            operator: '+=',
-            rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          operator []=(a, b) {}
-        }
-        class C extends B {
-          m() => super[1] += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND_INDEX_SET,
-            setter: 'function(B#[]=)', index: '1', operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-        }
-        class C extends B {
-          m() => super[1] += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_COMPOUND_INDEX_SET,
-            index: '1', operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          operator [](_) {}
-        }
-        class C extends B {
-          m() => super[1] += 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND_INDEX_SET,
-            getter: 'function(B#[])', index: '1', operator: '+=', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          operator [](_) {}
-          operator []=(a, b) {}
-        }
-        class C extends B {
-          static m() => super[1] += 42;
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_COMPOUND_INDEX_SET,
-            error: MessageKind.NO_SUPER_IN_STATIC,
-            index: '1',
-            operator: '+=',
-            rhs: '42')),
-  ],
-  'Prefix expression': const [
-    // Prefix expression
-    const Test('''
-        m(a) => --a.b;
-        ''', const [
-      const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_PREFIX,
-          receiver: 'a', name: 'b', operator: '--'),
-      const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#a)')
-    ]),
-    const Test(
-        '''
-        m(a) => ++a;
-        ''',
-        const Visit(VisitKind.VISIT_PARAMETER_PREFIX,
-            element: 'parameter(m#a)', operator: '++')),
-    const Test(
-        '''
-        m(final a) => ++a;
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_PARAMETER_PREFIX,
-            element: 'parameter(m#a)', operator: '++')),
-    const Test(
-        '''
-        m() {
-          var a;
-          --a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_LOCAL_VARIABLE_PREFIX,
-            element: 'variable(m#a)', operator: '--')),
-    const Test(
-        '''
-        m() {
-          final a = 42;
-          --a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_PREFIX,
-            element: 'variable(m#a)', operator: '--')),
-    const Test(
-        '''
-        m() {
-          a() {}
-          --a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_LOCAL_FUNCTION_PREFIX,
-            element: 'function(m#a)', operator: '--')),
-    const Test(
-        '''
-        var a;
-        m() => ++a;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_PREFIX,
-            element: 'field(a)', operator: '++')),
-    const Test(
-        '''
-        get a => 0;
-        set a(_) {}
-        m() => --a;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_PREFIX,
-            getter: 'getter(a)', setter: 'setter(a)', operator: '--')),
-    const Test(
-        '''
-        class C {
-          static var a;
-        }
-        m() => ++C.a;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX,
-            element: 'field(C#a)', operator: '++')),
-    const Test.clazz(
-        '''
-        class C {
-          static var a;
-          m() => ++C.a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX,
-            element: 'field(C#a)', operator: '++')),
-    const Test.clazz(
-        '''
-        class C {
-          static var a;
-          m() => --a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX,
-            element: 'field(C#a)', operator: '--')),
-    const Test.prefix(
-        '''
-        class C {
-          static var a;
-        }
-        ''',
-        '''
-        m() => --p.C.a;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX,
-            element: 'field(C#a)', operator: '--')),
-    const Test.clazz(
-        '''
-        class C {
-          var o;
-          static m() { ++o; }
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_PREFIX,
-            error: MessageKind.NO_INSTANCE_AVAILABLE, operator: '++')),
-    const Test.prefix(
-        '''
-        ''',
-        '''
-        m() { ++p; }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_PREFIX,
-            error: MessageKind.PREFIX_AS_EXPRESSION, operator: '++')),
-    const Test(
-        '''
-        class C {
-          static get a => 0;
-          static set a(_) {}
-        }
-        m() => ++C.a;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX,
-            getter: 'getter(C#a)', setter: 'setter(C#a)', operator: '++')),
-    const Test.clazz(
-        '''
-        class C {
-          static get a => 0;
-          static set a(_) {}
-          m() => --C.a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX,
-            getter: 'getter(C#a)', setter: 'setter(C#a)', operator: '--')),
-    const Test.clazz(
-        '''
-        class C {
-          static get a => 0;
-          static set a(_) {}
-          m() => --a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX,
-            getter: 'getter(C#a)', setter: 'setter(C#a)', operator: '--')),
-    const Test.prefix(
-        '''
-        class C {
-          static get a => 0;
-          static set a(_) {}
-        }
-        ''',
-        '''
-        m() => ++p.C.a;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX,
-            getter: 'getter(C#a)', setter: 'setter(C#a)', operator: '++')),
-    const Test.clazz(
-        '''
-        class C {
-          var a;
-          m() => --a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_THIS_PROPERTY_PREFIX,
-            name: 'a', operator: '--')),
-    const Test.clazz(
-        '''
-        class C {
-          var a = 0;
-          m() => ++this.a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_THIS_PROPERTY_PREFIX,
-            name: 'a', operator: '++')),
-    const Test.clazz(
-        '''
-        class B {
-          var a = 0;
-        }
-        class C extends B {
-          m() => --super.a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_FIELD_PREFIX,
-            element: 'field(B#a)', operator: '--')),
-    const Test.clazz(
-        '''
-        class B {
-          final a = 0;
-        }
-        class C extends B {
-          m() => --super.a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_FINAL_FIELD_PREFIX,
-            element: 'field(B#a)', operator: '--')),
-    const Test.clazz(
-        '''
-        class B {
-          get a => 0;
-          set a (_) {}
-        }
-        class C extends B {
-          m() => --super.a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_PREFIX,
-            getter: 'getter(B#a)', setter: 'setter(B#a)', operator: '--')),
-    const Test.clazz(
-        '''
-        class A {
-          get a => 0;
-        }
-        class B extends A {
-          set a (_) {}
-        }
-        class C extends B {
-          m() => ++super.a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_PREFIX,
-            getter: 'getter(A#a)', setter: 'setter(B#a)', operator: '++')),
-    const Test.clazz(
-        '''
-        class A {
-          var a;
-        }
-        class B extends A {
-          get a => 0;
-        }
-
-        class C extends B {
-          m() => --super.a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_PREFIX,
-            getter: 'getter(B#a)', setter: 'field(A#a)', operator: '--')),
-    const Test.clazz(
-        '''
-        class A {
-          var a;
-        }
-        class B extends A {
-          set a(_) {}
-        }
-
-        class C extends B {
-          m() => ++super.a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_PREFIX,
-            getter: 'field(A#a)', setter: 'setter(B#a)', operator: '++')),
-    const Test.clazz(
-        '''
-        class B {
-          a() {}
-        }
-        class C extends B {
-          m() => ++super.a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_METHOD_PREFIX,
-            element: 'function(B#a)', operator: '++')),
-    const Test.clazz('''
-        class B {
-        }
-        class C extends B {
-          m() => ++super.a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_PREFIX, operator: '++')),
-    const Test.clazz(
-        '''
-        class B {
-          set a(_) {}
-        }
-        class C extends B {
-          m() => ++super.a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_PREFIX,
-            setter: 'setter(B#a)', operator: '++')),
-    const Test.clazz(
-        '''
-        class B {
-          get a => 42;
-        }
-        class C extends B {
-          m() => ++super.a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_PREFIX,
-            getter: 'getter(B#a)', operator: '++')),
-
-    const Test.clazz(
-        '''
-        class C {
-          static set a(var value) { }
-          m() => ++a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_PREFIX,
-            setter: 'setter(C#a)', operator: '++')),
-
-    const Test.clazz(
-        '''
-        class C {
-          static get a => 42;
-          m() => ++C.a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_PREFIX,
-            getter: 'getter(C#a)', operator: '++')),
-
-    const Test.clazz(
-        '''
-        class C {
-          static final a = 42;
-          m() => ++C.a;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_PREFIX,
-            element: 'field(C#a)', operator: '++')),
-
-    const Test(
-        '''
-        class C {
-          static a(var value) { }
-        }
-        m() => ++C.a;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_METHOD_PREFIX,
-            element: 'function(C#a)', operator: '++')),
-
-    const Test(
-        '''
-        set a(var value) { }
-        m() => ++a;
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_PREFIX,
-            setter: 'setter(a)', operator: '++')),
-
-    const Test(
-        '''
-        get a => 42;
-        m() => ++a;
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_PREFIX,
-            getter: 'getter(a)', operator: '++')),
-
-    const Test(
-        '''
-        a(var value) { }
-        m() => ++a;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_PREFIX,
-            element: 'function(a)', operator: '++')),
-
-    const Test(
-        '''
-        final a = 42;
-        m() => ++a;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_PREFIX,
-            element: 'field(a)', operator: '++')),
-
-    const Test('''
-        m() => ++unresolved;
-        ''', const Visit(VisitKind.VISIT_UNRESOLVED_PREFIX, operator: '++')),
-  ],
-  'Postfix expression': const [
-    // Postfix expression
-    const Test('''
-        m(a) => a.b--;
-        ''', const [
-      const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_POSTFIX,
-          receiver: 'a', name: 'b', operator: '--'),
-      const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#a)')
-    ]),
-    const Test(
-        '''
-        m(a) => a++;
-        ''',
-        const Visit(VisitKind.VISIT_PARAMETER_POSTFIX,
-            element: 'parameter(m#a)', operator: '++')),
-    const Test(
-        '''
-        m(final a) => a++;
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_PARAMETER_POSTFIX,
-            element: 'parameter(m#a)', operator: '++')),
-    const Test(
-        '''
-        m() {
-          var a;
-          a--;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_LOCAL_VARIABLE_POSTFIX,
-            element: 'variable(m#a)', operator: '--')),
-    const Test(
-        '''
-        m() {
-          final a = 42;
-          a--;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_POSTFIX,
-            element: 'variable(m#a)', operator: '--')),
-    const Test(
-        '''
-        m() {
-          a() {}
-          a--;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_LOCAL_FUNCTION_POSTFIX,
-            element: 'function(m#a)', operator: '--')),
-    const Test(
-        '''
-        var a;
-        m() => a++;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_POSTFIX,
-            element: 'field(a)', operator: '++')),
-    const Test(
-        '''
-        get a => 0;
-        set a(_) {}
-        m() => a--;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_POSTFIX,
-            getter: 'getter(a)', setter: 'setter(a)', operator: '--')),
-    const Test(
-        '''
-        class C {
-          static var a;
-        }
-        m() => C.a++;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX,
-            element: 'field(C#a)', operator: '++')),
-    const Test.clazz(
-        '''
-        class C {
-          static var a;
-          m() => C.a++;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX,
-            element: 'field(C#a)', operator: '++')),
-    const Test.clazz(
-        '''
-        class C {
-          static var a;
-          m() => a--;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX,
-            element: 'field(C#a)', operator: '--')),
-    const Test.prefix(
-        '''
-        class C {
-          static var a;
-        }
-        ''',
-        '''
-        m() => p.C.a--;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX,
-            element: 'field(C#a)', operator: '--')),
-    const Test.clazz(
-        '''
-        class C {
-          var o;
-          static m() { o--; }
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_POSTFIX,
-            error: MessageKind.NO_INSTANCE_AVAILABLE, operator: '--')),
-    const Test.prefix(
-        '''
-        ''',
-        '''
-        m() { p--; }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_POSTFIX,
-            error: MessageKind.PREFIX_AS_EXPRESSION, operator: '--')),
-    const Test(
-        '''
-        class C {
-          static get a => 0;
-          static set a(_) {}
-        }
-        m() => C.a++;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX,
-            getter: 'getter(C#a)', setter: 'setter(C#a)', operator: '++')),
-    const Test.clazz(
-        '''
-        class C {
-          static get a => 0;
-          static set a(_) {}
-          m() => C.a--;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX,
-            getter: 'getter(C#a)', setter: 'setter(C#a)', operator: '--')),
-    const Test.clazz(
-        '''
-        class C {
-          static get a => 0;
-          static set a(_) {}
-          m() => a--;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX,
-            getter: 'getter(C#a)', setter: 'setter(C#a)', operator: '--')),
-    const Test.prefix(
-        '''
-        class C {
-          static get a => 0;
-          static set a(_) {}
-        }
-        ''',
-        '''
-        m() => p.C.a++;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX,
-            getter: 'getter(C#a)', setter: 'setter(C#a)', operator: '++')),
-    const Test.clazz(
-        '''
-        class C {
-          var a;
-          m() => a--;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_THIS_PROPERTY_POSTFIX,
-            name: 'a', operator: '--')),
-    const Test.clazz(
-        '''
-        class C {
-          var a = 0;
-          m() => this.a++;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_THIS_PROPERTY_POSTFIX,
-            name: 'a', operator: '++')),
-    const Test.clazz(
-        '''
-        class B {
-          var a = 0;
-        }
-        class C extends B {
-          m() => super.a--;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_FIELD_POSTFIX,
-            element: 'field(B#a)', operator: '--')),
-    const Test.clazz(
-        '''
-        class B {
-          final a = 0;
-        }
-        class C extends B {
-          m() => super.a--;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_FINAL_FIELD_POSTFIX,
-            element: 'field(B#a)', operator: '--')),
-    const Test.clazz(
-        '''
-        class B {
-          get a => 0;
-          set a (_) {}
-        }
-        class C extends B {
-          m() => super.a--;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_POSTFIX,
-            getter: 'getter(B#a)', setter: 'setter(B#a)', operator: '--')),
-    const Test.clazz(
-        '''
-        class A {
-          get a => 0;
-        }
-        class B extends A {
-          set a (_) {}
-        }
-        class C extends B {
-          m() => super.a++;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_POSTFIX,
-            getter: 'getter(A#a)', setter: 'setter(B#a)', operator: '++')),
-    const Test.clazz(
-        '''
-        class A {
-          var a;
-        }
-        class B extends A {
-          get a => 0;
-        }
-
-        class C extends B {
-          m() => super.a--;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_POSTFIX,
-            getter: 'getter(B#a)', setter: 'field(A#a)', operator: '--')),
-    const Test.clazz(
-        '''
-        class A {
-          var a;
-        }
-        class B extends A {
-          set a(_) {}
-        }
-
-        class C extends B {
-          m() => super.a++;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_POSTFIX,
-            getter: 'field(A#a)', setter: 'setter(B#a)', operator: '++')),
-    const Test.clazz(
-        '''
-        class B {
-          a() {}
-        }
-        class C extends B {
-          m() => super.a++;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_METHOD_POSTFIX,
-            element: 'function(B#a)', operator: '++')),
-    const Test.clazz('''
-        class B {
-        }
-        class C extends B {
-          m() => super.a++;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_POSTFIX, operator: '++')),
-    const Test.clazz(
-        '''
-        class B {
-          set a(_) {}
-        }
-        class C extends B {
-          m() => super.a++;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_POSTFIX,
-            setter: 'setter(B#a)', operator: '++')),
-    const Test.clazz(
-        '''
-        class B {
-          get a => 42;
-        }
-        class C extends B {
-          m() => super.a++;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_POSTFIX,
-            getter: 'getter(B#a)', operator: '++')),
-
-    const Test.clazz(
-        '''
-        class C {
-          static set a(var value) { }
-          m() => a++;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_POSTFIX,
-            setter: 'setter(C#a)', operator: '++')),
-
-    const Test.clazz(
-        '''
-        class C {
-          static get a => 42;
-          m() => C.a++;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_POSTFIX,
-            getter: 'getter(C#a)', operator: '++')),
-
-    const Test.clazz(
-        '''
-        class C {
-          static final a = 42;
-          m() => C.a++;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_POSTFIX,
-            element: 'field(C#a)', operator: '++')),
-
-    const Test(
-        '''
-        class C {
-          static a(var value) { }
-        }
-        m() => C.a++;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_METHOD_POSTFIX,
-            element: 'function(C#a)', operator: '++')),
-
-    const Test(
-        '''
-        set a(var value) { }
-        m() => a++;
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_POSTFIX,
-            setter: 'setter(a)', operator: '++')),
-
-    const Test(
-        '''
-        get a => 42;
-        m() => a++;
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_POSTFIX,
-            getter: 'getter(a)', operator: '++')),
-
-    const Test(
-        '''
-        a(var value) { }
-        m() => a++;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_POSTFIX,
-            element: 'function(a)', operator: '++')),
-
-    const Test(
-        '''
-        final a = 42;
-        m() => a++;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_POSTFIX,
-            element: 'field(a)', operator: '++')),
-
-    const Test('''
-        m() => unresolved++;
-        ''', const Visit(VisitKind.VISIT_UNRESOLVED_POSTFIX, operator: '++')),
-  ],
-  'Constructor invocations': const [
-    const Test(
-        '''
-        class Class {
-          const Class(a, b);
-        }
-        m() => const Class(true, 42);
-        ''',
-        const Visit(VisitKind.VISIT_CONST_CONSTRUCTOR_INVOKE,
-            constant: 'const Class(true, 42)')),
-    const Test(
-        '''
-        m() => const bool.fromEnvironment('foo');
-        ''',
-        const Visit(VisitKind.VISIT_BOOL_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
-            constant: 'const bool.fromEnvironment("foo")')),
-    const Test(
-        '''
-        m() => const bool.fromEnvironment('foo', defaultValue: true);
-        ''',
-        const Visit(VisitKind.VISIT_BOOL_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
-            constant: 'const bool.fromEnvironment("foo", defaultValue: true)')),
-    const Test(
-        '''
-        m() => const int.fromEnvironment('foo');
-        ''',
-        const Visit(VisitKind.VISIT_INT_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
-            constant: 'const int.fromEnvironment("foo")')),
-    const Test(
-        '''
-        m() => const String.fromEnvironment('foo');
-        ''',
-        const Visit(VisitKind.VISIT_STRING_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
-            constant: 'const String.fromEnvironment("foo")')),
-    const Test(
-        '''
-        class Class {
-          Class(a, b);
-        }
-        m() => const Class(true, 42);
-        ''',
-        const Visit(VisitKind.ERROR_NON_CONSTANT_CONSTRUCTOR_INVOKE,
-            element: 'generative_constructor(Class#)',
-            arguments: '(true,42)',
-            type: 'Class',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        '''
-        class Class {}
-        m() => new Class();
-        ''',
-        const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_INVOKE,
-            element: 'generative_constructor(Class#)',
-            arguments: '()',
-            type: 'Class',
-            selector: 'CallStructure(arity=0)')),
-    const Test(
-        '''
-        class Class {
-          Class(a, b);
-        }
-        m() => new Class(true, 42);
-        ''',
-        const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_INVOKE,
-            element: 'generative_constructor(Class#)',
-            arguments: '(true,42)',
-            type: 'Class',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        '''
-        class Class {
-          Class.named(a, b);
-        }
-        m() => new Class.named(true, 42);
-        ''',
-        const Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_INVOKE,
-            element: 'generative_constructor(Class#named)',
-            arguments: '(true,42)',
-            type: 'Class',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        '''
-        class Class {}
-        m() => new Class(true, 42);
-        ''',
-        const Visit(VisitKind.VISIT_CONSTRUCTOR_INCOMPATIBLE_INVOKE,
-            element: 'generative_constructor(Class#)',
-            arguments: '(true,42)',
-            type: 'Class',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        '''
-        class Class {
-          Class(a, b) : this._(a, b);
-          Class._(a, b);
-        }
-        m() => new Class(true, 42);
-        ''',
-        const Visit(VisitKind.VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_INVOKE,
-            element: 'generative_constructor(Class#)',
-            arguments: '(true,42)',
-            type: 'Class',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        '''
-        class Class {
-          Class() : this._(true, 42);
-          Class._(a, b);
-        }
-        m() => new Class(true, 42);
-        ''',
-        const Visit(VisitKind.VISIT_CONSTRUCTOR_INCOMPATIBLE_INVOKE,
-            element: 'generative_constructor(Class#)',
-            arguments: '(true,42)',
-            type: 'Class',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        '''
-        class Class {
-          factory Class(a, b) => new Class._(a, b);
-          Class._(a, b);
-        }
-        m() => new Class(true, 42);
-        ''',
-        const Visit(VisitKind.VISIT_FACTORY_CONSTRUCTOR_INVOKE,
-            element: 'factory_constructor(Class#)',
-            arguments: '(true,42)',
-            type: 'Class',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        '''
-        class Class {
-          factory Class() => new Class._(true, 42);
-          Class._(a, b);
-        }
-        m() => new Class(true, 42);
-        ''',
-        const Visit(VisitKind.VISIT_CONSTRUCTOR_INCOMPATIBLE_INVOKE,
-            element: 'factory_constructor(Class#)',
-            arguments: '(true,42)',
-            type: 'Class',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        '''
-        class Class<T> {
-          factory Class(a, b) = Class<int>.a;
-          factory Class.a(a, b) = Class<Class<T>>.b;
-          Class.b(a, b);
-        }
-        m() => new Class<double>(true, 42);
-        ''',
-        const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
-            element: 'factory_constructor(Class#)',
-            arguments: '(true,42)',
-            type: 'Class<double>',
-            target: 'generative_constructor(Class#b)',
-            targetType: 'Class<Class<int>>',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        '''
-        class Class<T> {
-          factory Class(a) = Class<int>.a;
-          factory Class.a(a, [b]) = Class<Class<T>>.b;
-          Class.b(a, [b]);
-        }
-        m() => new Class<double>(true, 42);
-        ''',
-        const Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
-            element: 'factory_constructor(Class#)',
-            arguments: '(true,42)',
-            type: 'Class<double>',
-            target: 'generative_constructor(Class#b)',
-            targetType: 'Class<Class<int>>',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        '''
-        class Class {
-          factory Class() = Class._;
-          Class._();
-        }
-        m() => new Class(true, 42);
-        ''',
-        const Visit(
-            VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
-            element: 'factory_constructor(Class#)',
-            arguments: '(true,42)',
-            type: 'Class',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        '''
-        class Class<T> {
-          factory Class(a, b) = Class<int>.a;
-          factory Class.a(a, b) = Class<Class<T>>.b;
-          Class.b(a);
-        }
-        m() => new Class<double>(true, 42);
-        ''',
-        const Visit(
-            VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
-            element: 'factory_constructor(Class#)',
-            arguments: '(true,42)',
-            type: 'Class<double>',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        '''
-        class Class {
-          Class(a, b);
-        }
-        m() => new Class.unresolved(true, 42);
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_CONSTRUCTOR_INVOKE,
-            arguments: '(true,42)')),
-    const Test(
-        '''
-        m() => new Unresolved(true, 42);
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_CLASS_CONSTRUCTOR_INVOKE,
-            arguments: '(true,42)')),
-    const Test(
-        '''
-        abstract class AbstractClass {}
-        m() => new AbstractClass();
-        ''',
-        const Visit(VisitKind.VISIT_ABSTRACT_CLASS_CONSTRUCTOR_INVOKE,
-            element: 'generative_constructor(AbstractClass#)',
-            type: 'AbstractClass',
-            arguments: '()',
-            selector: 'CallStructure(arity=0)')),
-    const Test(
-        '''
-        class Class {
-          factory Class(a, b) = Unresolved;
-        }
-        m() => new Class(true, 42);
-        ''',
-        const Visit(
-            VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
-            element: 'factory_constructor(Class#)',
-            arguments: '(true,42)',
-            type: 'Class',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        '''
-        class Class {
-          factory Class(a, b) = Class.named;
-        }
-        m() => new Class(true, 42);
-        ''',
-        const Visit(
-            VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
-            element: 'factory_constructor(Class#)',
-            arguments: '(true,42)',
-            type: 'Class',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        '''
-        class Class {
-          factory Class(a, b) = Class.named;
-          factory Class.named(a, b) = Class.unresolved;
-        }
-        m() => new Class(true, 42);
-        ''',
-        const Visit(
-            VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
-            element: 'factory_constructor(Class#)',
-            arguments: '(true,42)',
-            type: 'Class',
-            selector: 'CallStructure(arity=2)')),
-    const Test(
-        '''
-        abstract class AbstractClass {
-          AbstractClass(a, b);
-        }
-        class Class {
-          factory Class(a, b) = AbstractClass;
-        }
-        m() => new Class(true, 42);
-        ''',
-        const Visit(
-            VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
-            element: 'factory_constructor(Class#)',
-            arguments: '(true,42)',
-            type: 'Class',
-            selector: 'CallStructure(arity=2)')),
-  ],
-  'If not null expressions': const [
-    const Test('''
-        m(a) => a?.b;
-        ''', const [
-      const Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_GET,
-          receiver: 'a', name: 'b'),
-      const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#a)'),
-    ]),
-    const Test('''
-        class C {
-          static var b;
-        }
-        m(a) => C?.b;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_GET, element: 'field(C#b)')),
-    const Test('''
-        m(a) => a?.b = 42;
-        ''', const [
-      const Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_SET,
-          receiver: 'a', name: 'b', rhs: '42'),
-      const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#a)'),
-    ]),
-    const Test('''
-        m(a) => a?.b(42, true);
-        ''', const [
-      const Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_INVOKE,
-          receiver: 'a',
-          arguments: '(42,true)',
-          selector: 'Selector(call, b, arity=2)'),
-      const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#a)'),
-    ]),
-    const Test('''
-        m(a) => ++a?.b;
-        ''', const [
-      const Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_PREFIX,
-          receiver: 'a', name: 'b', operator: '++'),
-      const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#a)'),
-    ]),
-    const Test('''
-        m(a) => a?.b--;
-        ''', const [
-      const Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_POSTFIX,
-          receiver: 'a', name: 'b', operator: '--'),
-      const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#a)'),
-    ]),
-    const Test('''
-        m(a) => a?.b *= 42;
-        ''', const [
-      const Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_COMPOUND,
-          receiver: 'a', name: 'b', operator: '*=', rhs: '42'),
-      const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#a)'),
-    ]),
-    const Test('''
-        m(a) => a?.b ??= 42;
-        ''', const [
-      const Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_SET_IF_NULL,
-          receiver: 'a', name: 'b', rhs: '42'),
-      const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#a)'),
-    ]),
-    const Test('''
-        m(a, b) => a ?? b;
-        ''', const [
-      const Visit(VisitKind.VISIT_IF_NULL, left: 'a', right: 'b'),
-      const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#a)'),
-      const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#b)'),
-    ]),
-    const Test(
-        '''
-        m(a) => a ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_PARAMETER_SET_IF_NULL,
-            element: 'parameter(m#a)', rhs: '42')),
-    const Test.prefix(
-        '''
-        var o;
-        ''',
-        'm() => p?.o;',
-        const Visit(VisitKind.ERROR_INVALID_GET,
-            error: MessageKind.PREFIX_AS_EXPRESSION)),
-  ],
-  'Set if null': const [
-    const Test('''
-        m(a) => a.b ??= 42;
-        ''', const [
-      const Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_SET_IF_NULL,
-          receiver: 'a', name: 'b', rhs: '42'),
-      const Visit(VisitKind.VISIT_PARAMETER_GET, element: 'parameter(m#a)')
-    ]),
-    const Test(
-        '''
-        m(a) => a ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_PARAMETER_SET_IF_NULL,
-            element: 'parameter(m#a)', rhs: '42')),
-    const Test(
-        '''
-        m(final a) => a ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_PARAMETER_SET_IF_NULL,
-            element: 'parameter(m#a)', rhs: '42')),
-    const Test(
-        '''
-        m() {
-          var a;
-          a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_LOCAL_VARIABLE_SET_IF_NULL,
-            element: 'variable(m#a)', rhs: '42')),
-    const Test(
-        '''
-        m() {
-          final a = 0;
-          a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_SET_IF_NULL,
-            element: 'variable(m#a)', rhs: '42')),
-    const Test(
-        '''
-        m() {
-          a() {}
-          a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_LOCAL_FUNCTION_SET_IF_NULL,
-            element: 'function(m#a)', rhs: '42')),
-    const Test(
-        '''
-        var a;
-        m() => a ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_SET_IF_NULL,
-            element: 'field(a)', rhs: '42')),
-    const Test(
-        '''
-        get a => 0;
-        set a(_) {}
-        m() => a ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_SET_IF_NULL,
-            getter: 'getter(a)', setter: 'setter(a)', rhs: '42')),
-    const Test(
-        '''
-        class C {
-          static var a;
-        }
-        m() => C.a ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_SET_IF_NULL,
-            element: 'field(C#a)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static var a;
-          m() => C.a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_SET_IF_NULL,
-            element: 'field(C#a)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static var a;
-          m() => a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_SET_IF_NULL,
-            element: 'field(C#a)', rhs: '42')),
-    const Test.prefix(
-        '''
-        class C {
-          static var a;
-        }
-        ''',
-        '''
-        m() => p.C.a ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FIELD_SET_IF_NULL,
-            element: 'field(C#a)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          var o;
-          static m() { o ??= 42; }
-        }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_SET_IF_NULL,
-            error: MessageKind.NO_INSTANCE_AVAILABLE, rhs: '42')),
-    const Test.prefix(
-        '''
-        ''',
-        '''
-        m() { p ??= 42; }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_SET_IF_NULL,
-            error: MessageKind.PREFIX_AS_EXPRESSION, rhs: '42')),
-    const Test(
-        '''
-        class C {
-          static get a => 0;
-          static set a(_) {}
-        }
-        m() => C.a ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_SET_IF_NULL,
-            getter: 'getter(C#a)', setter: 'setter(C#a)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static get a => 0;
-          static set a(_) {}
-          m() => C.a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_SET_IF_NULL,
-            getter: 'getter(C#a)', setter: 'setter(C#a)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static get a => 0;
-          static set a(_) {}
-          m() => a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_SET_IF_NULL,
-            getter: 'getter(C#a)', setter: 'setter(C#a)', rhs: '42')),
-    const Test.prefix(
-        '''
-        class C {
-          static get a => 0;
-          static set a(_) {}
-        }
-        ''',
-        '''
-        m() => p.C.a ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_SET_IF_NULL,
-            getter: 'getter(C#a)', setter: 'setter(C#a)', rhs: '42')),
-    // TODO(johnniwinther): Enable these when dart2js supports method and setter
-    // with the same name.
-    /*const Test(
-        '''
-        class C {
-          static a() {}
-          static set a(_) {}
-        }
-        m() => C.a ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_SET_IF_NULL,
-            getter: 'function(C#a)', setter: 'setter(C#a)',
-            rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static a() {}
-          static set a(_) {}
-          m() => C.a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_SET_IF_NULL,
-            getter: 'function(C#a)', setter: 'setter(C#a)',
-            rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          static a() {}
-          static set a(_) {}
-          m() => a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_SET_IF_NULL,
-            getter: 'function(C#a)', setter: 'setter(C#a)',
-            rhs: '42')),
-    const Test.prefix(
-        '''
-        class C {
-          static a() {}
-          static set a(_) {}
-        }
-        ''',
-        '''
-        m() => p.C.a ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_SET_IF_NULL,
-            getter: 'function(C#a)', setter: 'setter(C#a)',
-            rhs: '42')),*/
-    const Test.clazz(
-        '''
-        class C {
-          var a;
-          m() => a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_THIS_PROPERTY_SET_IF_NULL,
-            name: 'a', rhs: '42')),
-    const Test.clazz(
-        '''
-        class C {
-          var a = 0;
-          m() => this.a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_THIS_PROPERTY_SET_IF_NULL,
-            name: 'a', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          var a = 0;
-        }
-        class C extends B {
-          m() => super.a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_FIELD_SET_IF_NULL,
-            element: 'field(B#a)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          final a = 0;
-        }
-        class C extends B {
-          m() => super.a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_FINAL_FIELD_SET_IF_NULL,
-            element: 'field(B#a)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          get a => 0;
-          set a (_) {}
-        }
-        class C extends B {
-          m() => super.a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_SET_IF_NULL,
-            getter: 'getter(B#a)', setter: 'setter(B#a)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class A {
-          get a => 0;
-        }
-        class B extends A {
-          set a (_) {}
-        }
-        class C extends B {
-          m() => super.a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_SET_IF_NULL,
-            getter: 'getter(A#a)', setter: 'setter(B#a)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class A {
-          var a;
-        }
-        class B extends A {
-          get a => 0;
-        }
-
-        class C extends B {
-          m() => super.a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_SET_IF_NULL,
-            getter: 'getter(B#a)', setter: 'field(A#a)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class A {
-          var a;
-        }
-        class B extends A {
-          set a(_) {}
-        }
-
-        class C extends B {
-          m() => super.a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_SET_IF_NULL,
-            getter: 'field(A#a)', setter: 'setter(B#a)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class A {
-          var a;
-        }
-        class B extends A {
-          final a = 0;
-        }
-
-        class C extends B {
-          m() => super.a ??= 42;
-        }
-        ''',
-        // TODO(johnniwinther): Change this to
-        // [VISIT_SUPER_FIELD_FIELD_SET_IF_NULL] when dart2js supports shadow
-        // setters.
-        const Visit(VisitKind.VISIT_SUPER_FINAL_FIELD_SET_IF_NULL,
-            element: 'field(B#a)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          a() {}
-        }
-        class C extends B {
-          m() => super.a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_SUPER_METHOD_SET_IF_NULL,
-            element: 'function(B#a)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-        }
-        class C extends B {
-          m() => super.a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SET_IF_NULL,
-            name: 'a', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          set a(_) {}
-        }
-        class C extends B {
-          m() => super.a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_SET_IF_NULL,
-            setter: 'setter(B#a)', rhs: '42')),
-    const Test.clazz(
-        '''
-        class B {
-          get a => 42;
-        }
-        class C extends B {
-          m() => super.a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_SET_IF_NULL,
-            getter: 'getter(B#a)', rhs: '42')),
-
-    const Test.clazz(
-        '''
-        class C {
-          static set a(var value) { }
-          m() => a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_SET_IF_NULL,
-            setter: 'setter(C#a)', rhs: '42')),
-
-    const Test.clazz(
-        '''
-        class C {
-          static get a => 42;
-          m() => C.a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_SET_IF_NULL,
-            getter: 'getter(C#a)', rhs: '42')),
-
-    const Test.clazz(
-        '''
-        class C {
-          static final a = 42;
-          m() => C.a ??= 42;
-        }
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_SET_IF_NULL,
-            element: 'field(C#a)', rhs: '42')),
-
-    const Test(
-        '''
-        class C {
-          static a(var value) { }
-        }
-        m() => C.a ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_STATIC_METHOD_SET_IF_NULL,
-            element: 'function(C#a)', rhs: '42')),
-
-    const Test(
-        '''
-        set a(var value) { }
-        m() => a ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_SET_IF_NULL,
-            setter: 'setter(a)', rhs: '42')),
-
-    const Test(
-        '''
-        get a => 42;
-        m() => a ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_SET_IF_NULL,
-            getter: 'getter(a)', rhs: '42')),
-
-    const Test(
-        '''
-        a(var value) { }
-        m() => a ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_SET_IF_NULL,
-            element: 'function(a)', rhs: '42')),
-
-    const Test(
-        '''
-        final a = 42;
-        m() => a ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_SET_IF_NULL,
-            element: 'field(a)', rhs: '42')),
-
-    const Test(
-        '''
-        m() => unresolved ??= 42;
-        ''',
-        const Visit(VisitKind.VISIT_UNRESOLVED_SET_IF_NULL,
-            name: 'unresolved', rhs: '42')),
-  ],
-};
diff --git a/tests/compiler/dart2js/old_frontend/semantic_visitor_test_send_visitor.dart b/tests/compiler/dart2js/old_frontend/semantic_visitor_test_send_visitor.dart
deleted file mode 100644
index 4077d2d..0000000
--- a/tests/compiler/dart2js/old_frontend/semantic_visitor_test_send_visitor.dart
+++ /dev/null
@@ -1,2499 +0,0 @@
-// Copyright (c) 2015, 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 dart2js.semantics_visitor_test;
-
-class SemanticSendTestVisitor extends SemanticTestVisitor {
-  SemanticSendTestVisitor(TreeElements elements) : super(elements);
-
-  @override
-  visitAs(Send node, Node expression, ResolutionDartType type, arg) {
-    visits
-        .add(new Visit(VisitKind.VISIT_AS, expression: expression, type: type));
-    apply(expression, arg);
-  }
-
-  @override
-  errorInvalidCompound(Send node, ErroneousElement error,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.ERROR_INVALID_COMPOUND,
-        error: error.messageKind, operator: operator, rhs: rhs));
-    super.errorInvalidCompound(node, error, operator, rhs, arg);
-  }
-
-  @override
-  errorInvalidGet(Send node, ErroneousElement error, arg) {
-    visits
-        .add(new Visit(VisitKind.ERROR_INVALID_GET, error: error.messageKind));
-    super.errorInvalidGet(node, error, arg);
-  }
-
-  @override
-  errorInvalidInvoke(Send node, ErroneousElement error, NodeList arguments,
-      Selector selector, arg) {
-    visits.add(new Visit(VisitKind.ERROR_INVALID_INVOKE,
-        error: error.messageKind, arguments: arguments));
-    super.errorInvalidInvoke(node, error, arguments, selector, arg);
-  }
-
-  @override
-  errorInvalidPostfix(
-      Send node, ErroneousElement error, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.ERROR_INVALID_POSTFIX,
-        error: error.messageKind, operator: operator));
-    super.errorInvalidPostfix(node, error, operator, arg);
-  }
-
-  @override
-  errorInvalidPrefix(
-      Send node, ErroneousElement error, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.ERROR_INVALID_PREFIX,
-        error: error.messageKind, operator: operator));
-    super.errorInvalidPrefix(node, error, operator, arg);
-  }
-
-  @override
-  errorInvalidSet(Send node, ErroneousElement error, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.ERROR_INVALID_SET,
-        error: error.messageKind, rhs: rhs));
-    super.errorInvalidSet(node, error, rhs, arg);
-  }
-
-  @override
-  errorInvalidSetIfNull(Send node, ErroneousElement error, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.ERROR_INVALID_SET_IF_NULL,
-        error: error.messageKind, rhs: rhs));
-    super.errorInvalidSetIfNull(node, error, rhs, arg);
-  }
-
-  @override
-  errorInvalidUnary(
-      Send node, UnaryOperator operator, ErroneousElement error, arg) {
-    visits.add(new Visit(VisitKind.ERROR_INVALID_UNARY,
-        error: error.messageKind, operator: operator));
-    super.errorInvalidUnary(node, operator, error, arg);
-  }
-
-  @override
-  errorInvalidEquals(Send node, ErroneousElement error, Node right, arg) {
-    visits.add(new Visit(VisitKind.ERROR_INVALID_EQUALS,
-        error: error.messageKind, right: right));
-    super.errorInvalidEquals(node, error, right, arg);
-  }
-
-  @override
-  errorInvalidNotEquals(Send node, ErroneousElement error, Node right, arg) {
-    visits.add(new Visit(VisitKind.ERROR_INVALID_NOT_EQUALS,
-        error: error.messageKind, right: right));
-    super.errorInvalidNotEquals(node, error, right, arg);
-  }
-
-  @override
-  errorInvalidBinary(Send node, ErroneousElement error, BinaryOperator operator,
-      Node right, arg) {
-    visits.add(new Visit(VisitKind.ERROR_INVALID_BINARY,
-        error: error.messageKind, operator: operator, right: right));
-    super.errorInvalidBinary(node, error, operator, right, arg);
-  }
-
-  @override
-  errorInvalidIndex(Send node, ErroneousElement error, Node index, arg) {
-    visits.add(new Visit(VisitKind.ERROR_INVALID_INDEX,
-        error: error.messageKind, index: index));
-    super.errorInvalidIndex(node, error, index, arg);
-  }
-
-  @override
-  errorInvalidIndexSet(
-      Send node, ErroneousElement error, Node index, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.ERROR_INVALID_INDEX_SET,
-        error: error.messageKind, index: index, rhs: rhs));
-    super.errorInvalidIndexSet(node, error, index, rhs, arg);
-  }
-
-  @override
-  errorInvalidCompoundIndexSet(Send node, ErroneousElement error, Node index,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.ERROR_INVALID_COMPOUND_INDEX_SET,
-        error: error.messageKind, index: index, operator: operator, rhs: rhs));
-    super.errorInvalidCompoundIndexSet(node, error, index, operator, rhs, arg);
-  }
-
-  @override
-  errorInvalidIndexPrefix(Send node, ErroneousElement error, Node index,
-      IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.ERROR_INVALID_INDEX_PREFIX,
-        error: error.messageKind, index: index, operator: operator));
-    super.errorInvalidIndexPrefix(node, error, index, operator, arg);
-  }
-
-  @override
-  errorInvalidIndexPostfix(Send node, ErroneousElement error, Node index,
-      IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.ERROR_INVALID_INDEX_POSTFIX,
-        error: error.messageKind, index: index, operator: operator));
-    super.errorInvalidIndexPostfix(node, error, index, operator, arg);
-  }
-
-  @override
-  visitBinary(Send node, Node left, BinaryOperator operator, Node right, arg) {
-    visits.add(new Visit(VisitKind.VISIT_BINARY,
-        left: left, operator: operator, right: right));
-    super.visitBinary(node, left, operator, right, arg);
-  }
-
-  @override
-  errorUndefinedBinaryExpression(
-      Send node, Node left, Operator operator, Node right, arg) {
-    visits.add(new Visit(VisitKind.ERROR_UNDEFINED_BINARY_EXPRESSION,
-        left: left, operator: operator, right: right));
-    super.errorUndefinedBinaryExpression(node, left, operator, right, arg);
-  }
-
-  @override
-  visitIndex(Send node, Node receiver, Node index, arg) {
-    visits.add(
-        new Visit(VisitKind.VISIT_INDEX, receiver: receiver, index: index));
-    apply(receiver, arg);
-    apply(index, arg);
-  }
-
-  @override
-  visitClassTypeLiteralGet(Send node, ConstantExpression constant, arg) {
-    visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_GET,
-        constant: constant.toDartText()));
-  }
-
-  @override
-  visitClassTypeLiteralInvoke(Send node, ConstantExpression constant,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_INVOKE,
-        constant: constant.toDartText(), arguments: arguments));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitClassTypeLiteralSet(
-      SendSet node, ConstantExpression constant, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_SET,
-        constant: constant.toDartText(), rhs: rhs));
-    super.visitClassTypeLiteralSet(node, constant, rhs, arg);
-  }
-
-  @override
-  visitNotEquals(Send node, Node left, Node right, arg) {
-    visits.add(new Visit(VisitKind.VISIT_NOT_EQUALS, left: left, right: right));
-    apply(left, arg);
-    apply(right, arg);
-  }
-
-  @override
-  visitDynamicPropertyPrefix(
-      Send node, Node receiver, Name name, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_PREFIX,
-        receiver: receiver, operator: operator, name: name));
-    super.visitDynamicPropertyPrefix(node, receiver, name, operator, arg);
-  }
-
-  @override
-  visitDynamicPropertyPostfix(
-      Send node, Node receiver, Name name, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_POSTFIX,
-        receiver: receiver, operator: operator, name: name));
-    super.visitDynamicPropertyPostfix(node, receiver, name, operator, arg);
-  }
-
-  @override
-  visitDynamicPropertyGet(Send node, Node receiver, Name name, arg) {
-    visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_GET,
-        receiver: receiver, name: name));
-    super.visitDynamicPropertyGet(node, receiver, name, arg);
-  }
-
-  @override
-  visitDynamicPropertyInvoke(
-      Send node, Node receiver, NodeList arguments, Selector selector, arg) {
-    visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_INVOKE,
-        receiver: receiver, name: selector.name, arguments: arguments));
-    super.visitDynamicPropertyInvoke(node, receiver, arguments, selector, arg);
-  }
-
-  @override
-  visitDynamicPropertySet(
-      SendSet node, Node receiver, Name name, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_SET,
-        receiver: receiver, name: name, rhs: rhs));
-    super.visitDynamicPropertySet(node, receiver, name, rhs, arg);
-  }
-
-  @override
-  visitDynamicTypeLiteralGet(Send node, ConstantExpression constant, arg) {
-    visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_GET,
-        constant: constant.toDartText()));
-  }
-
-  @override
-  visitDynamicTypeLiteralInvoke(Send node, ConstantExpression constant,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_INVOKE,
-        constant: constant.toDartText(), arguments: arguments));
-  }
-
-  @override
-  visitDynamicTypeLiteralSet(
-      Send node, ConstantExpression constant, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_SET,
-        constant: constant.toDartText(), rhs: rhs));
-    super.visitDynamicTypeLiteralSet(node, constant, rhs, arg);
-  }
-
-  @override
-  visitExpressionInvoke(Send node, Node expression, NodeList arguments,
-      CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_EXPRESSION_INVOKE,
-        receiver: expression, arguments: arguments));
-  }
-
-  @override
-  visitIs(Send node, Node expression, ResolutionDartType type, arg) {
-    visits
-        .add(new Visit(VisitKind.VISIT_IS, expression: expression, type: type));
-    apply(expression, arg);
-  }
-
-  @override
-  visitIsNot(Send node, Node expression, ResolutionDartType type, arg) {
-    visits.add(
-        new Visit(VisitKind.VISIT_IS_NOT, expression: expression, type: type));
-    apply(expression, arg);
-  }
-
-  @override
-  visitLogicalAnd(Send node, Node left, Node right, arg) {
-    visits
-        .add(new Visit(VisitKind.VISIT_LOGICAL_AND, left: left, right: right));
-    apply(left, arg);
-    apply(right, arg);
-  }
-
-  @override
-  visitLogicalOr(Send node, Node left, Node right, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOGICAL_OR, left: left, right: right));
-    apply(left, arg);
-    apply(right, arg);
-  }
-
-  @override
-  visitLocalFunctionGet(Send node, LocalFunctionElement function, arg) {
-    visits
-        .add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_GET, element: function));
-  }
-
-  @override
-  visitLocalFunctionSet(
-      SendSet node, LocalFunctionElement function, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_SET,
-        element: function, rhs: rhs));
-    super.visitLocalFunctionSet(node, function, rhs, arg);
-  }
-
-  @override
-  visitLocalFunctionInvoke(Send node, LocalFunctionElement function,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_INVOKE,
-        element: function, arguments: arguments, selector: callStructure));
-    super.visitLocalFunctionInvoke(
-        node, function, arguments, callStructure, arg);
-  }
-
-  @override
-  visitLocalFunctionIncompatibleInvoke(Send node, LocalFunctionElement function,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_INCOMPATIBLE_INVOKE,
-        element: function, arguments: arguments, selector: callStructure));
-    super.visitLocalFunctionInvoke(
-        node, function, arguments, callStructure, arg);
-  }
-
-  @override
-  visitLocalVariableGet(Send node, LocalVariableElement variable, arg) {
-    visits
-        .add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_GET, element: variable));
-  }
-
-  @override
-  visitLocalVariableInvoke(Send node, LocalVariableElement variable,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_INVOKE,
-        element: variable, arguments: arguments, selector: callStructure));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitLocalVariableSet(
-      SendSet node, LocalVariableElement variable, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_SET,
-        element: variable, rhs: rhs));
-    super.visitLocalVariableSet(node, variable, rhs, arg);
-  }
-
-  @override
-  visitFinalLocalVariableSet(
-      SendSet node, LocalVariableElement variable, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_SET,
-        element: variable, rhs: rhs));
-    super.visitFinalLocalVariableSet(node, variable, rhs, arg);
-  }
-
-  @override
-  visitParameterGet(Send node, ParameterElement parameter, arg) {
-    visits.add(new Visit(VisitKind.VISIT_PARAMETER_GET, element: parameter));
-  }
-
-  @override
-  visitParameterInvoke(Send node, ParameterElement parameter,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_PARAMETER_INVOKE,
-        element: parameter, arguments: arguments, selector: callStructure));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitParameterSet(SendSet node, ParameterElement parameter, Node rhs, arg) {
-    visits.add(
-        new Visit(VisitKind.VISIT_PARAMETER_SET, element: parameter, rhs: rhs));
-    super.visitParameterSet(node, parameter, rhs, arg);
-  }
-
-  @override
-  visitFinalParameterSet(
-      SendSet node, ParameterElement parameter, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_FINAL_PARAMETER_SET,
-        element: parameter, rhs: rhs));
-    super.visitFinalParameterSet(node, parameter, rhs, arg);
-  }
-
-  @override
-  visitStaticFieldGet(Send node, FieldElement field, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_GET, element: field));
-  }
-
-  @override
-  visitStaticFieldInvoke(Send node, FieldElement field, NodeList arguments,
-      CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_INVOKE,
-        element: field, arguments: arguments));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitStaticFieldSet(SendSet node, FieldElement field, Node rhs, arg) {
-    visits.add(
-        new Visit(VisitKind.VISIT_STATIC_FIELD_SET, element: field, rhs: rhs));
-    super.visitStaticFieldSet(node, field, rhs, arg);
-  }
-
-  @override
-  visitFinalStaticFieldSet(SendSet node, FieldElement field, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_FINAL_STATIC_FIELD_SET,
-        element: field, rhs: rhs));
-    super.visitFinalStaticFieldSet(node, field, rhs, arg);
-  }
-
-  @override
-  visitStaticFunctionGet(Send node, MethodElement function, arg) {
-    visits
-        .add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_GET, element: function));
-  }
-
-  @override
-  visitStaticFunctionSet(SendSet node, MethodElement function, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_SET,
-        element: function, rhs: rhs));
-    super.visitStaticFunctionSet(node, function, rhs, arg);
-  }
-
-  @override
-  visitStaticFunctionInvoke(Send node, MethodElement function,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_INVOKE,
-        element: function, arguments: arguments));
-    super.visitStaticFunctionInvoke(
-        node, function, arguments, callStructure, arg);
-  }
-
-  @override
-  visitStaticFunctionIncompatibleInvoke(Send node, MethodElement function,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_FUNCTION_INCOMPATIBLE_INVOKE,
-        element: function, arguments: arguments));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitStaticGetterGet(Send node, FunctionElement getter, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_GET, element: getter));
-    super.visitStaticGetterGet(node, getter, arg);
-  }
-
-  @override
-  visitStaticGetterSet(SendSet node, MethodElement getter, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SET,
-        element: getter, rhs: rhs));
-    super.visitStaticGetterSet(node, getter, rhs, arg);
-  }
-
-  @override
-  visitStaticGetterInvoke(Send node, FunctionElement getter, NodeList arguments,
-      CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_INVOKE,
-        element: getter, arguments: arguments));
-    super.visitStaticGetterInvoke(node, getter, arguments, callStructure, arg);
-  }
-
-  @override
-  visitStaticSetterInvoke(Send node, FunctionElement setter, NodeList arguments,
-      CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_SETTER_INVOKE,
-        element: setter, arguments: arguments));
-    super.visitStaticSetterInvoke(node, setter, arguments, callStructure, arg);
-  }
-
-  @override
-  visitStaticSetterGet(Send node, FunctionElement getter, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_SETTER_GET, element: getter));
-    super.visitStaticSetterGet(node, getter, arg);
-  }
-
-  @override
-  visitStaticSetterSet(SendSet node, FunctionElement setter, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_SETTER_SET,
-        element: setter, rhs: rhs));
-    super.visitStaticSetterSet(node, setter, rhs, arg);
-  }
-
-  @override
-  visitSuperBinary(Send node, FunctionElement function, BinaryOperator operator,
-      Node argument, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_BINARY,
-        element: function, operator: operator, right: argument));
-    apply(argument, arg);
-  }
-
-  @override
-  visitUnresolvedSuperBinary(
-      Send node, Element element, BinaryOperator operator, Node argument, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_BINARY,
-        operator: operator, right: argument));
-    apply(argument, arg);
-  }
-
-  @override
-  visitSuperIndex(Send node, FunctionElement function, Node index, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX,
-        element: function, index: index));
-    apply(index, arg);
-  }
-
-  @override
-  visitUnresolvedSuperIndex(Send node, Element element, Node index, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX, index: index));
-    apply(index, arg);
-  }
-
-  @override
-  visitSuperNotEquals(Send node, FunctionElement function, Node argument, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_NOT_EQUALS,
-        element: function, right: argument));
-    apply(argument, arg);
-  }
-
-  @override
-  visitThisGet(Identifier node, arg) {
-    visits.add(new Visit(VisitKind.VISIT_THIS_GET));
-  }
-
-  @override
-  visitThisInvoke(
-      Send node, NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_THIS_INVOKE, arguments: arguments));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitThisPropertyGet(Send node, Name name, arg) {
-    visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_GET, name: name));
-    super.visitThisPropertyGet(node, name, arg);
-  }
-
-  @override
-  visitThisPropertyInvoke(
-      Send node, NodeList arguments, Selector selector, arg) {
-    visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_INVOKE,
-        name: selector.name, arguments: arguments));
-    super.visitThisPropertyInvoke(node, arguments, selector, arg);
-  }
-
-  @override
-  visitThisPropertySet(SendSet node, Name name, Node rhs, arg) {
-    visits.add(
-        new Visit(VisitKind.VISIT_THIS_PROPERTY_SET, name: name, rhs: rhs));
-    super.visitThisPropertySet(node, name, rhs, arg);
-  }
-
-  @override
-  visitTopLevelFieldGet(Send node, FieldElement field, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_GET, element: field));
-  }
-
-  @override
-  visitTopLevelFieldInvoke(Send node, FieldElement field, NodeList arguments,
-      CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_INVOKE,
-        element: field, arguments: arguments));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitTopLevelFieldSet(SendSet node, FieldElement field, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_SET,
-        element: field, rhs: rhs));
-    super.visitTopLevelFieldSet(node, field, rhs, arg);
-  }
-
-  @override
-  visitFinalTopLevelFieldSet(SendSet node, FieldElement field, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_FINAL_TOP_LEVEL_FIELD_SET,
-        element: field, rhs: rhs));
-    super.visitFinalTopLevelFieldSet(node, field, rhs, arg);
-  }
-
-  @override
-  visitTopLevelFunctionGet(Send node, MethodElement function, arg) {
-    visits.add(
-        new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_GET, element: function));
-  }
-
-  @override
-  visitTopLevelFunctionSet(
-      SendSet node, MethodElement function, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_SET,
-        element: function, rhs: rhs));
-    super.visitTopLevelFunctionSet(node, function, rhs, arg);
-  }
-
-  @override
-  visitTopLevelFunctionInvoke(Send node, MethodElement function,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INVOKE,
-        element: function, arguments: arguments));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitTopLevelFunctionIncompatibleInvoke(Send node, MethodElement function,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INCOMPATIBLE_INVOKE,
-        element: function, arguments: arguments));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitTopLevelGetterGet(Send node, FunctionElement getter, arg) {
-    visits
-        .add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_GET, element: getter));
-    super.visitTopLevelGetterGet(node, getter, arg);
-  }
-
-  @override
-  visitTopLevelSetterGet(Send node, FunctionElement setter, arg) {
-    visits
-        .add(new Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_GET, element: setter));
-    super.visitTopLevelSetterGet(node, setter, arg);
-  }
-
-  @override
-  visitTopLevelGetterInvoke(Send node, FunctionElement getter,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_INVOKE,
-        element: getter, arguments: arguments));
-    super
-        .visitTopLevelGetterInvoke(node, getter, arguments, callStructure, arg);
-  }
-
-  @override
-  visitTopLevelSetterInvoke(Send node, FunctionElement setter,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_INVOKE,
-        element: setter, arguments: arguments));
-    super
-        .visitTopLevelSetterInvoke(node, setter, arguments, callStructure, arg);
-  }
-
-  @override
-  visitTopLevelGetterSet(SendSet node, FunctionElement getter, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SET,
-        element: getter, rhs: rhs));
-    super.visitTopLevelGetterSet(node, getter, rhs, arg);
-  }
-
-  @override
-  visitTopLevelSetterSet(SendSet node, FunctionElement setter, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_SETTER_SET,
-        element: setter, rhs: rhs));
-    super.visitTopLevelSetterSet(node, setter, rhs, arg);
-  }
-
-  @override
-  visitTypeVariableTypeLiteralGet(Send node, TypeVariableElement element, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_GET,
-        element: element));
-  }
-
-  @override
-  visitTypeVariableTypeLiteralInvoke(Send node, TypeVariableElement element,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_INVOKE,
-        element: element, arguments: arguments));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitTypeVariableTypeLiteralSet(
-      SendSet node, TypeVariableElement element, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET,
-        element: element, rhs: rhs));
-    super.visitTypeVariableTypeLiteralSet(node, element, rhs, arg);
-  }
-
-  @override
-  visitTypedefTypeLiteralGet(Send node, ConstantExpression constant, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_GET,
-        constant: constant.toDartText()));
-  }
-
-  @override
-  visitTypedefTypeLiteralInvoke(Send node, ConstantExpression constant,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_INVOKE,
-        constant: constant.toDartText(), arguments: arguments));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitTypedefTypeLiteralSet(
-      SendSet node, ConstantExpression constant, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_SET,
-        constant: constant.toDartText(), rhs: rhs));
-    super.visitTypedefTypeLiteralSet(node, constant, rhs, arg);
-  }
-
-  @override
-  visitUnary(Send node, UnaryOperator operator, Node expression, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNARY,
-        expression: expression, operator: operator));
-    super.visitUnary(node, operator, expression, arg);
-  }
-
-  @override
-  errorUndefinedUnaryExpression(
-      Send node, Operator operator, Node expression, arg) {
-    visits.add(new Visit(VisitKind.ERROR_UNDEFINED_UNARY_EXPRESSION,
-        expression: expression, operator: operator));
-    super.errorUndefinedUnaryExpression(node, operator, expression, arg);
-  }
-
-  @override
-  visitNot(Send node, Node expression, arg) {
-    visits.add(new Visit(VisitKind.VISIT_NOT, expression: expression));
-    apply(expression, arg);
-  }
-
-  @override
-  visitSuperFieldGet(Send node, FieldElement field, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_GET, element: field));
-  }
-
-  @override
-  visitUnresolvedSuperGet(Send node, Element element, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GET));
-    return super.visitUnresolvedSuperGet(node, element, arg);
-  }
-
-  @override
-  visitUnresolvedSuperSet(Send node, Element element, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SET, rhs: rhs));
-    return super.visitUnresolvedSuperSet(node, element, rhs, arg);
-  }
-
-  @override
-  visitSuperFieldInvoke(Send node, FieldElement field, NodeList arguments,
-      CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_INVOKE,
-        element: field, arguments: arguments));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitUnresolvedSuperInvoke(
-      Send node, Element element, NodeList arguments, Selector selector, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INVOKE,
-        arguments: arguments));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitSuperFieldSet(SendSet node, FieldElement field, Node rhs, arg) {
-    visits.add(
-        new Visit(VisitKind.VISIT_SUPER_FIELD_SET, element: field, rhs: rhs));
-    super.visitSuperFieldSet(node, field, rhs, arg);
-  }
-
-  @override
-  visitFinalSuperFieldSet(SendSet node, FieldElement field, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_FINAL_SUPER_FIELD_SET,
-        element: field, rhs: rhs));
-    super.visitFinalSuperFieldSet(node, field, rhs, arg);
-  }
-
-  @override
-  visitSuperMethodGet(Send node, MethodElement method, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_GET, element: method));
-  }
-
-  @override
-  visitSuperMethodSet(SendSet node, MethodElement method, Node rhs, arg) {
-    visits.add(
-        new Visit(VisitKind.VISIT_SUPER_METHOD_SET, element: method, rhs: rhs));
-    super.visitSuperMethodSet(node, method, rhs, arg);
-  }
-
-  @override
-  visitSuperMethodInvoke(Send node, MethodElement method, NodeList arguments,
-      CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_INVOKE,
-        element: method, arguments: arguments));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitSuperMethodIncompatibleInvoke(Send node, MethodElement method,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_INCOMPATIBLE_INVOKE,
-        element: method, arguments: arguments));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitSuperGetterGet(Send node, FunctionElement getter, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_GET, element: getter));
-    super.visitSuperGetterGet(node, getter, arg);
-  }
-
-  @override
-  visitSuperSetterGet(Send node, FunctionElement setter, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_SETTER_GET, element: setter));
-    super.visitSuperSetterGet(node, setter, arg);
-  }
-
-  @override
-  visitSuperGetterInvoke(Send node, FunctionElement getter, NodeList arguments,
-      CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_INVOKE,
-        element: getter, arguments: arguments));
-    super.visitSuperGetterInvoke(node, getter, arguments, callStructure, arg);
-  }
-
-  @override
-  visitSuperSetterInvoke(Send node, FunctionElement setter, NodeList arguments,
-      CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_SETTER_INVOKE,
-        element: setter, arguments: arguments));
-    super.visitSuperSetterInvoke(node, setter, arguments, callStructure, arg);
-  }
-
-  @override
-  visitSuperGetterSet(SendSet node, FunctionElement getter, Node rhs, arg) {
-    visits.add(
-        new Visit(VisitKind.VISIT_SUPER_GETTER_SET, element: getter, rhs: rhs));
-    super.visitSuperGetterSet(node, getter, rhs, arg);
-  }
-
-  @override
-  visitSuperSetterSet(SendSet node, FunctionElement setter, Node rhs, arg) {
-    visits.add(
-        new Visit(VisitKind.VISIT_SUPER_SETTER_SET, element: setter, rhs: rhs));
-    super.visitSuperSetterSet(node, setter, rhs, arg);
-  }
-
-  @override
-  visitSuperUnary(
-      Send node, UnaryOperator operator, FunctionElement function, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_UNARY,
-        element: function, operator: operator));
-  }
-
-  @override
-  visitUnresolvedSuperUnary(
-      Send node, UnaryOperator operator, Element element, arg) {
-    visits.add(
-        new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_UNARY, operator: operator));
-  }
-
-  @override
-  visitEquals(Send node, Node left, Node right, arg) {
-    visits.add(new Visit(VisitKind.VISIT_EQUALS, left: left, right: right));
-    apply(left, arg);
-    apply(right, arg);
-  }
-
-  @override
-  visitSuperEquals(Send node, FunctionElement function, Node argument, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_EQUALS,
-        element: function, right: argument));
-    apply(argument, arg);
-  }
-
-  @override
-  visitIndexSet(Send node, Node receiver, Node index, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_INDEX_SET,
-        receiver: receiver, index: index, rhs: rhs));
-    apply(receiver, arg);
-    apply(index, arg);
-    apply(rhs, arg);
-  }
-
-  @override
-  visitSuperIndexSet(
-      Send node, FunctionElement function, Node index, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX_SET,
-        element: function, index: index, rhs: rhs));
-    apply(index, arg);
-    apply(rhs, arg);
-  }
-
-  @override
-  visitDynamicPropertyCompound(Send node, Node receiver, Name name,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_COMPOUND,
-        receiver: receiver, operator: operator, rhs: rhs, name: name));
-    super
-        .visitDynamicPropertyCompound(node, receiver, name, operator, rhs, arg);
-  }
-
-  @override
-  visitFinalLocalVariableCompound(Send node, LocalVariableElement variable,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_COMPOUND,
-        element: variable, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitFinalLocalVariablePrefix(
-      Send node, LocalVariableElement variable, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_PREFIX,
-        element: variable, operator: operator));
-  }
-
-  @override
-  visitFinalLocalVariablePostfix(
-      Send node, LocalVariableElement variable, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_POSTFIX,
-        element: variable, operator: operator));
-  }
-
-  @override
-  visitFinalParameterCompound(Send node, ParameterElement parameter,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_FINAL_PARAMETER_COMPOUND,
-        element: parameter, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitFinalParameterPrefix(
-      Send node, ParameterElement parameter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_FINAL_PARAMETER_PREFIX,
-        element: parameter, operator: operator));
-  }
-
-  @override
-  visitFinalParameterPostfix(
-      Send node, ParameterElement parameter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_FINAL_PARAMETER_POSTFIX,
-        element: parameter, operator: operator));
-  }
-
-  @override
-  visitFinalStaticFieldCompound(Send node, FieldElement field,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_COMPOUND,
-        element: field, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitFinalStaticFieldPostfix(
-      Send node, FieldElement field, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_POSTFIX,
-        element: field, operator: operator));
-  }
-
-  @override
-  visitFinalStaticFieldPrefix(
-      Send node, FieldElement field, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_PREFIX,
-        element: field, operator: operator));
-  }
-
-  @override
-  visitFinalSuperFieldCompound(Send node, FieldElement field,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FINAL_FIELD_COMPOUND,
-        element: field, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitFinalTopLevelFieldCompound(Send node, FieldElement field,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_COMPOUND,
-        element: field, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitFinalTopLevelFieldPostfix(
-      Send node, FieldElement field, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_POSTFIX,
-        element: field, operator: operator));
-  }
-
-  @override
-  visitFinalTopLevelFieldPrefix(
-      Send node, FieldElement field, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_PREFIX,
-        element: field, operator: operator));
-  }
-
-  @override
-  visitLocalFunctionCompound(Send node, LocalFunctionElement function,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_COMPOUND,
-        element: function, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitLocalVariableCompound(Send node, LocalVariableElement variable,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_COMPOUND,
-        element: variable, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitParameterCompound(Send node, ParameterElement parameter,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_PARAMETER_COMPOUND,
-        element: parameter, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitStaticFieldCompound(Send node, FieldElement field,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_COMPOUND,
-        element: field, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitStaticGetterSetterCompound(Send node, FunctionElement getter,
-      FunctionElement setter, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_COMPOUND,
-        operator: operator, rhs: rhs, getter: getter, setter: setter));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitSuperFieldCompound(Send node, FieldElement field,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_COMPOUND,
-        element: field, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitSuperGetterSetterCompound(Send node, FunctionElement getter,
-      FunctionElement setter, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_COMPOUND,
-        operator: operator, rhs: rhs, getter: getter, setter: setter));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitThisPropertyCompound(
-      Send node, Name name, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_COMPOUND,
-        name: name, operator: operator, rhs: rhs));
-    super.visitThisPropertyCompound(node, name, operator, rhs, arg);
-  }
-
-  @override
-  visitTopLevelFieldCompound(Send node, FieldElement field,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_COMPOUND,
-        element: field, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitTopLevelGetterSetterCompound(Send node, FunctionElement getter,
-      FunctionElement setter, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_COMPOUND,
-        operator: operator, rhs: rhs, getter: getter, setter: setter));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitStaticMethodSetterCompound(Send node, FunctionElement method,
-      FunctionElement setter, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND,
-        operator: operator, rhs: rhs, getter: method, setter: setter));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitSuperFieldSetterCompound(Send node, FieldElement field,
-      FunctionElement setter, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_COMPOUND,
-        operator: operator, rhs: rhs, getter: field, setter: setter));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitSuperGetterFieldCompound(Send node, FunctionElement getter,
-      FieldElement field, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_COMPOUND,
-        operator: operator, rhs: rhs, getter: getter, setter: field));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitSuperMethodSetterCompound(Send node, FunctionElement method,
-      FunctionElement setter, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_SETTER_COMPOUND,
-        getter: method, setter: setter, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitSuperMethodCompound(Send node, FunctionElement method,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_COMPOUND,
-        element: method, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitSuperMethodPrefix(
-      Send node, FunctionElement method, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_PREFIX,
-        element: method, operator: operator));
-  }
-
-  @override
-  visitSuperMethodPostfix(
-      Send node, FunctionElement method, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_POSTFIX,
-        element: method, operator: operator));
-  }
-
-  @override
-  visitUnresolvedSuperCompound(
-      Send node, Element element, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_COMPOUND,
-        operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitUnresolvedSuperPrefix(
-      Send node, Element element, IncDecOperator operator, arg) {
-    visits.add(
-        new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_PREFIX, operator: operator));
-  }
-
-  @override
-  visitUnresolvedSuperPostfix(
-      Send node, Element element, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_POSTFIX,
-        operator: operator));
-  }
-
-  @override
-  visitTopLevelMethodSetterCompound(Send node, FunctionElement method,
-      FunctionElement setter, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_COMPOUND,
-        getter: method, setter: setter, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitCompoundIndexSet(Send node, Node receiver, Node index,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_COMPOUND_INDEX_SET,
-        receiver: receiver, index: index, rhs: rhs, operator: operator));
-    apply(receiver, arg);
-    apply(index, arg);
-    apply(rhs, arg);
-  }
-
-  @override
-  visitSuperCompoundIndexSet(
-      Send node,
-      FunctionElement getter,
-      FunctionElement setter,
-      Node index,
-      AssignmentOperator operator,
-      Node rhs,
-      arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_COMPOUND_INDEX_SET,
-        getter: getter,
-        setter: setter,
-        index: index,
-        rhs: rhs,
-        operator: operator));
-    apply(index, arg);
-    apply(rhs, arg);
-  }
-
-  @override
-  visitClassTypeLiteralCompound(Send node, ConstantExpression constant,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_COMPOUND,
-        constant: constant.toDartText(), operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitDynamicTypeLiteralCompound(Send node, ConstantExpression constant,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_COMPOUND,
-        constant: constant.toDartText(), operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitTypeVariableTypeLiteralCompound(Send node, TypeVariableElement element,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND,
-        element: element, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitTypedefTypeLiteralCompound(Send node, ConstantExpression constant,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND,
-        constant: constant.toDartText(), operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitLocalFunctionPrefix(
-      Send node, LocalFunctionElement function, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_PREFIX,
-        element: function, operator: operator));
-  }
-
-  @override
-  visitClassTypeLiteralPrefix(
-      Send node, ConstantExpression constant, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_PREFIX,
-        constant: constant.toDartText(), operator: operator));
-  }
-
-  @override
-  visitDynamicTypeLiteralPrefix(
-      Send node, ConstantExpression constant, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_PREFIX,
-        constant: constant.toDartText(), operator: operator));
-  }
-
-  @override
-  visitLocalVariablePrefix(
-      Send node, LocalVariableElement variable, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_PREFIX,
-        element: variable, operator: operator));
-  }
-
-  @override
-  visitParameterPrefix(
-      Send node, ParameterElement parameter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_PARAMETER_PREFIX,
-        element: parameter, operator: operator));
-  }
-
-  @override
-  visitStaticFieldPrefix(
-      Send node, FieldElement field, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_PREFIX,
-        element: field, operator: operator));
-  }
-
-  @override
-  visitStaticGetterSetterPrefix(Send node, FunctionElement getter,
-      FunctionElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_PREFIX,
-        getter: getter, setter: setter, operator: operator));
-  }
-
-  @override
-  visitStaticMethodSetterPrefix(Send node, FunctionElement getter,
-      FunctionElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_PREFIX,
-        getter: getter, setter: setter, operator: operator));
-  }
-
-  @override
-  visitSuperFieldFieldCompound(Send node, FieldElement readField,
-      FieldElement writtenField, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_FIELD_COMPOUND,
-        getter: readField, setter: writtenField, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitSuperFieldFieldPrefix(Send node, FieldElement readField,
-      FieldElement writtenField, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_FIELD_PREFIX,
-        getter: readField, setter: writtenField, operator: operator));
-  }
-
-  @override
-  visitSuperFieldPrefix(
-      Send node, FieldElement field, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_PREFIX,
-        element: field, operator: operator));
-  }
-
-  @override
-  visitFinalSuperFieldPrefix(
-      Send node, FieldElement field, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FINAL_FIELD_PREFIX,
-        element: field, operator: operator));
-  }
-
-  @override
-  visitSuperFieldSetterPrefix(Send node, FieldElement field,
-      FunctionElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_PREFIX,
-        getter: field, setter: setter, operator: operator));
-  }
-
-  @override
-  visitSuperGetterFieldPrefix(Send node, FunctionElement getter,
-      FieldElement field, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_PREFIX,
-        getter: getter, setter: field, operator: operator));
-  }
-
-  @override
-  visitSuperGetterSetterPrefix(Send node, FunctionElement getter,
-      FunctionElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_PREFIX,
-        getter: getter, setter: setter, operator: operator));
-  }
-
-  @override
-  visitSuperMethodSetterPrefix(Send node, FunctionElement method,
-      FunctionElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_SETTER_PREFIX,
-        getter: method, setter: setter, operator: operator));
-  }
-
-  @override
-  visitThisPropertyPrefix(Send node, Name name, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_PREFIX,
-        name: name, operator: operator));
-    super.visitThisPropertyPrefix(node, name, operator, arg);
-  }
-
-  @override
-  visitTopLevelFieldPrefix(
-      Send node, FieldElement field, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_PREFIX,
-        element: field, operator: operator));
-  }
-
-  @override
-  visitTopLevelGetterSetterPrefix(Send node, FunctionElement getter,
-      FunctionElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_PREFIX,
-        getter: getter, setter: setter, operator: operator));
-  }
-
-  @override
-  visitTopLevelMethodSetterPrefix(Send node, FunctionElement method,
-      FunctionElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_PREFIX,
-        getter: method, setter: setter, operator: operator));
-  }
-
-  @override
-  visitTypeVariableTypeLiteralPrefix(
-      Send node, TypeVariableElement element, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_PREFIX,
-        element: element, operator: operator));
-  }
-
-  @override
-  visitTypedefTypeLiteralPrefix(
-      Send node, ConstantExpression constant, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_PREFIX,
-        constant: constant.toDartText(), operator: operator));
-  }
-
-  @override
-  visitLocalFunctionPostfix(
-      Send node, LocalFunctionElement function, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_POSTFIX,
-        element: function, operator: operator));
-  }
-
-  @override
-  visitClassTypeLiteralPostfix(
-      Send node, ConstantExpression constant, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_POSTFIX,
-        constant: constant.toDartText(), operator: operator));
-  }
-
-  @override
-  visitDynamicTypeLiteralPostfix(
-      Send node, ConstantExpression constant, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_POSTFIX,
-        constant: constant.toDartText(), operator: operator));
-  }
-
-  @override
-  visitLocalVariablePostfix(
-      Send node, LocalVariableElement variable, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_POSTFIX,
-        element: variable, operator: operator));
-  }
-
-  @override
-  visitParameterPostfix(
-      Send node, ParameterElement parameter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_PARAMETER_POSTFIX,
-        element: parameter, operator: operator));
-  }
-
-  @override
-  visitStaticFieldPostfix(
-      Send node, FieldElement field, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_POSTFIX,
-        element: field, operator: operator));
-  }
-
-  @override
-  visitStaticGetterSetterPostfix(Send node, FunctionElement getter,
-      FunctionElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_POSTFIX,
-        getter: getter, setter: setter, operator: operator));
-  }
-
-  @override
-  visitStaticMethodSetterPostfix(Send node, FunctionElement getter,
-      FunctionElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_POSTFIX,
-        getter: getter, setter: setter, operator: operator));
-  }
-
-  @override
-  visitSuperFieldFieldPostfix(Send node, FieldElement readField,
-      FieldElement writtenField, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_FIELD_POSTFIX,
-        getter: readField, setter: writtenField, operator: operator));
-  }
-
-  @override
-  visitSuperFieldPostfix(
-      Send node, FieldElement field, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_POSTFIX,
-        element: field, operator: operator));
-  }
-
-  @override
-  visitFinalSuperFieldPostfix(
-      Send node, FieldElement field, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FINAL_FIELD_POSTFIX,
-        element: field, operator: operator));
-  }
-
-  @override
-  visitSuperFieldSetterPostfix(Send node, FieldElement field,
-      FunctionElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_POSTFIX,
-        getter: field, setter: setter, operator: operator));
-  }
-
-  @override
-  visitSuperGetterFieldPostfix(Send node, FunctionElement getter,
-      FieldElement field, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_POSTFIX,
-        getter: getter, setter: field, operator: operator));
-  }
-
-  @override
-  visitSuperGetterSetterPostfix(Send node, FunctionElement getter,
-      FunctionElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_POSTFIX,
-        getter: getter, setter: setter, operator: operator));
-  }
-
-  @override
-  visitSuperMethodSetterPostfix(Send node, FunctionElement method,
-      FunctionElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_SETTER_POSTFIX,
-        getter: method, setter: setter, operator: operator));
-  }
-
-  @override
-  visitThisPropertyPostfix(Send node, Name name, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_POSTFIX,
-        name: name, operator: operator));
-    super.visitThisPropertyPostfix(node, name, operator, arg);
-  }
-
-  @override
-  visitTopLevelFieldPostfix(
-      Send node, FieldElement field, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_POSTFIX,
-        element: field, operator: operator));
-  }
-
-  @override
-  visitTopLevelGetterSetterPostfix(Send node, FunctionElement getter,
-      FunctionElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_POSTFIX,
-        getter: getter, setter: setter, operator: operator));
-  }
-
-  @override
-  visitTopLevelMethodSetterPostfix(Send node, FunctionElement method,
-      FunctionElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_POSTFIX,
-        getter: method, setter: setter, operator: operator));
-  }
-
-  @override
-  visitTypeVariableTypeLiteralPostfix(
-      Send node, TypeVariableElement element, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_POSTFIX,
-        element: element, operator: operator));
-  }
-
-  @override
-  visitTypedefTypeLiteralPostfix(
-      Send node, ConstantExpression constant, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_POSTFIX,
-        constant: constant.toDartText(), operator: operator));
-  }
-
-  @override
-  visitUnresolvedCompound(Send node, ErroneousElement element,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_COMPOUND,
-        operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitUnresolvedGet(Send node, Element element, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_GET, name: element.name));
-  }
-
-  @override
-  visitUnresolvedSet(Send node, Element element, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SET,
-        name: element.name, rhs: rhs));
-    super.visitUnresolvedSet(node, element, rhs, arg);
-  }
-
-  @override
-  visitUnresolvedInvoke(
-      Send node, Element element, NodeList arguments, Selector selector, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_INVOKE,
-        name: element.name, arguments: arguments));
-    super.visitUnresolvedInvoke(node, element, arguments, selector, arg);
-  }
-
-  @override
-  visitUnresolvedPostfix(
-      Send node, ErroneousElement element, IncDecOperator operator, arg) {
-    visits
-        .add(new Visit(VisitKind.VISIT_UNRESOLVED_POSTFIX, operator: operator));
-  }
-
-  @override
-  visitUnresolvedPrefix(
-      Send node, ErroneousElement element, IncDecOperator operator, arg) {
-    visits
-        .add(new Visit(VisitKind.VISIT_UNRESOLVED_PREFIX, operator: operator));
-  }
-
-  @override
-  visitUnresolvedSuperCompoundIndexSet(Send node, Element element, Node index,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_COMPOUND_INDEX_SET,
-        index: index, operator: operator, rhs: rhs));
-    apply(index, arg);
-    apply(rhs, arg);
-  }
-
-  @override
-  visitUnresolvedSuperGetterCompoundIndexSet(
-      Send node,
-      Element element,
-      MethodElement setter,
-      Node index,
-      AssignmentOperator operator,
-      Node rhs,
-      arg) {
-    visits.add(new Visit(
-        VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND_INDEX_SET,
-        setter: setter,
-        index: index,
-        operator: operator,
-        rhs: rhs));
-    apply(index, arg);
-    apply(rhs, arg);
-  }
-
-  @override
-  visitUnresolvedSuperSetterCompoundIndexSet(Send node, MethodElement getter,
-      Element element, Node index, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(
-        VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND_INDEX_SET,
-        getter: getter,
-        index: index,
-        operator: operator,
-        rhs: rhs));
-    apply(index, arg);
-    apply(rhs, arg);
-  }
-
-  @override
-  visitUnresolvedSuperIndexSet(
-      Send node, ErroneousElement element, Node index, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_SET,
-        index: index, rhs: rhs));
-    apply(index, arg);
-    apply(rhs, arg);
-  }
-
-  @override
-  visitUnresolvedSuperIndexPostfix(
-      Send node, Element element, Node index, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_POSTFIX,
-        index: index, operator: operator));
-    apply(index, arg);
-  }
-
-  @override
-  visitUnresolvedSuperGetterIndexPostfix(Send node, Element element,
-      MethodElement setter, Node index, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_INDEX_POSTFIX,
-        setter: setter, index: index, operator: operator));
-    apply(index, arg);
-  }
-
-  @override
-  visitUnresolvedSuperSetterIndexPostfix(Send node, MethodElement getter,
-      Element element, Node index, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_INDEX_POSTFIX,
-        getter: getter, index: index, operator: operator));
-    apply(index, arg);
-  }
-
-  @override
-  visitUnresolvedSuperIndexPrefix(
-      Send node, Element element, Node index, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_PREFIX,
-        index: index, operator: operator));
-    apply(index, arg);
-  }
-
-  @override
-  visitUnresolvedSuperGetterIndexPrefix(Send node, Element element,
-      MethodElement setter, Node index, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_INDEX_PREFIX,
-        setter: setter, index: index, operator: operator));
-    apply(index, arg);
-  }
-
-  @override
-  visitUnresolvedSuperSetterIndexPrefix(Send node, MethodElement getter,
-      Element element, Node index, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_INDEX_PREFIX,
-        getter: getter, index: index, operator: operator));
-    apply(index, arg);
-  }
-
-  @override
-  visitIndexPostfix(
-      Send node, Node receiver, Node index, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_INDEX_POSTFIX,
-        receiver: receiver, index: index, operator: operator));
-    apply(receiver, arg);
-    apply(index, arg);
-  }
-
-  @override
-  visitIndexPrefix(
-      Send node, Node receiver, Node index, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_INDEX_PREFIX,
-        receiver: receiver, index: index, operator: operator));
-    apply(receiver, arg);
-    apply(index, arg);
-  }
-
-  @override
-  visitSuperIndexPostfix(
-      Send node,
-      FunctionElement indexFunction,
-      FunctionElement indexSetFunction,
-      Node index,
-      IncDecOperator operator,
-      arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX_POSTFIX,
-        getter: indexFunction,
-        setter: indexSetFunction,
-        index: index,
-        operator: operator));
-    apply(index, arg);
-  }
-
-  @override
-  visitSuperIndexPrefix(
-      Send node,
-      FunctionElement indexFunction,
-      FunctionElement indexSetFunction,
-      Node index,
-      IncDecOperator operator,
-      arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX_PREFIX,
-        getter: indexFunction,
-        setter: indexSetFunction,
-        index: index,
-        operator: operator));
-    apply(index, arg);
-  }
-
-  @override
-  visitUnresolvedClassConstructorInvoke(NewExpression node, Element constructor,
-      ResolutionDartType type, NodeList arguments, Selector selector, arg) {
-    // TODO(johnniwinther): Test [type] when it is not `dynamic`.
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_CLASS_CONSTRUCTOR_INVOKE,
-        arguments: arguments));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitUnresolvedConstructorInvoke(NewExpression node, Element constructor,
-      ResolutionDartType type, NodeList arguments, Selector selector, arg) {
-    // TODO(johnniwinther): Test [type] when it is not `dynamic`.
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_CONSTRUCTOR_INVOKE,
-        arguments: arguments));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitConstConstructorInvoke(
-      NewExpression node, ConstructedConstantExpression constant, arg) {
-    visits.add(new Visit(VisitKind.VISIT_CONST_CONSTRUCTOR_INVOKE,
-        constant: constant.toDartText()));
-    super.visitConstConstructorInvoke(node, constant, arg);
-  }
-
-  @override
-  visitBoolFromEnvironmentConstructorInvoke(
-      NewExpression node, BoolFromEnvironmentConstantExpression constant, arg) {
-    visits.add(new Visit(
-        VisitKind.VISIT_BOOL_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
-        constant: constant.toDartText()));
-    super.visitBoolFromEnvironmentConstructorInvoke(node, constant, arg);
-  }
-
-  @override
-  visitIntFromEnvironmentConstructorInvoke(
-      NewExpression node, IntFromEnvironmentConstantExpression constant, arg) {
-    visits.add(new Visit(
-        VisitKind.VISIT_INT_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
-        constant: constant.toDartText()));
-    super.visitIntFromEnvironmentConstructorInvoke(node, constant, arg);
-  }
-
-  @override
-  visitStringFromEnvironmentConstructorInvoke(NewExpression node,
-      StringFromEnvironmentConstantExpression constant, arg) {
-    visits.add(new Visit(
-        VisitKind.VISIT_STRING_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE,
-        constant: constant.toDartText()));
-    super.visitStringFromEnvironmentConstructorInvoke(node, constant, arg);
-  }
-
-  @override
-  errorNonConstantConstructorInvoke(
-      NewExpression node,
-      Element element,
-      ResolutionDartType type,
-      NodeList arguments,
-      CallStructure callStructure,
-      arg) {
-    visits.add(new Visit(VisitKind.ERROR_NON_CONSTANT_CONSTRUCTOR_INVOKE,
-        element: element,
-        type: type,
-        arguments: arguments,
-        selector: callStructure));
-    super.errorNonConstantConstructorInvoke(
-        node, element, type, arguments, callStructure, arg);
-  }
-
-  @override
-  visitConstructorIncompatibleInvoke(
-      NewExpression node,
-      ConstructorElement constructor,
-      ResolutionInterfaceType type,
-      NodeList arguments,
-      CallStructure callStructure,
-      arg) {
-    visits.add(new Visit(VisitKind.VISIT_CONSTRUCTOR_INCOMPATIBLE_INVOKE,
-        element: constructor,
-        type: type,
-        arguments: arguments,
-        selector: callStructure));
-    super.visitConstructorIncompatibleInvoke(
-        node, constructor, type, arguments, callStructure, arg);
-  }
-
-  @override
-  visitFactoryConstructorInvoke(
-      NewExpression node,
-      ConstructorElement constructor,
-      ResolutionInterfaceType type,
-      NodeList arguments,
-      CallStructure callStructure,
-      arg) {
-    visits.add(new Visit(VisitKind.VISIT_FACTORY_CONSTRUCTOR_INVOKE,
-        element: constructor,
-        type: type,
-        arguments: arguments,
-        selector: callStructure));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitGenerativeConstructorInvoke(
-      NewExpression node,
-      ConstructorElement constructor,
-      ResolutionInterfaceType type,
-      NodeList arguments,
-      CallStructure callStructure,
-      arg) {
-    visits.add(new Visit(VisitKind.VISIT_GENERATIVE_CONSTRUCTOR_INVOKE,
-        element: constructor,
-        type: type,
-        arguments: arguments,
-        selector: callStructure));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitRedirectingFactoryConstructorInvoke(
-      NewExpression node,
-      ConstructorElement constructor,
-      ResolutionInterfaceType type,
-      ConstructorElement effectiveTarget,
-      ResolutionInterfaceType effectiveTargetType,
-      NodeList arguments,
-      CallStructure callStructure,
-      arg) {
-    visits.add(new Visit(VisitKind.VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
-        element: constructor,
-        type: type,
-        target: effectiveTarget,
-        targetType: effectiveTargetType,
-        arguments: arguments,
-        selector: callStructure));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitRedirectingGenerativeConstructorInvoke(
-      NewExpression node,
-      ConstructorElement constructor,
-      ResolutionInterfaceType type,
-      NodeList arguments,
-      CallStructure callStructure,
-      arg) {
-    visits.add(new Visit(
-        VisitKind.VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_INVOKE,
-        element: constructor,
-        type: type,
-        arguments: arguments,
-        selector: callStructure));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitAbstractClassConstructorInvoke(
-      NewExpression node,
-      ConstructorElement constructor,
-      ResolutionInterfaceType type,
-      NodeList arguments,
-      CallStructure callStructure,
-      arg) {
-    visits.add(new Visit(VisitKind.VISIT_ABSTRACT_CLASS_CONSTRUCTOR_INVOKE,
-        element: constructor,
-        type: type,
-        arguments: arguments,
-        selector: callStructure));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitUnresolvedRedirectingFactoryConstructorInvoke(
-      NewExpression node,
-      ConstructorElement constructor,
-      ResolutionInterfaceType type,
-      NodeList arguments,
-      CallStructure callStructure,
-      arg) {
-    visits.add(new Visit(
-        VisitKind.VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE,
-        element: constructor,
-        type: type,
-        arguments: arguments,
-        selector: callStructure));
-    apply(arguments, arg);
-  }
-
-  @override
-  visitUnresolvedStaticGetterCompound(Send node, Element element,
-      MethodElement setter, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_COMPOUND,
-        setter: setter, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitUnresolvedTopLevelGetterCompound(Send node, Element element,
-      MethodElement setter, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_COMPOUND,
-        setter: setter, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitUnresolvedStaticSetterCompound(Send node, MethodElement getter,
-      Element element, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_COMPOUND,
-        getter: getter, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitUnresolvedTopLevelSetterCompound(Send node, MethodElement getter,
-      Element element, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_COMPOUND,
-        getter: getter, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitStaticMethodCompound(Send node, MethodElement method,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_COMPOUND,
-        element: method, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitTopLevelMethodCompound(Send node, MethodElement method,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_COMPOUND,
-        element: method, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitUnresolvedStaticGetterPrefix(Send node, Element element,
-      MethodElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_PREFIX,
-        setter: setter, operator: operator));
-  }
-
-  @override
-  visitUnresolvedTopLevelGetterPrefix(Send node, Element element,
-      MethodElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_PREFIX,
-        setter: setter, operator: operator));
-  }
-
-  @override
-  visitUnresolvedStaticSetterPrefix(Send node, MethodElement getter,
-      Element element, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_PREFIX,
-        getter: getter, operator: operator));
-  }
-
-  @override
-  visitUnresolvedTopLevelSetterPrefix(Send node, MethodElement getter,
-      Element element, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_PREFIX,
-        getter: getter, operator: operator));
-  }
-
-  @override
-  visitStaticMethodPrefix(
-      Send node, MethodElement method, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_PREFIX,
-        element: method, operator: operator));
-  }
-
-  @override
-  visitTopLevelMethodPrefix(
-      Send node, MethodElement method, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_PREFIX,
-        element: method, operator: operator));
-  }
-
-  @override
-  visitUnresolvedStaticGetterPostfix(Send node, Element element,
-      MethodElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_POSTFIX,
-        setter: setter, operator: operator));
-  }
-
-  @override
-  visitUnresolvedTopLevelGetterPostfix(Send node, Element element,
-      MethodElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_POSTFIX,
-        setter: setter, operator: operator));
-  }
-
-  @override
-  visitUnresolvedStaticSetterPostfix(Send node, MethodElement getter,
-      Element element, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_POSTFIX,
-        getter: getter, operator: operator));
-  }
-
-  @override
-  visitUnresolvedTopLevelSetterPostfix(Send node, MethodElement getter,
-      Element element, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_POSTFIX,
-        getter: getter, operator: operator));
-  }
-
-  @override
-  visitStaticMethodPostfix(
-      Send node, MethodElement method, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_POSTFIX,
-        element: method, operator: operator));
-  }
-
-  @override
-  visitTopLevelMethodPostfix(
-      Send node, MethodElement method, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_POSTFIX,
-        element: method, operator: operator));
-  }
-
-  @override
-  visitUnresolvedSuperGetterCompound(Send node, Element element,
-      MethodElement setter, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND,
-        setter: setter, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitUnresolvedSuperGetterPostfix(Send node, Element element,
-      MethodElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_POSTFIX,
-        setter: setter, operator: operator));
-  }
-
-  @override
-  visitUnresolvedSuperGetterPrefix(Send node, Element element,
-      MethodElement setter, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_PREFIX,
-        setter: setter, operator: operator));
-  }
-
-  @override
-  visitUnresolvedSuperSetterCompound(Send node, MethodElement getter,
-      Element element, AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND,
-        getter: getter, operator: operator, rhs: rhs));
-    apply(rhs, arg);
-  }
-
-  @override
-  visitUnresolvedSuperSetterPostfix(Send node, MethodElement getter,
-      Element element, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_POSTFIX,
-        getter: getter, operator: operator));
-  }
-
-  @override
-  visitUnresolvedSuperSetterPrefix(Send node, MethodElement getter,
-      Element element, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_PREFIX,
-        getter: getter, operator: operator));
-  }
-
-  @override
-  visitIfNotNullDynamicPropertyGet(Send node, Node receiver, Name name, arg) {
-    visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_GET,
-        receiver: receiver, name: name));
-    super.visitIfNotNullDynamicPropertyGet(node, receiver, name, arg);
-  }
-
-  @override
-  visitIfNotNullDynamicPropertySet(
-      Send node, Node receiver, Name name, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_SET,
-        receiver: receiver, name: name, rhs: rhs));
-    super.visitIfNotNullDynamicPropertySet(node, receiver, name, rhs, arg);
-  }
-
-  @override
-  visitIfNotNullDynamicPropertyInvoke(
-      Send node, Node receiver, NodeList arguments, Selector selector, arg) {
-    visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_INVOKE,
-        receiver: receiver, selector: selector, arguments: arguments));
-    super.visitIfNotNullDynamicPropertyInvoke(
-        node, receiver, arguments, selector, arg);
-  }
-
-  @override
-  visitIfNotNullDynamicPropertyPrefix(
-      Send node, Node receiver, Name name, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_PREFIX,
-        receiver: receiver, name: name, operator: operator));
-    super.visitIfNotNullDynamicPropertyPrefix(
-        node, receiver, name, operator, arg);
-  }
-
-  @override
-  visitIfNotNullDynamicPropertyPostfix(
-      Send node, Node receiver, Name name, IncDecOperator operator, arg) {
-    visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_POSTFIX,
-        receiver: receiver, name: name, operator: operator));
-    super.visitIfNotNullDynamicPropertyPostfix(
-        node, receiver, name, operator, arg);
-  }
-
-  @override
-  visitIfNotNullDynamicPropertyCompound(Send node, Node receiver, Name name,
-      AssignmentOperator operator, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_COMPOUND,
-        receiver: receiver, name: name, operator: operator, rhs: rhs));
-    super.visitIfNotNullDynamicPropertyCompound(
-        node, receiver, name, operator, rhs, arg);
-  }
-
-  @override
-  visitIfNull(Send node, Node left, Node right, arg) {
-    visits.add(new Visit(VisitKind.VISIT_IF_NULL, left: left, right: right));
-    super.visitIfNull(node, left, right, arg);
-  }
-
-  @override
-  visitConstantGet(Send node, ConstantExpression constant, arg) {
-    visits.add(new Visit(VisitKind.VISIT_CONSTANT_GET,
-        constant: constant.toDartText()));
-    super.visitConstantGet(node, constant, arg);
-  }
-
-  @override
-  visitConstantInvoke(Send node, ConstantExpression constant,
-      NodeList arguments, CallStructure callStructure, arg) {
-    visits.add(new Visit(VisitKind.VISIT_CONSTANT_INVOKE,
-        constant: constant.toDartText()));
-    super.visitConstantInvoke(node, constant, arguments, callStructure, arg);
-  }
-
-  @override
-  previsitDeferredAccess(Send node, PrefixElement prefix, arg) {
-    visits.add(new Visit(VisitKind.PREVISIT_DEFERRED_ACCESS, element: prefix));
-  }
-
-  @override
-  visitClassTypeLiteralSetIfNull(
-      Send node, ConstantExpression constant, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_CLASS_TYPE_LITERAL_SET_IF_NULL,
-        constant: constant.toDartText(), rhs: rhs));
-    super.visitClassTypeLiteralSetIfNull(node, constant, rhs, arg);
-  }
-
-  @override
-  visitDynamicPropertySetIfNull(
-      Send node, Node receiver, Name name, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_DYNAMIC_PROPERTY_SET_IF_NULL,
-        receiver: receiver, name: name, rhs: rhs));
-    super.visitDynamicPropertySetIfNull(node, receiver, name, rhs, arg);
-  }
-
-  @override
-  visitDynamicTypeLiteralSetIfNull(
-      Send node, ConstantExpression constant, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_SET_IF_NULL,
-        constant: constant.toDartText(), rhs: rhs));
-    super.visitDynamicTypeLiteralSetIfNull(node, constant, rhs, arg);
-  }
-
-  @override
-  visitFinalLocalVariableSetIfNull(
-      Send node, LocalVariableElement variable, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_FINAL_LOCAL_VARIABLE_SET_IF_NULL,
-        element: variable, rhs: rhs));
-    super.visitFinalLocalVariableSetIfNull(node, variable, rhs, arg);
-  }
-
-  @override
-  visitFinalParameterSetIfNull(
-      Send node, ParameterElement parameter, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_FINAL_PARAMETER_SET_IF_NULL,
-        element: parameter, rhs: rhs));
-    super.visitFinalParameterSetIfNull(node, parameter, rhs, arg);
-  }
-
-  @override
-  visitFinalStaticFieldSetIfNull(Send node, FieldElement field, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_FINAL_FIELD_SET_IF_NULL,
-        element: field, rhs: rhs));
-    super.visitFinalStaticFieldSetIfNull(node, field, rhs, arg);
-  }
-
-  @override
-  visitFinalSuperFieldSetIfNull(Send node, FieldElement field, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FINAL_FIELD_SET_IF_NULL,
-        element: field, rhs: rhs));
-    super.visitFinalSuperFieldSetIfNull(node, field, rhs, arg);
-  }
-
-  @override
-  visitFinalTopLevelFieldSetIfNull(
-      Send node, FieldElement field, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FINAL_FIELD_SET_IF_NULL,
-        element: field, rhs: rhs));
-    super.visitFinalTopLevelFieldSetIfNull(node, field, rhs, arg);
-  }
-
-  @override
-  visitIfNotNullDynamicPropertySetIfNull(
-      Send node, Node receiver, Name name, Node rhs, arg) {
-    visits.add(new Visit(
-        VisitKind.VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_SET_IF_NULL,
-        receiver: receiver,
-        name: name,
-        rhs: rhs));
-    super
-        .visitIfNotNullDynamicPropertySetIfNull(node, receiver, name, rhs, arg);
-  }
-
-  @override
-  visitLocalFunctionSetIfNull(
-      Send node, LocalFunctionElement function, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOCAL_FUNCTION_SET_IF_NULL,
-        element: function, rhs: rhs));
-    super.visitLocalFunctionSetIfNull(node, function, rhs, arg);
-  }
-
-  @override
-  visitLocalVariableSetIfNull(
-      Send node, LocalVariableElement variable, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_LOCAL_VARIABLE_SET_IF_NULL,
-        element: variable, rhs: rhs));
-    super.visitLocalVariableSetIfNull(node, variable, rhs, arg);
-  }
-
-  @override
-  visitParameterSetIfNull(
-      Send node, ParameterElement parameter, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_PARAMETER_SET_IF_NULL,
-        element: parameter, rhs: rhs));
-    super.visitParameterSetIfNull(node, parameter, rhs, arg);
-  }
-
-  @override
-  visitStaticFieldSetIfNull(Send node, FieldElement field, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_FIELD_SET_IF_NULL,
-        element: field, rhs: rhs));
-    super.visitStaticFieldSetIfNull(node, field, rhs, arg);
-  }
-
-  @override
-  visitStaticGetterSetterSetIfNull(Send node, FunctionElement getter,
-      FunctionElement setter, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_GETTER_SETTER_SET_IF_NULL,
-        getter: getter, setter: setter, rhs: rhs));
-    super.visitStaticGetterSetterSetIfNull(node, getter, setter, rhs, arg);
-  }
-
-  @override
-  visitStaticMethodSetIfNull(Send node, FunctionElement method, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_SET_IF_NULL,
-        element: method, rhs: rhs));
-    super.visitStaticMethodSetIfNull(node, method, rhs, arg);
-  }
-
-  @override
-  visitStaticMethodSetterSetIfNull(
-      Send node, MethodElement method, MethodElement setter, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_STATIC_METHOD_SETTER_SET_IF_NULL,
-        getter: method, setter: setter, rhs: rhs));
-    super.visitStaticMethodSetterSetIfNull(node, method, setter, rhs, arg);
-  }
-
-  @override
-  visitSuperFieldFieldSetIfNull(Send node, FieldElement readField,
-      FieldElement writtenField, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_FIELD_SET_IF_NULL,
-        getter: readField, setter: writtenField, rhs: rhs));
-    super
-        .visitSuperFieldFieldSetIfNull(node, readField, writtenField, rhs, arg);
-  }
-
-  @override
-  visitSuperFieldSetIfNull(Send node, FieldElement field, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SET_IF_NULL,
-        element: field, rhs: rhs));
-    super.visitSuperFieldSetIfNull(node, field, rhs, arg);
-  }
-
-  @override
-  visitSuperFieldSetterSetIfNull(
-      Send node, FieldElement field, FunctionElement setter, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_FIELD_SETTER_SET_IF_NULL,
-        getter: field, setter: setter, rhs: rhs));
-    super.visitSuperFieldSetterSetIfNull(node, field, setter, rhs, arg);
-  }
-
-  @override
-  visitSuperGetterFieldSetIfNull(
-      Send node, FunctionElement getter, FieldElement field, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_FIELD_SET_IF_NULL,
-        getter: getter, setter: field, rhs: rhs));
-    super.visitSuperGetterFieldSetIfNull(node, getter, field, rhs, arg);
-  }
-
-  @override
-  visitSuperGetterSetterSetIfNull(Send node, FunctionElement getter,
-      FunctionElement setter, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_GETTER_SETTER_SET_IF_NULL,
-        getter: getter, setter: setter, rhs: rhs));
-    super.visitSuperGetterSetterSetIfNull(node, getter, setter, rhs, arg);
-  }
-
-  @override
-  visitSuperMethodSetIfNull(Send node, FunctionElement method, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_SET_IF_NULL,
-        element: method, rhs: rhs));
-    super.visitSuperMethodSetIfNull(node, method, rhs, arg);
-  }
-
-  @override
-  visitSuperMethodSetterSetIfNull(Send node, FunctionElement method,
-      FunctionElement setter, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_METHOD_SETTER_SET_IF_NULL,
-        getter: method, setter: setter, rhs: rhs));
-    super.visitSuperMethodSetterSetIfNull(node, method, setter, rhs, arg);
-  }
-
-  @override
-  visitThisPropertySetIfNull(Send node, Name name, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_THIS_PROPERTY_SET_IF_NULL,
-        name: name, rhs: rhs));
-    super.visitThisPropertySetIfNull(node, name, rhs, arg);
-  }
-
-  @override
-  visitTopLevelFieldSetIfNull(Send node, FieldElement field, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_FIELD_SET_IF_NULL,
-        element: field, rhs: rhs));
-    super.visitTopLevelFieldSetIfNull(node, field, rhs, arg);
-  }
-
-  @override
-  visitTopLevelGetterSetterSetIfNull(Send node, FunctionElement getter,
-      FunctionElement setter, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_GETTER_SETTER_SET_IF_NULL,
-        getter: getter, setter: setter, rhs: rhs));
-    super.visitTopLevelGetterSetterSetIfNull(node, getter, setter, rhs, arg);
-  }
-
-  @override
-  visitTopLevelMethodSetIfNull(
-      Send node, FunctionElement method, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_SET_IF_NULL,
-        element: method, rhs: rhs));
-    super.visitTopLevelMethodSetIfNull(node, method, rhs, arg);
-  }
-
-  @override
-  visitTopLevelMethodSetterSetIfNull(Send node, FunctionElement method,
-      FunctionElement setter, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_SET_IF_NULL,
-        getter: method, setter: setter, rhs: rhs));
-    super.visitTopLevelMethodSetterSetIfNull(node, method, setter, rhs, arg);
-  }
-
-  @override
-  visitTypeVariableTypeLiteralSetIfNull(
-      Send node, TypeVariableElement element, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET_IF_NULL,
-        element: element, rhs: rhs));
-    super.visitTypeVariableTypeLiteralSetIfNull(node, element, rhs, arg);
-  }
-
-  @override
-  visitTypedefTypeLiteralSetIfNull(
-      Send node, ConstantExpression constant, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_SET_IF_NULL,
-        constant: constant.toDartText(), rhs: rhs));
-    super.visitTypedefTypeLiteralSetIfNull(node, constant, rhs, arg);
-  }
-
-  @override
-  visitUnresolvedSetIfNull(Send node, Element element, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SET_IF_NULL,
-        name: element.name, rhs: rhs));
-    super.visitUnresolvedSetIfNull(node, element, rhs, arg);
-  }
-
-  @override
-  visitUnresolvedStaticGetterSetIfNull(
-      Send node, Element element, MethodElement setter, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_GETTER_SET_IF_NULL,
-        setter: setter, rhs: rhs));
-    super.visitUnresolvedStaticGetterSetIfNull(node, element, setter, rhs, arg);
-  }
-
-  @override
-  visitUnresolvedStaticSetterSetIfNull(
-      Send node, MethodElement getter, Element element, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_STATIC_SETTER_SET_IF_NULL,
-        getter: getter, rhs: rhs));
-    super.visitUnresolvedStaticSetterSetIfNull(node, getter, element, rhs, arg);
-  }
-
-  @override
-  visitUnresolvedSuperGetterSetIfNull(
-      Send node, Element element, MethodElement setter, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_SET_IF_NULL,
-        setter: setter, rhs: rhs));
-    super.visitUnresolvedSuperGetterSetIfNull(node, element, setter, rhs, arg);
-  }
-
-  @override
-  visitUnresolvedSuperSetIfNull(Send node, Element element, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SET_IF_NULL,
-        name: element.name, rhs: rhs));
-    super.visitUnresolvedSuperSetIfNull(node, element, rhs, arg);
-  }
-
-  @override
-  visitUnresolvedSuperSetterSetIfNull(
-      Send node, MethodElement getter, Element element, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_SET_IF_NULL,
-        getter: getter, rhs: rhs));
-    super.visitUnresolvedSuperSetterSetIfNull(node, getter, element, rhs, arg);
-  }
-
-  @override
-  visitUnresolvedTopLevelGetterSetIfNull(
-      Send node, Element element, MethodElement setter, Node rhs, arg) {
-    visits.add(new Visit(
-        VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_GETTER_SET_IF_NULL,
-        setter: setter,
-        rhs: rhs));
-    super.visitUnresolvedTopLevelGetterSetIfNull(
-        node, element, setter, rhs, arg);
-  }
-
-  @override
-  visitUnresolvedTopLevelSetterSetIfNull(
-      Send node, MethodElement getter, Element element, Node rhs, arg) {
-    visits.add(new Visit(
-        VisitKind.VISIT_UNRESOLVED_TOP_LEVEL_SETTER_SET_IF_NULL,
-        getter: getter,
-        rhs: rhs));
-    super.visitUnresolvedTopLevelSetterSetIfNull(
-        node, getter, element, rhs, arg);
-  }
-
-  @override
-  visitIndexSetIfNull(SendSet node, Node receiver, Node index, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_INDEX_SET_IF_NULL,
-        receiver: receiver, index: index, rhs: rhs));
-    super.visitIndexSetIfNull(node, receiver, index, rhs, arg);
-  }
-
-  @override
-  visitSuperIndexSetIfNull(SendSet node, MethodElement getter,
-      MethodElement setter, Node index, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_SUPER_INDEX_SET_IF_NULL,
-        getter: getter, setter: setter, index: index, rhs: rhs));
-    super.visitSuperIndexSetIfNull(node, getter, setter, index, rhs, arg);
-  }
-
-  @override
-  visitUnresolvedSuperGetterIndexSetIfNull(Send node, Element element,
-      MethodElement setter, Node index, Node rhs, arg) {
-    visits.add(new Visit(
-        VisitKind.VISIT_UNRESOLVED_SUPER_GETTER_INDEX_SET_IF_NULL,
-        setter: setter,
-        index: index,
-        rhs: rhs));
-    super.visitUnresolvedSuperGetterIndexSetIfNull(
-        node, element, setter, index, rhs, arg);
-  }
-
-  @override
-  visitUnresolvedSuperSetterIndexSetIfNull(Send node, MethodElement getter,
-      Element element, Node index, Node rhs, arg) {
-    visits.add(new Visit(
-        VisitKind.VISIT_UNRESOLVED_SUPER_SETTER_INDEX_SET_IF_NULL,
-        getter: getter,
-        index: index,
-        rhs: rhs));
-    super.visitUnresolvedSuperSetterIndexSetIfNull(
-        node, getter, element, index, rhs, arg);
-  }
-
-  @override
-  visitUnresolvedSuperIndexSetIfNull(
-      Send node, Element element, Node index, Node rhs, arg) {
-    visits.add(new Visit(VisitKind.VISIT_UNRESOLVED_SUPER_INDEX_SET_IF_NULL,
-        index: index, rhs: rhs));
-    super.visitUnresolvedSuperIndexSetIfNull(node, element, index, rhs, arg);
-  }
-
-  @override
-  errorInvalidIndexSetIfNull(
-      SendSet node, ErroneousElement error, Node index, Node rhs, arg) {
-    visits.add(
-        new Visit(VisitKind.ERROR_INVALID_SET_IF_NULL, index: index, rhs: rhs));
-    super.visitUnresolvedSuperIndexSetIfNull(node, error, index, rhs, arg);
-  }
-}
diff --git a/tests/compiler/dart2js/old_frontend/size_test.dart b/tests/compiler/dart2js/old_frontend/size_test.dart
deleted file mode 100644
index 95a1946..0000000
--- a/tests/compiler/dart2js/old_frontend/size_test.dart
+++ /dev/null
@@ -1,36 +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.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import "../compiler_helper.dart";
-
-const String TEST = "main() => [];";
-
-const Map<String, String> DEFAULT_CORELIB_WITH_LIST = const <String, String>{
-  'Object': 'class Object { const Object(); }',
-  'bool': 'class bool {}',
-  'List': 'abstract class List<E> {}',
-  'num': 'class num {}',
-  'int': 'class int {}',
-  'double': 'class double {}',
-  'String': 'class String {}',
-  'Function': 'class Function {}',
-  'Null': 'class Null {}',
-  'Type': 'class Type {}',
-  'Map': 'class Map {}',
-  'StackTrace': 'class StackTrace {}',
-  'identical': 'identical(a, b) => true;',
-  'proxy': 'const proxy = 0;',
-};
-
-main() {
-  asyncTest(() =>
-      compileAll(TEST, coreSource: DEFAULT_CORELIB_WITH_LIST).then((generated) {
-        return MockCompiler.create((MockCompiler compiler) {
-          // Make sure no class is emitted.
-          Expect.isFalse(generated.contains('finishClasses'), generated);
-        });
-      }));
-}
diff --git a/tests/compiler/dart2js/old_frontend/space_test.dart b/tests/compiler/dart2js/old_frontend/space_test.dart
deleted file mode 100644
index 8ffc6471..0000000
--- a/tests/compiler/dart2js/old_frontend/space_test.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-import 'package:compiler/src/dart2js.dart' as dart2js;
-import 'package:compiler/src/commandline_options.dart';
-
-main() {
-  Uri currentDirectory = Uri.base;
-  Uri script = currentDirectory.resolveUri(Platform.script);
-  Uri libraryRoot = script.resolve('../../../../sdk/');
-  Directory.current = script.resolve("../path with spaces").toFilePath();
-
-  return dart2js.main([
-    "--library-root=${libraryRoot.toFilePath()}",
-    Flags.analyzeOnly,
-    Flags.useOldFrontend,
-    "file with spaces.dart"
-  ]);
-}
diff --git a/tests/compiler/dart2js/old_frontend/tag_mapping_test.dart b/tests/compiler/dart2js/old_frontend/tag_mapping_test.dart
deleted file mode 100644
index 9eff042..0000000
--- a/tests/compiler/dart2js/old_frontend/tag_mapping_test.dart
+++ /dev/null
@@ -1,43 +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.
-
-// Test of import tag to library mapping.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import '../compiler_helper.dart';
-
-const MAIN_CODE = """
-import 'library.dart';
-
-main() {
-}
-""";
-
-const LIB_CODE = """
-library lib;
-""";
-
-void main() {
-  var sources = <String, String>{
-    'main.dart': MAIN_CODE,
-    'library.dart': LIB_CODE,
-  };
-
-  asyncTest(() => compileSources(sources, (MockCompiler compiler) {
-        LibraryElement mainApp = compiler.libraryLoader
-            .lookupLibrary(Uri.parse('source:/main.dart'));
-        LibraryElement lib = compiler.libraryLoader
-            .lookupLibrary(Uri.parse('source:/library.dart'));
-        Expect.isNotNull(mainApp, 'Could not find main.dart library');
-        Expect.isNotNull(lib, 'Could not find library.dart library');
-
-        ImportElement import = mainApp.imports.single;
-        Expect.isNotNull(import, 'Could not find import tag in $mainApp');
-
-        // Test that we can get from the import tag in main.dart to the
-        // library element representing library.dart.
-        Expect.identical(lib, import.importedLibrary);
-      }));
-}
diff --git a/tests/compiler/dart2js/old_frontend/type_checker_test.dart b/tests/compiler/dart2js/old_frontend/type_checker_test.dart
deleted file mode 100644
index 6f4bcd5..0000000
--- a/tests/compiler/dart2js/old_frontend/type_checker_test.dart
+++ /dev/null
@@ -1,2621 +0,0 @@
-// 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:async';
-
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-
-import 'package:compiler/src/elements/resolution_types.dart';
-import 'package:compiler/src/diagnostics/messages.dart';
-import 'package:compiler/src/elements/elements.dart';
-import 'package:compiler/src/elements/modelx.dart'
-    show ClassElementX, CompilationUnitElementX, ElementX;
-import 'package:compiler/src/io/source_file.dart';
-import 'package:compiler/src/resolution/tree_elements.dart'
-    show TreeElements, TreeElementMapping;
-import 'package:compiler/src/parser/element_listener.dart';
-import 'package:compiler/src/tree/tree.dart';
-import 'package:compiler/src/typechecker.dart';
-import 'package:compiler/src/script.dart';
-import 'package:compiler/src/util/util.dart';
-
-import 'mock_compiler.dart';
-import 'parser_helper.dart';
-
-final MessageKind NOT_ASSIGNABLE = MessageKind.NOT_ASSIGNABLE;
-final MessageKind UNDEFINED_GETTER = MessageKind.UNDEFINED_GETTER;
-
-main() {
-  List tests = [
-    testSimpleTypes,
-    testReturn,
-    testFor,
-    testSyncForIn,
-    testAsyncForIn,
-    testWhile,
-    testTry,
-    testSwitch,
-    testEnumSwitch,
-    testOperators,
-    testConstructorInvocationArgumentCount,
-    testConstructorInvocationArgumentTypes,
-    testMethodInvocationArgumentCount,
-    testMethodInvocations,
-    testMethodInvocationsInClass,
-    testGetterSetterInvocation,
-    // testNewExpression,
-    testConditionalExpression,
-    testIfStatement,
-    testThis,
-    testSuper,
-    testOperatorsAssignability,
-    testFieldInitializers,
-    testTypeVariableExpressions,
-    testTypeVariableLookup1,
-    testTypeVariableLookup2,
-    testTypeVariableLookup3,
-    testFunctionTypeLookup,
-    testTypedefLookup,
-    testTypeLiteral,
-    testInitializers,
-    testTypePromotionHints,
-    testFunctionCall,
-    testCascade,
-    testAwait,
-    testAsyncReturn
-  ];
-  asyncTest(() => Future.forEach(tests, (test) => setup(test)));
-}
-
-testSimpleTypes(MockCompiler compiler) {
-  checkType(ResolutionInterfaceType type, String code) {
-    Expect.equals(type, analyzeType(compiler, code));
-  }
-
-  checkType(compiler.resolution.commonElements.intType, "3");
-  checkType(compiler.resolution.commonElements.boolType, "false");
-  checkType(compiler.resolution.commonElements.boolType, "true");
-  checkType(compiler.resolution.commonElements.stringType, "'hestfisk'");
-}
-
-Future testReturn(MockCompiler compiler) {
-  Future check(String code, [expectedWarnings]) {
-    return analyzeTopLevel(code, expectedWarnings);
-  }
-
-  return Future.wait([
-    check("void foo() { return 3; }", MessageKind.RETURN_VALUE_IN_VOID),
-    check("int bar() { return 'hest'; }", NOT_ASSIGNABLE),
-    check("void baz() { var x; return x; }"),
-    check(returnWithType("int", "'string'"), NOT_ASSIGNABLE),
-    check(returnWithType("", "'string'")),
-    check(returnWithType("Object", "'string'")),
-    check(returnWithType("String", "'string'")),
-    check(returnWithType("String", null)),
-    check(returnWithType("int", null)),
-    check(returnWithType("void", "")),
-    check(returnWithType("void", 1), MessageKind.RETURN_VALUE_IN_VOID),
-    check(returnWithType("void", null)),
-    check(returnWithType("String", ""), MessageKind.RETURN_NOTHING),
-    check(arrowReturnWithType("void", "4")),
-    check("void set foo(x) => 5;"),
-    // check("String foo() {};"), // Should probably fail.
-  ]);
-}
-
-testFor(MockCompiler compiler) {
-  check(String code, {warnings}) {
-    analyze(compiler, code, warnings: warnings);
-  }
-
-  check("for (var x;true;x = x + 1) {}");
-  check("for (var x;null;x = x + 1) {}");
-  check("for (var x;0;x = x + 1) {}", warnings: NOT_ASSIGNABLE);
-  check("for (var x;'';x = x + 1) {}", warnings: NOT_ASSIGNABLE);
-
-  check("for (;true;) {}");
-  check("for (;null;) {}");
-  check("for (;0;) {}", warnings: NOT_ASSIGNABLE);
-  check("for (;'';) {}", warnings: NOT_ASSIGNABLE);
-
-  // Foreach tests
-//  TODO(karlklose): for each is not yet implemented.
-//  check("{ List<String> strings = ['1','2','3']; " +
-//        "for (String s in strings) {} }");
-//  check("{ List<int> ints = [1,2,3]; for (String s in ints) {} }",
-//        NOT_ASSIGNABLE);
-//  check("for (String s in true) {}", MessageKind.UNDEFINED_METHOD);
-}
-
-testSyncForIn(MockCompiler compiler) {
-  String script = """
-class HasUntypedIterator {
-  get iterator => null;
-}
-
-class HasIntIterator {
-  Iterator<int> get iterator => null;
-}
-
-class HasNoIterator {
-}
-
-class HasCustomIntIterator {
-  CustomIntIterator get iterator => null;
-}
-
-class CustomIntIterator {
-  int current;
-}
-
-class HasCustomNoCurrentIterator {
-  CustomNoCurrentIterator get iterator => null;
-}
-
-class CustomNoCurrentIterator {
-}
-
-var topLevelDyn;
-String topLevelString;
-int topLevelInt;
-
-class Class {
-  void forIn() {}
-
-  var instanceDyn;
-  String instanceString;
-  int instanceInt;
-
-  static var staticDyn;
-  static String staticString;
-  static int staticInt;
-}
-""";
-  compiler.parseScript(script);
-  LibraryElement mainApp = compiler.mainApp;
-  ClassElement foo = mainApp.find("Class");
-  foo.ensureResolved(compiler.resolution);
-  FunctionElement method = foo.lookupLocalMember('forIn');
-
-  analyzeIn(compiler, method, """{ 
-      for (var e in <String>[]) {} 
-  }""");
-  analyzeIn(compiler, method, """{ 
-      for (String e in <String>[]) {} 
-  }""");
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      for (int e in <String>[]) {} 
-  }""",
-      hints: MessageKind.FORIN_NOT_ASSIGNABLE);
-  analyzeIn(compiler, method, """{ 
-      for (int e in []) {} 
-  }""");
-
-  analyzeIn(compiler, method, """{ 
-      for (var e in new HasUntypedIterator()) {} 
-  }""");
-  analyzeIn(compiler, method, """{ 
-      for (String e in new HasUntypedIterator()) {} 
-  }""");
-  analyzeIn(compiler, method, """{ 
-      for (int e in new HasUntypedIterator()) {} 
-  }""");
-
-  analyzeIn(compiler, method, """{ 
-      for (var e in new HasIntIterator()) {} 
-  }""");
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      for (String e in new HasIntIterator()) {} 
-  }""",
-      hints: MessageKind.FORIN_NOT_ASSIGNABLE);
-  analyzeIn(compiler, method, """{ 
-      for (int e in new HasIntIterator()) {} 
-  }""");
-
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      for (var e in new HasNoIterator()) {} 
-  }""",
-      warnings: MessageKind.UNDEFINED_GETTER);
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      for (String e in new HasNoIterator()) {} 
-  }""",
-      warnings: MessageKind.UNDEFINED_GETTER);
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      for (int e in new HasNoIterator()) {} 
-  }""",
-      warnings: MessageKind.UNDEFINED_GETTER);
-
-  analyzeIn(compiler, method, """{ 
-      for (var e in new HasCustomIntIterator()) {} 
-  }""");
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      for (String e in new HasCustomIntIterator()) {} 
-  }""",
-      hints: MessageKind.FORIN_NOT_ASSIGNABLE);
-  analyzeIn(compiler, method, """{ 
-      for (int e in new HasCustomIntIterator()) {} 
-  }""");
-
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      for (var e in new HasCustomNoCurrentIterator()) {} 
-  }""",
-      hints: MessageKind.UNDEFINED_GETTER);
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      for (String e in new HasCustomNoCurrentIterator()) {} 
-  }""",
-      hints: MessageKind.UNDEFINED_GETTER);
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      for (int e in new HasCustomNoCurrentIterator()) {} 
-  }""",
-      hints: MessageKind.UNDEFINED_GETTER);
-
-  analyzeIn(compiler, method, """{ 
-      var localDyn; 
-      for (localDyn in <String>[]) {} 
-  }""");
-  analyzeIn(compiler, method, """{ 
-      String localString; 
-      for (localString in <String>[]) {} 
-  }""");
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      int localInt; 
-      for (localInt in <String>[]) {} 
-  }""",
-      hints: MessageKind.FORIN_NOT_ASSIGNABLE);
-
-  analyzeIn(compiler, method, """{ 
-      for (topLevelDyn in <String>[]) {} 
-  }""");
-  analyzeIn(compiler, method, """{ 
-      for (topLevelString in <String>[]) {} 
-  }""");
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      for (topLevelInt in <String>[]) {} 
-  }""",
-      hints: MessageKind.FORIN_NOT_ASSIGNABLE);
-
-  analyzeIn(compiler, method, """{ 
-      for (instanceDyn in <String>[]) {} 
-  }""");
-  analyzeIn(compiler, method, """{ 
-      for (instanceString in <String>[]) {} 
-  }""");
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      for (instanceInt in <String>[]) {} 
-  }""",
-      hints: MessageKind.FORIN_NOT_ASSIGNABLE);
-
-  analyzeIn(compiler, method, """{ 
-      for (staticDyn in <String>[]) {} 
-  }""");
-  analyzeIn(compiler, method, """{ 
-      for (staticString in <String>[]) {} 
-  }""");
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      for (staticInt in <String>[]) {} 
-  }""",
-      hints: MessageKind.FORIN_NOT_ASSIGNABLE);
-}
-
-testAsyncForIn(MockCompiler compiler) {
-  String script = """
-abstract class CustomStream<T> implements Stream<T> {}
-abstract class StringStream implements Stream<String> {}
-
-var topLevelDyn;
-String topLevelString;
-int topLevelInt;
-
-class Class {
-  void forIn() async {}
-
-  var instanceDyn;
-  String instanceString;
-  int instanceInt;
-
-  static var staticDyn;
-  static String staticString;
-  static int staticInt;
-}
-""";
-  compiler.parseScript(script);
-  LibraryElement mainApp = compiler.mainApp;
-  ClassElement foo = mainApp.find("Class");
-  foo.ensureResolved(compiler.resolution);
-  FunctionElement method = foo.lookupLocalMember('forIn');
-
-  analyzeIn(compiler, method, """{
-      var stream;
-      await for (var e in stream) {} 
-  }""");
-  analyzeIn(compiler, method, """{ 
-      var stream;
-      await for (String e in stream) {} 
-  }""");
-  analyzeIn(compiler, method, """{ 
-      var stream;
-      await for (int e in stream) {} 
-  }""");
-
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      await for (var e in []) {} 
-  }""",
-      hints: MessageKind.NOT_ASSIGNABLE);
-
-  analyzeIn(compiler, method, """{ 
-      Stream<String> stream;
-      await for (var e in stream) {} 
-  }""");
-  analyzeIn(compiler, method, """{ 
-      Stream<String> stream;
-      await for (String e in stream) {} 
-  }""");
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      Stream<String> stream;
-      await for (int e in stream) {} 
-  }""",
-      hints: MessageKind.FORIN_NOT_ASSIGNABLE);
-
-  analyzeIn(compiler, method, """{ 
-      CustomStream<String> stream;
-      await for (var e in stream) {} 
-  }""");
-  analyzeIn(compiler, method, """{ 
-      CustomStream<String> stream;
-      await for (String e in stream) {} 
-  }""");
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      CustomStream<String> stream;
-      await for (int e in stream) {} 
-  }""",
-      hints: MessageKind.FORIN_NOT_ASSIGNABLE);
-
-  analyzeIn(compiler, method, """{ 
-      StringStream stream;
-      await for (var e in stream) {} 
-  }""");
-  analyzeIn(compiler, method, """{ 
-      StringStream stream;
-      await for (String e in stream) {} 
-  }""");
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      StringStream stream;
-      await for (int e in stream) {} 
-  }""",
-      hints: MessageKind.FORIN_NOT_ASSIGNABLE);
-
-  analyzeIn(compiler, method, """{ 
-      Stream<String> stream;
-      var localDyn; 
-      await for (localDyn in stream) {} 
-  }""");
-  analyzeIn(compiler, method, """{ 
-      Stream<String> stream;
-      String localString; 
-      await for (localString in stream) {} 
-  }""");
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      Stream<String> stream;
-      int localInt; 
-      await for (localInt in stream) {} 
-  }""",
-      hints: MessageKind.FORIN_NOT_ASSIGNABLE);
-
-  analyzeIn(compiler, method, """{ 
-      Stream<String> stream;
-      await for (topLevelDyn in stream) {} 
-  }""");
-  analyzeIn(compiler, method, """{ 
-      Stream<String> stream;
-      await for (topLevelString in stream) {} 
-  }""");
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      Stream<String> stream;
-      await for (topLevelInt in stream) {} 
-  }""",
-      hints: MessageKind.FORIN_NOT_ASSIGNABLE);
-
-  analyzeIn(compiler, method, """{ 
-      Stream<String> stream;
-      await for (instanceDyn in stream) {} 
-  }""");
-  analyzeIn(compiler, method, """{ 
-      Stream<String> stream;
-      await for (instanceString in stream) {} 
-  }""");
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      Stream<String> stream;
-      await for (instanceInt in stream) {} 
-  }""",
-      hints: MessageKind.FORIN_NOT_ASSIGNABLE);
-
-  analyzeIn(compiler, method, """{ 
-      Stream<String> stream;
-      await for (staticDyn in stream) {} 
-  }""");
-  analyzeIn(compiler, method, """{ 
-      Stream<String> stream;
-      await for (staticString in stream) {} 
-  }""");
-  analyzeIn(
-      compiler,
-      method,
-      """{ 
-      Stream<String> stream;
-      await for (staticInt in stream) {} 
-  }""",
-      hints: MessageKind.FORIN_NOT_ASSIGNABLE);
-}
-
-testWhile(MockCompiler compiler) {
-  check(String code, {warnings}) {
-    analyze(compiler, code, warnings: warnings);
-  }
-
-  check("while (true) {}");
-  check("while (null) {}");
-  check("while (0) {}", warnings: NOT_ASSIGNABLE);
-  check("while ('') {}", warnings: NOT_ASSIGNABLE);
-
-  check("do {} while (true);");
-  check("do {} while (null);");
-  check("do {} while (0);", warnings: NOT_ASSIGNABLE);
-  check("do {} while ('');", warnings: NOT_ASSIGNABLE);
-  check("do { int i = 0.5; } while (true);", warnings: NOT_ASSIGNABLE);
-  check("do { int i = 0.5; } while (null);", warnings: NOT_ASSIGNABLE);
-}
-
-testTry(MockCompiler compiler) {
-  check(String code, {warnings}) {
-    analyze(compiler, code, warnings: warnings);
-  }
-
-  check("try {} finally {}");
-  check("try {} catch (e) { int i = e;} finally {}");
-  check("try {} catch (e, s) { int i = e; StackTrace j = s; } finally {}");
-  check("try {} on String catch (e) {} finally {}");
-  check("try { int i = ''; } finally {}", warnings: NOT_ASSIGNABLE);
-  check("try {} finally { int i = ''; }", warnings: NOT_ASSIGNABLE);
-  check("try {} on String catch (e) { int i = e; } finally {}",
-      warnings: NOT_ASSIGNABLE);
-  check("try {} catch (e, s) { int i = e; int j = s; } finally {}",
-      warnings: NOT_ASSIGNABLE);
-  check("try {} on String catch (e, s) { int i = e; int j = s; } finally {}",
-      warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-}
-
-testSwitch(MockCompiler compiler) {
-  check(String code, {warnings}) {
-    analyze(compiler, code, warnings: warnings);
-  }
-
-  check("switch (0) { case 1: break; case 2: break; }");
-  check("switch (0) { case 1: int i = ''; break; case 2: break; }",
-      warnings: NOT_ASSIGNABLE);
-  check("switch (0) { case '': break; }", warnings: NOT_ASSIGNABLE);
-  check("switch ('') { case 1: break; case 2: break; }",
-      warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-  check("switch (1.5) { case 1: break; case 2: break; }",
-      warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-}
-
-testEnumSwitch(MockCompiler compiler) {
-  String DECLARATIONS = """
-enum Enum { A, B, C }
-""";
-
-  check(String code, {warnings}) {
-    MockCompiler compiler = new MockCompiler.internal();
-    return compiler.init(DECLARATIONS).then((_) {
-      analyze(compiler, code, warnings: warnings, flushDeferred: true);
-    });
-  }
-
-  check("""
-switch (Enum.A) {
-default: break;
-}""");
-
-  check("""
-switch (Enum.A) {
-case Enum.A: break;
-default: break;
-}""");
-
-  check("""
-switch (Enum.A) {
-case Enum.A: break;
-case Enum.B: break;
-default: break;
-}""");
-
-  check("""
-switch (Enum.A) {
-case Enum.A: break;
-case Enum.B: break;
-case Enum.C: break;
-default: break;
-}""");
-
-  check("""
-switch (Enum.A) {
-case Enum.A: break;
-case Enum.B: break;
-case Enum.C: break;
-}""");
-
-  check("""
-switch (Enum.A) {
-case Enum.B: break;
-case Enum.C: break;
-}""", warnings: MessageKind.MISSING_ENUM_CASES);
-
-  check("""
-switch (Enum.A) {
-case Enum.A: break;
-case Enum.C: break;
-}""", warnings: MessageKind.MISSING_ENUM_CASES);
-
-  check("""
-switch (Enum.A) {
-case Enum.A: break;
-case Enum.B: break;
-}""", warnings: MessageKind.MISSING_ENUM_CASES);
-
-  check("""
-switch (Enum.A) {
-case Enum.A: break;
-}""", warnings: MessageKind.MISSING_ENUM_CASES);
-
-  check("""
-switch (Enum.A) {
-case Enum.B: break;
-}""", warnings: MessageKind.MISSING_ENUM_CASES);
-
-  check("""
-switch (Enum.A) {
-case Enum.C: break;
-}""", warnings: MessageKind.MISSING_ENUM_CASES);
-
-  check("""
-switch (Enum.A) {
-}""", warnings: MessageKind.MISSING_ENUM_CASES);
-}
-
-testOperators(MockCompiler compiler) {
-  check(String code, {warnings}) {
-    analyze(compiler, code, warnings: warnings);
-  }
-
-  // TODO(karlklose): add the DartC tests for operators when we can parse
-  // classes with operators.
-  for (final op in ['+', '-', '*', '/', '%', '~/', '|', '&']) {
-    check("{ var i = 1 ${op} 2; }");
-    check("{ var i = 1; i ${op}= 2; }");
-    check("{ int i; var j = (i = true) ${op} 2; }",
-        warnings: [NOT_ASSIGNABLE, MessageKind.UNDEFINED_OPERATOR]);
-    check("{ int i; var j = 1 ${op} (i = true); }",
-        warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-  }
-  for (final op in ['-', '~']) {
-    check("{ var i = ${op}1; }");
-    check("{ int i; var j = ${op}(i = true); }",
-        warnings: [NOT_ASSIGNABLE, MessageKind.UNDEFINED_OPERATOR]);
-  }
-  for (final op in ['++', '--']) {
-    check("{ int i = 1; int j = i${op}; }");
-    check("{ int i = 1; bool j = i${op}; }", warnings: NOT_ASSIGNABLE);
-    check("{ bool b = true; bool j = b${op}; }",
-        warnings: MessageKind.UNDEFINED_OPERATOR);
-    check("{ bool b = true; int j = ${op}b; }",
-        warnings: MessageKind.UNDEFINED_OPERATOR);
-  }
-  for (final op in ['||', '&&']) {
-    check("{ bool b = (true ${op} false); }");
-    check("{ int b = true ${op} false; }", warnings: NOT_ASSIGNABLE);
-    check("{ bool b = (1 ${op} false); }", warnings: NOT_ASSIGNABLE);
-    check("{ bool b = (true ${op} 2); }", warnings: NOT_ASSIGNABLE);
-  }
-  for (final op in ['>', '<', '<=', '>=']) {
-    check("{ bool b = 1 ${op} 2; }");
-    check("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE);
-    check("{ int i; bool b = (i = true) ${op} 2; }",
-        warnings: [NOT_ASSIGNABLE, MessageKind.UNDEFINED_OPERATOR]);
-    check("{ int i; bool b = 1 ${op} (i = true); }",
-        warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-  }
-  for (final op in ['==', '!=']) {
-    check("{ bool b = 1 ${op} 2; }");
-    check("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE);
-    check("{ int i; bool b = (i = true) ${op} 2; }", warnings: NOT_ASSIGNABLE);
-    check("{ int i; bool b = 1 ${op} (i = true); }", warnings: NOT_ASSIGNABLE);
-  }
-}
-
-void testConstructorInvocationArgumentCount(MockCompiler compiler) {
-  compiler.parseScript("""
-     class C1 { C1(x, y); }
-     class C2 { C2(int x, int y); }
-  """);
-
-  check(String code, {warnings}) {
-    analyze(compiler, code, warnings: warnings);
-  }
-
-  // calls to untyped constructor C1
-  check("new C1(1, 2);");
-  check("new C1();", warnings: MessageKind.MISSING_ARGUMENT);
-  check("new C1(1);", warnings: MessageKind.MISSING_ARGUMENT);
-  check("new C1(1, 2, 3);", warnings: MessageKind.ADDITIONAL_ARGUMENT);
-  // calls to typed constructor C2
-  check("new C2(1, 2);");
-  check("new C2();", warnings: MessageKind.MISSING_ARGUMENT);
-  check("new C2(1);", warnings: MessageKind.MISSING_ARGUMENT);
-  check("new C2(1, 2, 3);", warnings: MessageKind.ADDITIONAL_ARGUMENT);
-}
-
-void testConstructorInvocationArgumentTypes(MockCompiler compiler) {
-  compiler.parseScript("""
-    class C1 { C1(x); }
-    class C2 { C2(int x); }
-    class C3 {
-      int field;
-      C3(this.field);
-      C3.named(this.field);
-    }
-  """);
-
-  check(String code, {warnings}) {
-    analyze(compiler, code, warnings: warnings);
-  }
-
-  check("new C1(42);");
-  check("new C1('string');");
-  check("new C2(42);");
-  check("new C2('string');", warnings: NOT_ASSIGNABLE);
-  check("new C3(42);");
-  check("new C3('string');", warnings: NOT_ASSIGNABLE);
-  check("new C3.named(42);");
-  check("new C3.named('string');", warnings: NOT_ASSIGNABLE);
-}
-
-void testMethodInvocationArgumentCount(MockCompiler compiler) {
-  compiler.parseScript(CLASS_WITH_METHODS);
-
-  check(String text, [expectedWarnings]) {
-    analyze(compiler, "{ ClassWithMethods c; $text }",
-        warnings: expectedWarnings);
-  }
-
-  check("c.untypedNoArgumentMethod(1);", MessageKind.ADDITIONAL_ARGUMENT);
-  check("c.untypedOneArgumentMethod();", MessageKind.MISSING_ARGUMENT);
-  check("c.untypedOneArgumentMethod(1, 1);", MessageKind.ADDITIONAL_ARGUMENT);
-  check("c.untypedTwoArgumentMethod();", MessageKind.MISSING_ARGUMENT);
-  check(
-      "c.untypedTwoArgumentMethod(1, 2, 3);", MessageKind.ADDITIONAL_ARGUMENT);
-  check("c.intNoArgumentMethod(1);", MessageKind.ADDITIONAL_ARGUMENT);
-  check("c.intOneArgumentMethod();", MessageKind.MISSING_ARGUMENT);
-  check("c.intOneArgumentMethod(1, 1);", MessageKind.ADDITIONAL_ARGUMENT);
-  check("c.intTwoArgumentMethod();", MessageKind.MISSING_ARGUMENT);
-  check("c.intTwoArgumentMethod(1, 2, 3);", MessageKind.ADDITIONAL_ARGUMENT);
-  // check("c.untypedField();");
-
-  check("c.intOneArgumentOneOptionalMethod();", [MessageKind.MISSING_ARGUMENT]);
-  check("c.intOneArgumentOneOptionalMethod(0);");
-  check("c.intOneArgumentOneOptionalMethod(0, 1);");
-  check("c.intOneArgumentOneOptionalMethod(0, 1, 2);",
-      [MessageKind.ADDITIONAL_ARGUMENT]);
-  check("c.intOneArgumentOneOptionalMethod(0, 1, c: 2);",
-      [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
-  check("c.intOneArgumentOneOptionalMethod(0, b: 1);",
-      [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
-  check("c.intOneArgumentOneOptionalMethod(a: 0, b: 1);", [
-    MessageKind.NAMED_ARGUMENT_NOT_FOUND,
-    MessageKind.NAMED_ARGUMENT_NOT_FOUND,
-    MessageKind.MISSING_ARGUMENT
-  ]);
-
-  check("c.intTwoOptionalMethod();");
-  check("c.intTwoOptionalMethod(0);");
-  check("c.intTwoOptionalMethod(0, 1);");
-  check("c.intTwoOptionalMethod(0, 1, 2);", [MessageKind.ADDITIONAL_ARGUMENT]);
-  check(
-      "c.intTwoOptionalMethod(a: 0);", [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
-  check("c.intTwoOptionalMethod(0, b: 1);",
-      [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
-
-  check("c.intOneArgumentOneNamedMethod();", [MessageKind.MISSING_ARGUMENT]);
-  check("c.intOneArgumentOneNamedMethod(0);");
-  check("c.intOneArgumentOneNamedMethod(0, b: 1);");
-  check(
-      "c.intOneArgumentOneNamedMethod(b: 1);", [MessageKind.MISSING_ARGUMENT]);
-  check("c.intOneArgumentOneNamedMethod(0, b: 1, c: 2);",
-      [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
-  check("c.intOneArgumentOneNamedMethod(0, 1);",
-      [MessageKind.ADDITIONAL_ARGUMENT]);
-  check("c.intOneArgumentOneNamedMethod(0, 1, c: 2);",
-      [MessageKind.ADDITIONAL_ARGUMENT, MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
-  check("c.intOneArgumentOneNamedMethod(a: 1, b: 1);",
-      [MessageKind.NAMED_ARGUMENT_NOT_FOUND, MessageKind.MISSING_ARGUMENT]);
-
-  check("c.intTwoNamedMethod();");
-  check("c.intTwoNamedMethod(a: 0);");
-  check("c.intTwoNamedMethod(b: 1);");
-  check("c.intTwoNamedMethod(a: 0, b: 1);");
-  check("c.intTwoNamedMethod(b: 1, a: 0);");
-  check("c.intTwoNamedMethod(0);", [MessageKind.ADDITIONAL_ARGUMENT]);
-  check("c.intTwoNamedMethod(c: 2);", [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
-  check("c.intTwoNamedMethod(a: 0, c: 2);",
-      [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
-  check("c.intTwoNamedMethod(a: 0, b: 1, c: 2);",
-      [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
-  check("c.intTwoNamedMethod(c: 2, b: 1, a: 0);",
-      [MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
-  check("c.intTwoNamedMethod(0, b: 1);", [MessageKind.ADDITIONAL_ARGUMENT]);
-  check("c.intTwoNamedMethod(0, 1);",
-      [MessageKind.ADDITIONAL_ARGUMENT, MessageKind.ADDITIONAL_ARGUMENT]);
-  check("c.intTwoNamedMethod(0, c: 2);",
-      [MessageKind.ADDITIONAL_ARGUMENT, MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
-}
-
-void testMethodInvocations(MockCompiler compiler) {
-  compiler.parseScript(CLASS_WITH_METHODS);
-
-  check(String text, [expectedWarnings]) {
-    analyze(
-        compiler,
-        """{
-               ClassWithMethods c;
-               SubClass d;
-               var e;
-               int i;
-               int j;
-               int localMethod(String str) { return 0; }
-               $text
-               }
-               """,
-        warnings: expectedWarnings);
-  }
-
-  check("int k = c.untypedNoArgumentMethod();");
-  check("ClassWithMethods x = c.untypedNoArgumentMethod();");
-  check("ClassWithMethods x = d.untypedNoArgumentMethod();");
-  check("int k = d.intMethod();");
-  check("int k = c.untypedOneArgumentMethod(c);");
-  check("ClassWithMethods x = c.untypedOneArgumentMethod(1);");
-  check("int k = c.untypedOneArgumentMethod('string');");
-  check("int k = c.untypedOneArgumentMethod(i);");
-  check("int k = d.untypedOneArgumentMethod(d);");
-  check("ClassWithMethods x = d.untypedOneArgumentMethod(1);");
-  check("int k = d.untypedOneArgumentMethod('string');");
-  check("int k = d.untypedOneArgumentMethod(i);");
-
-  check("int k = c.untypedTwoArgumentMethod(1, 'string');");
-  check("int k = c.untypedTwoArgumentMethod(i, j);");
-  check("ClassWithMethods x = c.untypedTwoArgumentMethod(i, c);");
-  check("int k = d.untypedTwoArgumentMethod(1, 'string');");
-  check("int k = d.untypedTwoArgumentMethod(i, j);");
-  check("ClassWithMethods x = d.untypedTwoArgumentMethod(i, d);");
-
-  check("int k = c.intNoArgumentMethod();");
-  check("ClassWithMethods x = c.intNoArgumentMethod();", NOT_ASSIGNABLE);
-
-  check("int k = c.intOneArgumentMethod(c);", NOT_ASSIGNABLE);
-  check("ClassWithMethods x = c.intOneArgumentMethod(1);", NOT_ASSIGNABLE);
-  check("int k = c.intOneArgumentMethod('string');", NOT_ASSIGNABLE);
-  check("int k = c.intOneArgumentMethod(i);");
-
-  check("int k = c.intTwoArgumentMethod(1, 'string');", NOT_ASSIGNABLE);
-  check("int k = c.intTwoArgumentMethod(i, j);");
-  check("ClassWithMethods x = c.intTwoArgumentMethod(i, j);", NOT_ASSIGNABLE);
-
-  check("c.functionField();");
-  check("d.functionField();");
-  check("c.functionField(1);");
-  check("d.functionField('string');");
-
-  check("c.intField();", MessageKind.NOT_CALLABLE);
-  check("d.intField();", MessageKind.NOT_CALLABLE);
-
-  check("c.untypedField();");
-  check("d.untypedField();");
-  check("c.untypedField(1);");
-  check("d.untypedField('string');");
-
-  check("c.intOneArgumentOneOptionalMethod('');", NOT_ASSIGNABLE);
-  check("c.intOneArgumentOneOptionalMethod('', '');",
-      [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-
-  check("c.intTwoOptionalMethod('');", NOT_ASSIGNABLE);
-  check("c.intTwoOptionalMethod('', '');", [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-
-  check("c.intOneArgumentOneNamedMethod('');", NOT_ASSIGNABLE);
-  check("c.intOneArgumentOneNamedMethod('', b: '');",
-      [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-
-  check("c.intTwoNamedMethod(a: '');", NOT_ASSIGNABLE);
-  check("c.intTwoNamedMethod(b: '');", NOT_ASSIGNABLE);
-  check("c.intTwoNamedMethod(a: '', b: '');", [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-  check("c.intTwoNamedMethod(b: '', a: '');", [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-
-  // Invocation of dynamic variable.
-  check("e();");
-  check("e(1);");
-  check("e('string');");
-
-  // Invocation on local method.
-  check("localMethod();", MessageKind.MISSING_ARGUMENT);
-  check("localMethod(1);", NOT_ASSIGNABLE);
-  check("localMethod('string');");
-  check("int k = localMethod('string');");
-  check("String k = localMethod('string');", NOT_ASSIGNABLE);
-
-  // Invocation on parenthesized expressions.
-  check("(e)();");
-  check("(e)(1);");
-  check("(e)('string');");
-  check("(foo)();");
-  check("(foo)(1);");
-  check("(foo)('string');");
-
-  // Invocations on function expressions.
-  check("(foo){}();", MessageKind.MISSING_ARGUMENT);
-  check("(foo){}(1);");
-  check("(foo){}('string');");
-  check("(int foo){}('string');", NOT_ASSIGNABLE);
-  check("(String foo){}('string');");
-  check("int k = int bar(String foo){ return 0; }('string');");
-  check("int k = String bar(String foo){ return foo; }('string');",
-      NOT_ASSIGNABLE);
-
-  // Static invocations.
-  check("ClassWithMethods.staticMethod();", MessageKind.MISSING_ARGUMENT);
-  check("ClassWithMethods.staticMethod(1);", NOT_ASSIGNABLE);
-  check("ClassWithMethods.staticMethod('string');");
-  check("int k = ClassWithMethods.staticMethod('string');");
-  check("String k = ClassWithMethods.staticMethod('string');", NOT_ASSIGNABLE);
-
-  // Invocation on dynamic variable.
-  check("e.foo();");
-  check("e.foo(1);");
-  check("e.foo('string');");
-
-  // Invocation on unresolved variable.
-  check("foo();");
-  check("foo(1);");
-  check("foo('string');");
-  check("foo(a: 'string');");
-  check("foo(a: localMethod(1));", NOT_ASSIGNABLE);
-}
-
-Future testMethodInvocationsInClass(MockCompiler compiler) {
-  MockCompiler compiler = new MockCompiler.internal();
-  return compiler.init(CLASS_WITH_METHODS).then((_) {
-    LibraryElement library = compiler.mainApp;
-    compiler.parseScript(CLASS_WITH_METHODS, library);
-    ClassElement ClassWithMethods = library.find("ClassWithMethods");
-    ClassWithMethods.ensureResolved(compiler.resolution);
-    Element c = ClassWithMethods.lookupLocalMember('method');
-    assert(c != null);
-    ClassElement SubClass = library.find("SubClass");
-    SubClass.ensureResolved(compiler.resolution);
-    Element d = SubClass.lookupLocalMember('method');
-    assert(d != null);
-
-    check(Element element, String text, [expectedWarnings]) {
-      analyzeIn(
-          compiler,
-          element,
-          """{
-                     var e;
-                     int i;
-                     int j;
-                     int localMethod(String str) { return 0; }
-                     $text
-                   }""",
-          warnings: expectedWarnings);
-    }
-
-    check(c, "int k = untypedNoArgumentMethod();");
-    check(c, "ClassWithMethods x = untypedNoArgumentMethod();");
-    check(d, "ClassWithMethods x = untypedNoArgumentMethod();");
-    check(d, "int k = intMethod();");
-    check(c, "int k = untypedOneArgumentMethod(this);");
-    check(c, "ClassWithMethods x = untypedOneArgumentMethod(1);");
-    check(c, "int k = untypedOneArgumentMethod('string');");
-    check(c, "int k = untypedOneArgumentMethod(i);");
-    check(d, "int k = untypedOneArgumentMethod(this);");
-    check(d, "ClassWithMethods x = untypedOneArgumentMethod(1);");
-    check(d, "int k = untypedOneArgumentMethod('string');");
-    check(d, "int k = untypedOneArgumentMethod(i);");
-
-    check(c, "int k = untypedTwoArgumentMethod(1, 'string');");
-    check(c, "int k = untypedTwoArgumentMethod(i, j);");
-    check(c, "ClassWithMethods x = untypedTwoArgumentMethod(i, this);");
-    check(d, "int k = untypedTwoArgumentMethod(1, 'string');");
-    check(d, "int k = untypedTwoArgumentMethod(i, j);");
-    check(d, "ClassWithMethods x = untypedTwoArgumentMethod(i, this);");
-
-    check(c, "int k = intNoArgumentMethod();");
-    check(c, "ClassWithMethods x = intNoArgumentMethod();", NOT_ASSIGNABLE);
-
-    check(c, "int k = intOneArgumentMethod('');", NOT_ASSIGNABLE);
-    check(c, "ClassWithMethods x = intOneArgumentMethod(1);", NOT_ASSIGNABLE);
-    check(c, "int k = intOneArgumentMethod('string');", NOT_ASSIGNABLE);
-    check(c, "int k = intOneArgumentMethod(i);");
-
-    check(c, "int k = intTwoArgumentMethod(1, 'string');", NOT_ASSIGNABLE);
-    check(c, "int k = intTwoArgumentMethod(i, j);");
-    check(
-        c, "ClassWithMethods x = intTwoArgumentMethod(i, j);", NOT_ASSIGNABLE);
-
-    check(c, "functionField();");
-    check(d, "functionField();");
-    check(c, "functionField(1);");
-    check(d, "functionField('string');");
-
-    check(c, "intField();", MessageKind.NOT_CALLABLE);
-    check(d, "intField();", MessageKind.NOT_CALLABLE);
-
-    check(c, "untypedField();");
-    check(d, "untypedField();");
-    check(c, "untypedField(1);");
-    check(d, "untypedField('string');");
-
-    check(c, "intOneArgumentOneOptionalMethod('');", NOT_ASSIGNABLE);
-    check(c, "intOneArgumentOneOptionalMethod('', '');",
-        [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-
-    check(c, "intTwoOptionalMethod('');", NOT_ASSIGNABLE);
-    check(c, "intTwoOptionalMethod('', '');", [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-
-    check(c, "intOneArgumentOneNamedMethod('');", NOT_ASSIGNABLE);
-    check(c, "intOneArgumentOneNamedMethod('', b: '');",
-        [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-
-    check(c, "intTwoNamedMethod(a: '');", NOT_ASSIGNABLE);
-    check(c, "intTwoNamedMethod(b: '');", NOT_ASSIGNABLE);
-    check(c, "intTwoNamedMethod(a: '', b: '');",
-        [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-    check(c, "intTwoNamedMethod(b: '', a: '');",
-        [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-
-    // Invocation of dynamic variable.
-    check(c, "e();");
-    check(c, "e(1);");
-    check(c, "e('string');");
-
-    // Invocation on local method.
-    check(c, "localMethod();", MessageKind.MISSING_ARGUMENT);
-    check(c, "localMethod(1);", NOT_ASSIGNABLE);
-    check(c, "localMethod('string');");
-    check(c, "int k = localMethod('string');");
-    check(c, "String k = localMethod('string');", NOT_ASSIGNABLE);
-
-    // Invocation on parenthesized expressions.
-    check(c, "(e)();");
-    check(c, "(e)(1);");
-    check(c, "(e)('string');");
-    check(c, "(foo)();", UNDEFINED_GETTER);
-    check(c, "(foo)(1);", UNDEFINED_GETTER);
-    check(c, "(foo)('string');", UNDEFINED_GETTER);
-
-    // Invocations on function expressions.
-    check(c, "(foo){}();", MessageKind.MISSING_ARGUMENT);
-    check(c, "(foo){}(1);");
-    check(c, "(foo){}('string');");
-    check(c, "(int foo){}('string');", NOT_ASSIGNABLE);
-    check(c, "(String foo){}('string');");
-    check(c, "int k = int bar(String foo){ return 0; }('string');");
-    check(c, "int k = String bar(String foo){ return foo; }('string');",
-        NOT_ASSIGNABLE);
-
-    // Static invocations.
-    check(c, "staticMethod();", MessageKind.MISSING_ARGUMENT);
-    check(c, "staticMethod(1);", NOT_ASSIGNABLE);
-    check(c, "staticMethod('string');");
-    check(c, "int k = staticMethod('string');");
-    check(c, "String k = staticMethod('string');", NOT_ASSIGNABLE);
-    check(d, "staticMethod();", MessageKind.UNDEFINED_METHOD);
-    check(d, "staticMethod(1);", MessageKind.UNDEFINED_METHOD);
-    check(d, "staticMethod('string');", MessageKind.UNDEFINED_METHOD);
-    check(d, "int k = staticMethod('string');", MessageKind.UNDEFINED_METHOD);
-    check(
-        d, "String k = staticMethod('string');", MessageKind.UNDEFINED_METHOD);
-
-    // Invocation on dynamic variable.
-    check(c, "e.foo();");
-    check(c, "e.foo(1);");
-    check(c, "e.foo('string');");
-
-    // Invocation on unresolved variable.
-    check(c, "foo();", MessageKind.UNDEFINED_METHOD);
-    check(c, "foo(1);", MessageKind.UNDEFINED_METHOD);
-    check(c, "foo('string');", MessageKind.UNDEFINED_METHOD);
-    check(c, "foo(a: 'string');", MessageKind.UNDEFINED_METHOD);
-    check(c, "foo(a: localMethod(1));",
-        [MessageKind.UNDEFINED_METHOD, NOT_ASSIGNABLE]);
-  });
-}
-
-void testFunctionCall(MockCompiler compiler) {
-  compiler.parseScript(CLASS_WITH_METHODS);
-
-  check(String text, [expectedWarnings]) {
-    analyze(
-        compiler,
-        """{
-               ClassWithMethods x;
-               int localMethod(String str) { return 0; }
-               String2Int string2int;
-               Function function;
-               SubFunction subFunction;
-               $text
-               }
-               """,
-        warnings: expectedWarnings);
-  }
-
-  check("int k = localMethod.call('');");
-  check("String k = localMethod.call('');", NOT_ASSIGNABLE);
-  check("int k = localMethod.call(0);", NOT_ASSIGNABLE);
-
-  check("int k = ClassWithMethods.staticMethod.call('');");
-  check("String k = ClassWithMethods.staticMethod.call('');", NOT_ASSIGNABLE);
-  check("int k = ClassWithMethods.staticMethod.call(0);", NOT_ASSIGNABLE);
-
-  check("int k = x.instanceMethod.call('');");
-  check("String k = x.instanceMethod.call('');", NOT_ASSIGNABLE);
-  check("int k = x.instanceMethod.call(0);", NOT_ASSIGNABLE);
-
-  check("int k = topLevelMethod.call('');");
-  check("String k = topLevelMethod.call('');", NOT_ASSIGNABLE);
-  check("int k = topLevelMethod.call(0);", NOT_ASSIGNABLE);
-
-  check("((String s) { return 0; }).call('');");
-  check("((String s) { return 0; }).call(0);", NOT_ASSIGNABLE);
-
-  check("(int f(String x)) { int i = f.call(''); } (null);");
-  check("(int f(String x)) { String s = f.call(''); } (null);", NOT_ASSIGNABLE);
-  check("(int f(String x)) { int i = f.call(0); } (null);", NOT_ASSIGNABLE);
-
-  check("int k = string2int.call('');");
-  check("String k = string2int.call('');", NOT_ASSIGNABLE);
-  check("int k = string2int.call(0);", NOT_ASSIGNABLE);
-
-  check("int k = x.string2int.call('');");
-  check("String k = x.string2int.call('');", NOT_ASSIGNABLE);
-  check("int k = x.string2int.call(0);", NOT_ASSIGNABLE);
-
-  check("int k = function.call('');");
-  check("String k = function.call('');");
-  check("int k = function.call(0);");
-
-  check("int k = subFunction.call('');");
-  check("String k = subFunction.call('');");
-  check("int k = subFunction.call(0);");
-}
-
-testNewExpression(MockCompiler compiler) {
-  compiler.parseScript("class A {}");
-  analyze(compiler, "A a = new A();");
-  analyze(compiler, "int i = new A();", warnings: NOT_ASSIGNABLE);
-
-// TODO(karlklose): constructors are not yet implemented.
-//  compiler.parseScript(
-//    "class Foo {\n" +
-//    "  Foo(int x) {}\n" +
-//    "  Foo.foo() {}\n" +
-//    "  Foo.bar([int i = null]) {}\n" +
-//    "}\n" +
-//    "abstract class Bar<T> {\n" +
-//    "  factory Bar.make() => new Baz<T>.make();\n" +
-//    "}\n" +
-//    "class Baz {\n" +
-//    "  factory Bar<S>.make(S x) { return null; }\n" +
-//    "}");
-//
-//  analyze("Foo x = new Foo(0);");
-//  analyze("Foo x = new Foo();", MessageKind.MISSING_ARGUMENT);
-//  analyze("Foo x = new Foo('');", NOT_ASSIGNABLE);
-//  analyze("Foo x = new Foo(0, null);", MessageKind.ADDITIONAL_ARGUMENT);
-//
-//  analyze("Foo x = new Foo.foo();");
-//  analyze("Foo x = new Foo.foo(null);", MessageKind.ADDITIONAL_ARGUMENT);
-//
-//  analyze("Foo x = new Foo.bar();");
-//  analyze("Foo x = new Foo.bar(0);");
-//  analyze("Foo x = new Foo.bar('');", NOT_ASSIGNABLE);
-//  analyze("Foo x = new Foo.bar(0, null);",
-//          MessageKind.ADDITIONAL_ARGUMENT);
-//
-//  analyze("Bar<String> x = new Bar<String>.make('');");
-}
-
-testConditionalExpression(MockCompiler compiler) {
-  check(String code, {warnings}) {
-    analyze(compiler, code, warnings: warnings);
-  }
-
-  check("int i = true ? 2 : 1;");
-  check("int i = true ? 'hest' : 1;");
-  check("int i = true ? 'hest' : 'fisk';", warnings: NOT_ASSIGNABLE);
-  check("String s = true ? 'hest' : 'fisk';");
-
-  check("true ? 1 : 2;");
-  check("null ? 1 : 2;");
-  check("0 ? 1 : 2;", warnings: NOT_ASSIGNABLE);
-  check("'' ? 1 : 2;", warnings: NOT_ASSIGNABLE);
-  check("{ int i; true ? i = 2.7 : 2; }", warnings: NOT_ASSIGNABLE);
-  check("{ int i; true ? 2 : i = 2.7; }", warnings: NOT_ASSIGNABLE);
-  check("{ int i; i = true ? 2.7 : 2; }");
-
-  compiler.parseScript("""
-    bool cond() => true;
-    void f1() {}
-    void f2() {}""");
-  check("{ cond() ? f1() : f2(); }");
-}
-
-testIfStatement(MockCompiler compiler) {
-  check(String code, {warnings}) {
-    analyze(compiler, code, warnings: warnings);
-  }
-
-  check("if (true) {}");
-  check("if (null) {}");
-  check("if (0) {}", warnings: NOT_ASSIGNABLE);
-  check("if ('') {}", warnings: NOT_ASSIGNABLE);
-  check("{ int i = 27; if (true) { i = 2.7; } else {} }",
-      warnings: NOT_ASSIGNABLE);
-  check("{ int i = 27; if (true) {} else { i = 2.7; } }",
-      warnings: NOT_ASSIGNABLE);
-}
-
-testThis(MockCompiler compiler) {
-  String script = """class Foo {
-                       void method() {}
-                     }""";
-  compiler.parseScript(script);
-  LibraryElement mainApp = compiler.mainApp;
-  ClassElement foo = mainApp.find("Foo");
-  foo.ensureResolved(compiler.resolution);
-  Element method = foo.lookupLocalMember('method');
-  analyzeIn(compiler, method, "{ int i = this; }", warnings: NOT_ASSIGNABLE);
-  analyzeIn(compiler, method, "{ Object o = this; }");
-  analyzeIn(compiler, method, "{ Foo f = this; }");
-}
-
-testSuper(MockCompiler compiler) {
-  String script = r'''
-    class A {
-      String field = "42";
-    }
-
-    class B extends A {
-      Object field = 42;
-      void method() {}
-    }
-    ''';
-  compiler.parseScript(script);
-  LibraryElement mainApp = compiler.mainApp;
-  ClassElement B = mainApp.find("B");
-  B.ensureResolved(compiler.resolution);
-  Element method = B.lookupLocalMember('method');
-  analyzeIn(compiler, method, "{ int i = super.field; }",
-      warnings: NOT_ASSIGNABLE);
-  analyzeIn(compiler, method, "{ Object o = super.field; }");
-  analyzeIn(compiler, method, "{ String s = super.field; }");
-}
-
-const String CLASSES_WITH_OPERATORS = '''
-class Operators {
-  Operators operator +(Operators other) => this;
-  Operators operator -(Operators other) => this;
-  Operators operator -() => this;
-  Operators operator *(Operators other) => this;
-  Operators operator /(Operators other) => this;
-  Operators operator %(Operators other) => this;
-  Operators operator ~/(Operators other) => this;
-
-  Operators operator &(Operators other) => this;
-  Operators operator |(Operators other) => this;
-  Operators operator ^(Operators other) => this;
-
-  Operators operator ~() => this;
-
-  Operators operator <(Operators other) => true;
-  Operators operator >(Operators other) => false;
-  Operators operator <=(Operators other) => this;
-  Operators operator >=(Operators other) => this;
-
-  Operators operator <<(Operators other) => this;
-  Operators operator >>(Operators other) => this;
-
-  bool operator ==(Operators other) => true;
-
-  Operators operator [](Operators key) => this;
-  void operator []=(Operators key, Operators value) {}
-}
-
-class MismatchA {
-  int operator+(MismatchA other) => 0;
-  MismatchA operator-(int other) => this;
-
-  MismatchA operator[](int key) => this;
-  void operator[]=(int key, MismatchA value) {}
-}
-
-class MismatchB {
-  MismatchB operator+(MismatchB other) => this;
-
-  MismatchB operator[](int key) => this;
-  void operator[]=(String key, MismatchB value) {}
-}
-
-class MismatchC {
-  MismatchC operator+(MismatchC other) => this;
-
-  MismatchC operator[](int key) => this;
-  void operator[]=(int key, String value) {}
-}
-''';
-
-testOperatorsAssignability(MockCompiler compiler) {
-  compiler.parseScript(CLASSES_WITH_OPERATORS);
-
-  // Tests against Operators.
-
-  String header = """{
-      bool z;
-      Operators a;
-      Operators b;
-      Operators c;
-      """;
-
-  check(String text, [expectedWarnings]) {
-    analyze(compiler, '$header $text }', warnings: expectedWarnings);
-  }
-
-  // Positive tests on operators.
-
-  check('c = a + b;');
-  check('c = a - b;');
-  check('c = -a;');
-  check('c = a * b;');
-  check('c = a / b;');
-  check('c = a % b;');
-  check('c = a ~/ b;');
-
-  check('c = a & b;');
-  check('c = a | b;');
-  check('c = a ^ b;');
-
-  check('c = ~a;');
-
-  check('c = a < b;');
-  check('c = a > b;');
-  check('c = a <= b;');
-  check('c = a >= b;');
-
-  check('c = a << b;');
-  check('c = a >> b;');
-
-  check('c = a[b];');
-
-  check('a[b] = c;');
-  check('a[b] += c;');
-  check('a[b] -= c;');
-  check('a[b] *= c;');
-  check('a[b] /= c;');
-  check('a[b] %= c;');
-  check('a[b] ~/= c;');
-  check('a[b] <<= c;');
-  check('a[b] >>= c;');
-  check('a[b] &= c;');
-  check('a[b] |= c;');
-  check('a[b] ^= c;');
-
-  check('a += b;');
-  check('a -= b;');
-  check('a *= b;');
-  check('a /= b;');
-  check('a %= b;');
-  check('a ~/= b;');
-
-  check('a <<= b;');
-  check('a >>= b;');
-
-  check('a &= b;');
-  check('a |= b;');
-  check('a ^= b;');
-
-  // Negative tests on operators.
-
-  // For the sake of brevity we misuse the terminology in comments:
-  //  'e1 is not assignable to e2' should be read as
-  //     'the type of e1 is not assignable to the type of e2', and
-  //  'e1 is not assignable to operator o on e2' should be read as
-  //     'the type of e1 is not assignable to the argument type of operator o
-  //      on e2'.
-
-  // `0` is not assignable to operator + on `a`.
-  check('c = a + 0;', NOT_ASSIGNABLE);
-  // `a + b` is not assignable to `z`.
-  check('z = a + b;', NOT_ASSIGNABLE);
-
-  // `-a` is not assignable to `z`.
-  check('z = -a;', NOT_ASSIGNABLE);
-
-  // `0` is not assignable to operator [] on `a`.
-  check('c = a[0];', NOT_ASSIGNABLE);
-  // `a[b]` is not assignable to `z`.
-  check('z = a[b];', NOT_ASSIGNABLE);
-
-  // `0` is not assignable to operator [] on `a`.
-  // Warning suppressed for `0` is not assignable to operator []= on `a`.
-  check('a[0] *= c;', NOT_ASSIGNABLE);
-  // `z` is not assignable to operator * on `a[0]`.
-  check('a[b] *= z;', NOT_ASSIGNABLE);
-
-  check('b = a++;', NOT_ASSIGNABLE);
-  check('b = ++a;', NOT_ASSIGNABLE);
-  check('b = a--;', NOT_ASSIGNABLE);
-  check('b = --a;', NOT_ASSIGNABLE);
-
-  check('c = a[b]++;', NOT_ASSIGNABLE);
-  check('c = ++a[b];', NOT_ASSIGNABLE);
-  check('c = a[b]--;', NOT_ASSIGNABLE);
-  check('c = --a[b];', NOT_ASSIGNABLE);
-
-  check('z = a == b;');
-  check('z = a != b;');
-
-  for (String o in ['&&', '||']) {
-    check('z = z $o z;');
-    check('z = a $o z;', NOT_ASSIGNABLE);
-    check('z = z $o b;', NOT_ASSIGNABLE);
-    check('z = a $o b;', [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-    check('a = a $o b;', [NOT_ASSIGNABLE, NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-  }
-
-  check('z = !z;');
-  check('z = !a;', NOT_ASSIGNABLE);
-  check('a = !z;', NOT_ASSIGNABLE);
-  check('a = !a;', [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-
-  // Tests against MismatchA.
-
-  header = """{
-      MismatchA a;
-      MismatchA b;
-      MismatchA c;
-      """;
-
-  // Tests against int operator +(MismatchA other) => 0;
-
-  // `a + b` is not assignable to `c`.
-  check('c = a + b;', NOT_ASSIGNABLE);
-  // `a + b` is not assignable to `a`.
-  check('a += b;', NOT_ASSIGNABLE);
-  // `a[0] + b` is not assignable to `a[0]`.
-  check('a[0] += b;', NOT_ASSIGNABLE);
-
-  // 1 is not applicable to operator +.
-  check('b = a++;', NOT_ASSIGNABLE);
-  // 1 is not applicable to operator +.
-  // `++a` of type int is not assignable to `b`.
-  check('b = ++a;', [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-
-  // 1 is not applicable to operator +.
-  check('b = a[0]++;', NOT_ASSIGNABLE);
-  // 1 is not applicable to operator +.
-  // `++a[0]` of type int is not assignable to `b`.
-  check('b = ++a[0];', [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-
-  // Tests against: MismatchA operator -(int other) => this;
-
-  // `a - b` is not assignable to `c`.
-  check('c = a + b;', NOT_ASSIGNABLE);
-  // `a - b` is not assignable to `a`.
-  check('a += b;', NOT_ASSIGNABLE);
-  // `a[0] - b` is not assignable to `a[0]`.
-  check('a[0] += b;', NOT_ASSIGNABLE);
-
-  check('b = a--;');
-  check('b = --a;');
-
-  check('b = a[0]--;');
-  check('b = --a[0];');
-
-  // Tests against MismatchB.
-
-  header = """{
-      MismatchB a;
-      MismatchB b;
-      MismatchB c;
-      """;
-
-  // Tests against:
-  // MismatchB operator [](int key) => this;
-  // void operator []=(String key, MismatchB value) {}
-
-  // `0` is not applicable to operator []= on `a`.
-  check('a[0] = b;', NOT_ASSIGNABLE);
-
-  // `0` is not applicable to operator []= on `a`.
-  check('a[0] += b;', NOT_ASSIGNABLE);
-  // `""` is not applicable to operator [] on `a`.
-  check('a[""] += b;', NOT_ASSIGNABLE);
-  // `c` is not applicable to operator [] on `a`.
-  // `c` is not applicable to operator []= on `a`.
-  check('a[c] += b;', [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-
-  // Tests against MismatchB.
-
-  header = """{
-      MismatchC a;
-      MismatchC b;
-      MismatchC c;
-      """;
-
-  // Tests against:
-  // MismatchC operator[](int key) => this;
-  // void operator[]=(int key, String value) {}
-
-  // `b` is not assignable to `a[0]`.
-  check('a[0] += b;', NOT_ASSIGNABLE);
-  // `0` is not applicable to operator + on `a[0]`.
-  check('a[0] += "";', [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-  // `true` is not applicable to operator + on `a[0]`.
-  // `true` is not assignable to `a[0]`.
-  check('a[0] += true;', [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-}
-
-Future testFieldInitializers(MockCompiler compiler) {
-  Future check(String code, [expectedWarnings]) {
-    return analyzeTopLevel(code, expectedWarnings);
-  }
-
-  return Future.wait([
-    check("""int i = 0;"""),
-    check("""int i = '';""", NOT_ASSIGNABLE),
-    check("""class Class {
-               int i = 0;
-             }"""),
-    check("""class Class {
-               int i = '';
-             }""", NOT_ASSIGNABLE),
-  ]);
-}
-
-void testTypeVariableExpressions(MockCompiler compiler) {
-  String script = """class Foo<T> {
-                       void method() {}
-                     }""";
-  compiler.parseScript(script);
-  LibraryElement mainApp = compiler.mainApp;
-  ClassElement foo = mainApp.find("Foo");
-  foo.ensureResolved(compiler.resolution);
-  Element method = foo.lookupLocalMember('method');
-
-  analyzeIn(compiler, method, "{ Type type = T; }");
-  analyzeIn(compiler, method, "{ T type = T; }", warnings: NOT_ASSIGNABLE);
-  analyzeIn(compiler, method, "{ int type = T; }", warnings: NOT_ASSIGNABLE);
-
-  analyzeIn(compiler, method, "{ String typeName = T.toString(); }");
-  analyzeIn(compiler, method, "{ T.foo; }", warnings: UNDEFINED_GETTER);
-  analyzeIn(compiler, method, "{ T.foo = 0; }",
-      warnings: MessageKind.UNDEFINED_SETTER);
-  analyzeIn(compiler, method, "{ T.foo(); }",
-      warnings: MessageKind.UNDEFINED_METHOD);
-  analyzeIn(compiler, method, "{ T + 1; }",
-      warnings: MessageKind.UNDEFINED_OPERATOR);
-}
-
-void testTypeVariableLookup1(MockCompiler compiler) {
-  String script = """
-class Foo {
-  int field;
-  void method(int argument) {}
-  int operator +(Foo foo) {}
-  int get getter => 21;
-}
-
-class Test<S extends Foo, T> {
-  S s;
-  T t;
-  test() {}
-}
-""";
-
-  compiler.parseScript(script);
-  LibraryElement mainApp = compiler.mainApp;
-  ClassElement classTest = mainApp.find("Test");
-  classTest.ensureResolved(compiler.resolution);
-  FunctionElement methodTest = classTest.lookupLocalMember("test");
-
-  test(String expression, [message]) {
-    analyzeIn(compiler, methodTest, "{ $expression; }", warnings: message);
-  }
-
-  test('s.field');
-  test('s.method(1)');
-  test('s + s');
-  test('s.getter');
-
-  test('t.toString');
-  test('t.field', UNDEFINED_GETTER);
-  test('t.method(1)', MessageKind.UNDEFINED_METHOD);
-  test('t + t', MessageKind.UNDEFINED_OPERATOR);
-  test('t.getter', UNDEFINED_GETTER);
-
-  test('s.field = "hest"', NOT_ASSIGNABLE);
-  test('s.method("hest")', NOT_ASSIGNABLE);
-  test('s + "hest"', NOT_ASSIGNABLE);
-  test('String v = s.getter', NOT_ASSIGNABLE);
-}
-
-void testTypeVariableLookup2(MockCompiler compiler) {
-  String script = """
-class Foo {
-  int field;
-  void method(int argument) {}
-  int operator +(Foo foo) {}
-  int get getter => 21;
-}
-
-class Test<S extends T, T extends Foo> {
-  S s;
-  test() {}
-}""";
-
-  compiler.parseScript(script);
-  LibraryElement mainApp = compiler.mainApp;
-  ClassElement classTest = mainApp.find("Test");
-  classTest.ensureResolved(compiler.resolution);
-  FunctionElement methodTest = classTest.lookupLocalMember("test");
-
-  test(String expression, [message]) {
-    analyzeIn(compiler, methodTest, "{ $expression; }", warnings: message);
-  }
-
-  test('s.field');
-  test('s.method(1)');
-  test('s + s');
-  test('s.getter');
-}
-
-void testTypeVariableLookup3(MockCompiler compiler) {
-  String script = """
-class Test<S extends T, T extends S> {
-  S s;
-  test() {}
-}""";
-
-  compiler.parseScript(script);
-  LibraryElement mainApp = compiler.mainApp;
-  ClassElement classTest = mainApp.find("Test");
-  classTest.ensureResolved(compiler.resolution);
-  FunctionElement methodTest = classTest.lookupLocalMember("test");
-
-  test(String expression, [message]) {
-    analyzeIn(compiler, methodTest, "{ $expression; }", warnings: message);
-  }
-
-  test('s.toString');
-  test('s.field', UNDEFINED_GETTER);
-  test('s.method(1)', MessageKind.UNDEFINED_METHOD);
-  test('s + s', MessageKind.UNDEFINED_OPERATOR);
-  test('s.getter', UNDEFINED_GETTER);
-}
-
-void testFunctionTypeLookup(MockCompiler compiler) {
-  check(String code, {warnings}) {
-    analyze(compiler, code, warnings: warnings);
-  }
-
-  check('(int f(int)) => f.toString;');
-  check('(int f(int)) => f.toString();');
-  check('(int f(int)) => f.foo;', warnings: UNDEFINED_GETTER);
-  check('(int f(int)) => f.foo();', warnings: MessageKind.UNDEFINED_METHOD);
-}
-
-void testTypedefLookup(MockCompiler compiler) {
-  check(String code, {warnings}) {
-    analyze(compiler, code, warnings: warnings);
-  }
-
-  compiler.parseScript("typedef int F(int);");
-  check('(F f) => f.toString;');
-  check('(F f) => f.toString();');
-  check('(F f) => f.foo;', warnings: UNDEFINED_GETTER);
-  check('(F f) => f.foo();', warnings: MessageKind.UNDEFINED_METHOD);
-}
-
-void testTypeLiteral(MockCompiler compiler) {
-  check(String code, {warnings}) {
-    analyze(compiler, code, warnings: warnings);
-  }
-
-  final String source = r"""class Class {
-                              static var field = null;
-                              static method() {}
-                            }""";
-  compiler.parseScript(source);
-
-  // Check direct access.
-  check('Type m() => int;');
-  check('int m() => int;', warnings: NOT_ASSIGNABLE);
-
-  // Check access in assignment.
-  check('m(Type val) => val = Class;');
-  check('m(int val) => val = Class;', warnings: NOT_ASSIGNABLE);
-  check('m(Type val) => val = dynamic;');
-  check('m(int val) => val = dynamic;', warnings: NOT_ASSIGNABLE);
-
-  // Check access as argument.
-  check('m(Type val) => m(int);');
-  check('m(int val) => m(int);', warnings: NOT_ASSIGNABLE);
-
-  // Check access as argument in member access.
-  check('m(Type val) => m(int).foo;');
-  check('m(int val) => m(int).foo;', warnings: NOT_ASSIGNABLE);
-
-  // Check static property access.
-  check('m() => Class.field;');
-  check('m() => (Class).field;', warnings: UNDEFINED_GETTER);
-
-  // Check static method access.
-  check('m() => Class.method();');
-  check('m() => (Class).method();', warnings: MessageKind.UNDEFINED_METHOD);
-
-  // Check access in invocation.
-  check('m() => Class();', warnings: MessageKind.NOT_CALLABLE);
-  check('m() => dynamic();', warnings: MessageKind.NOT_CALLABLE);
-}
-
-Future testInitializers(MockCompiler compiler) {
-  Future check(String text, [expectedWarnings]) {
-    return analyzeTopLevel(text, expectedWarnings);
-  }
-
-  return Future.wait([
-    // Check initializers.
-    check(r'''class Class {
-                var a;
-                Class(this.a);
-              }
-              '''),
-    check(r'''class Class {
-                int a;
-                Class(this.a);
-              }
-              '''),
-    check(r'''class Class {
-                var a;
-                Class(int this.a);
-              }
-              '''),
-    check(r'''class Class {
-                String a;
-                Class(int this.a);
-              }
-              ''', NOT_ASSIGNABLE),
-    check(r'''class Class {
-                var a;
-                Class(int a) : this.a = a;
-              }
-              '''),
-    check(r'''class Class {
-                String a;
-                Class(int a) : this.a = a;
-              }
-              ''', NOT_ASSIGNABLE),
-
-    // Check this-calls.
-    check(r'''class Class {
-                var a;
-                Class(this.a);
-                Class.named(int a) : this(a);
-              }
-              '''),
-    check(r'''class Class {
-                String a;
-                Class(this.a);
-                Class.named(int a) : this(a);
-              }
-              ''', NOT_ASSIGNABLE),
-    check(r'''class Class {
-                String a;
-                Class(var a) : this.a = a;
-                Class.named(int a) : this(a);
-              }
-              '''),
-    check(r'''class Class {
-                String a;
-                Class(String a) : this.a = a;
-                Class.named(int a) : this(a);
-              }
-              ''', NOT_ASSIGNABLE),
-
-    // Check super-calls.
-    check(r'''class Super {
-                var a;
-                Super(this.a);
-              }
-              class Class extends Super {
-                Class.named(int a) : super(a);
-              }
-              '''),
-    check(r'''class Super {
-                String a;
-                Super(this.a);
-              }
-              class Class extends Super {
-                Class.named(int a) : super(a);
-              }
-              ''', NOT_ASSIGNABLE),
-    check(r'''class Super {
-                String a;
-                Super(var a) : this.a = a;
-              }
-              class Class extends Super {
-                Class.named(int a) : super(a);
-              }
-              '''),
-    check(r'''class Super {
-                String a;
-                Super(String a) : this.a = a;
-              }
-              class Class extends Super {
-                Class.named(int a) : super(a);
-              }
-              ''', NOT_ASSIGNABLE),
-
-    // Check super-calls involving generics.
-    check(r'''class Super<T> {
-                var a;
-                Super(this.a);
-              }
-              class Class extends Super<String> {
-                Class.named(int a) : super(a);
-              }
-              '''),
-    check(r'''class Super<T> {
-                T a;
-                Super(this.a);
-              }
-              class Class extends Super<String> {
-                Class.named(int a) : super(a);
-              }
-              ''', NOT_ASSIGNABLE),
-    check(r'''class Super<T> {
-                T a;
-                Super(var a) : this.a = a;
-              }
-              class Class extends Super<String> {
-                Class.named(int a) : super(a);
-              }
-              '''),
-    check(r'''class Super<T> {
-                T a;
-                Super(T a) : this.a = a;
-              }
-              class Class extends Super<String> {
-                Class.named(int a) : super(a);
-              }
-              ''', NOT_ASSIGNABLE),
-
-    // Check instance creations.
-    check(r'''class Class {
-                var a;
-                Class(this.a);
-              }
-              method(int a) => new Class(a);
-              '''),
-    check(r'''class Class {
-                String a;
-                Class(this.a);
-              }
-              method(int a) => new Class(a);
-              ''', NOT_ASSIGNABLE),
-    check(r'''class Class {
-                String a;
-                Class(var a) : this.a = a;
-              }
-              method(int a) => new Class(a);
-              '''),
-    check(r'''class Class {
-                String a;
-                Class(String a) : this.a = a;
-              }
-              method(int a) => new Class(a);
-              ''', NOT_ASSIGNABLE),
-
-    // Check instance creations involving generics.
-    check(r'''class Class<T> {
-                var a;
-                Class(this.a);
-              }
-              method(int a) => new Class<String>(a);
-              '''),
-    check(r'''class Class<T> {
-                T a;
-                Class(this.a);
-              }
-              method(int a) => new Class<String>(a);
-              ''', NOT_ASSIGNABLE),
-    check(r'''class Class<T> {
-                T a;
-                Class(var a) : this.a = a;
-              }
-              method(int a) => new Class<String>(a);
-              '''),
-    check(r'''class Class<T> {
-                T a;
-                Class(String a) : this.a = a;
-              }
-              method(int a) => new Class<String>(a);
-              ''', NOT_ASSIGNABLE),
-  ]);
-}
-
-void testGetterSetterInvocation(MockCompiler compiler) {
-  compiler.parseScript(r'''int get variable => 0;
-                           void set variable(String s) {}
-
-                           class Class {
-                             int get instanceField => 0;
-                             void set instanceField(String s) {}
-
-                             static int get staticField => 0;
-                             static void set staticField(String s) {}
-
-                             int overriddenField;
-                             int get getterField => 0;
-                             void set setterField(int v) {}
-                           }
-
-                           class GetterClass extends Class {
-                             int get overriddenField => super.overriddenField;
-                             int get setterField => 0;
-                           }
-
-                           class SetterClass extends Class {
-                             void set overriddenField(int v) {}
-                             void set getterField(int v) {}
-                           }
-
-                           Class c;
-                           GetterClass gc;
-                           SetterClass sc;
-                           ''');
-
-  check(String text, [expectedWarnings]) {
-    analyze(compiler, '{ $text }', warnings: expectedWarnings);
-  }
-
-  check("variable = '';");
-  check("int v = variable;");
-  check("variable = 0;", NOT_ASSIGNABLE);
-  check("String v = variable;", NOT_ASSIGNABLE);
-  // num is not assignable to String (the type of the setter).
-  check("variable += 0;", NOT_ASSIGNABLE);
-  // String is not assignable to int (the argument type of the operator + on the
-  // getter) and num (the result type of the operation) is not assignable to
-  // String (the type of the setter).
-  check("variable += '';", [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-
-  check("c.instanceField = '';");
-  check("int v = c.instanceField;");
-  check("c.instanceField = 0;", NOT_ASSIGNABLE);
-  check("String v = c.instanceField;", NOT_ASSIGNABLE);
-
-  // num is not assignable to String (the type of the setter).
-  check("c.instanceField += 0;", NOT_ASSIGNABLE);
-  // String is not assignable to int (the argument type of the operator + on the
-  // getter) and num (the result type of the operation) is not assignable to
-  // String (the type of the setter).
-  check("c.instanceField += '';", [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-
-  check("Class.staticField = '';");
-  check("int v = Class.staticField;");
-  check("Class.staticField = 0;", NOT_ASSIGNABLE);
-  check("String v = Class.staticField;", NOT_ASSIGNABLE);
-
-  // num is not assignable to String (the type of the setter).
-  check("Class.staticField += 0;", NOT_ASSIGNABLE);
-  // String is not assignable to int (the argument type of the operator + on the
-  // getter) and num (the result type of the operation) is not assignable to
-  // String (the type of the setter).
-  check("Class.staticField += '';", [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-
-  check("int v = c.overriddenField;");
-  check("c.overriddenField = 0;");
-  check("int v = c.getterField;");
-  check("c.getterField = 0;", MessageKind.UNDEFINED_SETTER);
-  check("int v = c.setterField;",
-      MessageKind.UNDEFINED_INSTANCE_GETTER_BUT_SETTER);
-  check("c.setterField = 0;");
-
-  check("int v = gc.overriddenField;");
-  check("gc.overriddenField = 0;");
-  check("int v = gc.setterField;");
-  check("gc.setterField = 0;");
-  check("int v = gc.getterField;");
-  check("gc.getterField = 0;", MessageKind.UNDEFINED_SETTER);
-
-  check("int v = sc.overriddenField;");
-  check("sc.overriddenField = 0;");
-  check("int v = sc.getterField;");
-  check("sc.getterField = 0;");
-  check("int v = sc.setterField;",
-      MessageKind.UNDEFINED_INSTANCE_GETTER_BUT_SETTER);
-  check("sc.setterField = 0;");
-}
-
-testTypePromotionHints(MockCompiler compiler) {
-  compiler.parseScript(r'''class A {
-                             var a = "a";
-                           }
-                           class B extends A {
-                             var b = "b";
-                           }
-                           class C {
-                             var c = "c";
-                           }
-                           class D<T> {
-                             T d;
-                           }
-                           class E<T> extends D<T> {
-                             T e;
-                           }
-                           class F<S, U> extends E<S> {
-                             S f;
-                           }
-                           class G<V> extends F<V, V> {
-                             V g;
-                           }
-                           ''');
-
-  check(String text, {warnings, hints, infos}) {
-    analyze(compiler, '{ $text }',
-        warnings: warnings, hints: hints, infos: infos);
-  }
-
-  check(r'''
-            A a = new B();
-            if (a is C) {
-              var x = a.c;
-            }''',
-      warnings: [MessageKind.UNDEFINED_GETTER],
-      hints: [MessageKind.NOT_MORE_SPECIFIC_SUBTYPE],
-      infos: []);
-
-  check(r'''
-            A a = new B();
-            if (a is C) {
-              var x = '${a.c}${a.c}';
-            }''',
-      warnings: [MessageKind.UNDEFINED_GETTER, MessageKind.UNDEFINED_GETTER],
-      hints: [MessageKind.NOT_MORE_SPECIFIC_SUBTYPE],
-      infos: []);
-
-  check(r'''
-            A a = new B();
-            if (a is C) {
-              var x = '${a.d}${a.d}'; // Type promotion wouldn't help.
-            }''',
-      warnings: [MessageKind.UNDEFINED_GETTER, MessageKind.UNDEFINED_GETTER],
-      hints: [],
-      infos: []);
-
-  check('''
-           D<int> d = new E();
-           if (d is E) { // Suggest E<int>.
-             var x = d.e;
-           }''', warnings: [
-    MessageKind.UNDEFINED_GETTER
-  ], hints: [
-    checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
-        {'shownTypeSuggestion': 'E<int>'})
-  ], infos: []);
-
-  check('''
-           D<int> d = new F();
-           if (d is F) { // Suggest F<int, dynamic>.
-             var x = d.f;
-           }''', warnings: [
-    MessageKind.UNDEFINED_GETTER
-  ], hints: [
-    checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
-        {'shownTypeSuggestion': 'F<int, dynamic>'})
-  ], infos: []);
-
-  check('''
-           D<int> d = new G();
-           if (d is G) { // Suggest G<int>.
-             var x = d.f;
-           }''', warnings: [
-    MessageKind.UNDEFINED_GETTER
-  ], hints: [
-    checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
-        {'shownTypeSuggestion': 'G<int>'})
-  ], infos: []);
-
-  check('''
-           F<double, int> f = new G();
-           if (f is G) { // Cannot suggest a more specific type.
-             var x = f.g;
-           }''',
-      warnings: [MessageKind.UNDEFINED_GETTER],
-      hints: [MessageKind.NOT_MORE_SPECIFIC],
-      infos: []);
-
-  check('''
-           D<int> d = new E();
-           if (d is E) {
-             var x = d.f; // Type promotion wouldn't help.
-           }''',
-      warnings: [MessageKind.UNDEFINED_GETTER], hints: [], infos: []);
-
-  check('''
-           A a = new B();
-           if (a is B) {
-             a = null;
-             var x = a.b;
-           }''',
-      warnings: [MessageKind.UNDEFINED_GETTER],
-      hints: [MessageKind.POTENTIAL_MUTATION],
-      infos: [MessageKind.POTENTIAL_MUTATION_HERE]);
-
-  check('''
-           A a = new B();
-           if (a is B) {
-             a = null;
-             var x = a.c; // Type promotion wouldn't help.
-           }''',
-      warnings: [MessageKind.UNDEFINED_GETTER], hints: [], infos: []);
-
-  check('''
-           A a = new B();
-           local() { a = new A(); }
-           if (a is B) {
-             var x = a.b;
-           }''',
-      warnings: [MessageKind.UNDEFINED_GETTER],
-      hints: [MessageKind.POTENTIAL_MUTATION_IN_CLOSURE],
-      infos: [MessageKind.POTENTIAL_MUTATION_IN_CLOSURE_HERE]);
-
-  check('''
-           A a = new B();
-           local() { a = new A(); }
-           if (a is B) {
-             var x = a.c; // Type promotion wouldn't help.
-           }''',
-      warnings: [MessageKind.UNDEFINED_GETTER], hints: [], infos: []);
-
-  check('''
-           A a = new B();
-           if (a is B) {
-             var x = () => a;
-             var y = a.b;
-           }
-           a = new A();''', warnings: [
-    MessageKind.UNDEFINED_GETTER
-  ], hints: [
-    MessageKind.ACCESSED_IN_CLOSURE
-  ], infos: [
-    MessageKind.ACCESSED_IN_CLOSURE_HERE,
-    MessageKind.POTENTIAL_MUTATION_HERE
-  ]);
-
-  check('''
-           A a = new B();
-           if (a is B) {
-             var x = () => a;
-             var y = a.c; // Type promotion wouldn't help.
-           }
-           a = new A();''',
-      warnings: [MessageKind.UNDEFINED_GETTER], hints: [], infos: []);
-}
-
-void testCascade(MockCompiler compiler) {
-  compiler.parseScript(r'''typedef A AFunc();
-                           typedef Function FuncFunc();
-                           class A {
-                             A a;
-                             B b;
-                             C c;
-                             AFunc afunc() => null;
-                             FuncFunc funcfunc() => null;
-                             C operator [](_) => null;
-                             void operator []=(_, C c) {}
-                           }
-                           class B {
-                             B b;
-                             C c;
-                           }
-                           class C {
-                             C c;
-                             AFunc afunc() => null;
-                           }
-                           ''');
-
-  check(String text, {warnings, hints, infos}) {
-    analyze(compiler, '{ $text }',
-        warnings: warnings, hints: hints, infos: infos);
-  }
-
-  check('A a = new A()..a;');
-
-  check('A a = new A()..b;');
-
-  check('A a = new A()..a..b;');
-
-  check('A a = new A()..b..c..a;');
-
-  check('B b = new A()..a;', warnings: NOT_ASSIGNABLE);
-
-  check('B b = new A()..b;', warnings: NOT_ASSIGNABLE);
-
-  check('B b = new A().b;');
-
-  check('new A().b..b;');
-
-  check('new A().b..a;', warnings: UNDEFINED_GETTER);
-
-  check('B b = new A().b..c;');
-
-  check('C c = new A().b..c;', warnings: NOT_ASSIGNABLE);
-
-  check('A a = new A()..a = new A();');
-
-  check('A a = new A()..b = new B();');
-
-  check('B b = new A()..b = new B();', warnings: NOT_ASSIGNABLE);
-
-  check('A a = new A()..b = new A();', warnings: NOT_ASSIGNABLE);
-
-  check('AFunc a = new C().afunc();');
-
-  check('AFunc a = new C()..afunc();', warnings: NOT_ASSIGNABLE);
-
-  check('C c = new C()..afunc();');
-
-  check('A a = new C().afunc()();');
-
-  check('A a = new C()..afunc()();', warnings: NOT_ASSIGNABLE);
-
-  check('AFunc a = new C()..afunc()();', warnings: NOT_ASSIGNABLE);
-
-  check('FuncFunc f = new A().funcfunc();');
-
-  check('A a = new A().funcfunc();', warnings: NOT_ASSIGNABLE);
-
-  check('FuncFunc f = new A()..funcfunc();', warnings: NOT_ASSIGNABLE);
-
-  check('A a = new A()..funcfunc();');
-
-  check('FuncFunc f = new A()..funcfunc()();', warnings: NOT_ASSIGNABLE);
-
-  check('A a = new A()..funcfunc()();');
-
-  check('FuncFunc f = new A()..funcfunc()()();', warnings: NOT_ASSIGNABLE);
-
-  check('A a = new A()..funcfunc()()();');
-
-  check('''A a;
-           a = new A()..a = a = new A()..c.afunc();''');
-
-  check('''A a = new A()..b = new B()..c.afunc();''');
-
-  check('''A a = new A()..b = new A()..c.afunc();''', warnings: NOT_ASSIGNABLE);
-
-  check('''A a = new A()..b = new A()..c.afunc()();''',
-      warnings: NOT_ASSIGNABLE);
-
-  check('''A a = new A()..b = new A()..c.afunc()().b;''',
-      warnings: NOT_ASSIGNABLE);
-
-  check('A a = new A().afunc()()[0].afunc();', warnings: NOT_ASSIGNABLE);
-
-  check('C c = new A().afunc()()[0].afunc();', warnings: NOT_ASSIGNABLE);
-
-  check('AFunc a = new A().afunc()()[0].afunc();');
-
-  check('A a = new A()..afunc()()[0].afunc();');
-
-  check('C c = new A()..afunc()()[0].afunc();', warnings: NOT_ASSIGNABLE);
-
-  check('AFunc a = new A()..afunc()()[0].afunc();', warnings: NOT_ASSIGNABLE);
-
-  check('A a = new A().afunc()()[0]..afunc();', warnings: NOT_ASSIGNABLE);
-
-  check('C c = new A().afunc()()[0]..afunc();');
-
-  check('AFunc a = new A().afunc()()[0]..afunc();', warnings: NOT_ASSIGNABLE);
-
-  check('A a = new A()..afunc()()[0]..afunc();');
-
-  check('C c = new A()..afunc()()[0]..afunc();', warnings: NOT_ASSIGNABLE);
-
-  check('AFunc a = new A()..afunc()()[0]..afunc();', warnings: NOT_ASSIGNABLE);
-
-  check('new A()[0] = new A();', warnings: NOT_ASSIGNABLE);
-
-  check('new A()[0] = new C();');
-
-  check('new A().a[0] = new A();', warnings: NOT_ASSIGNABLE);
-
-  check('new A().a[0] = new C();');
-
-  check('new A()..a[0] = new A();', warnings: NOT_ASSIGNABLE);
-
-  check('new A()..a[0] = new C();');
-
-  check('new A()..afunc()()[0] = new A();', warnings: NOT_ASSIGNABLE);
-
-  check('new A()..afunc()()[0] = new C();');
-}
-
-testAwait(MockCompiler compiler) {
-  String script = """class Foo {
-                       void method() async {}
-                       Future<int> asyncInt() => new Future<int>.value(0);
-                       Foo self() => this;
-                     }""";
-  compiler.parseScript(script);
-  LibraryElement mainApp = compiler.mainApp;
-  ClassElement foo = mainApp.find("Foo");
-  foo.ensureResolved(compiler.resolution);
-  FunctionElement method = foo.lookupLocalMember('method');
-  analyzeIn(compiler, method, "{ await 0; }");
-  analyzeIn(compiler, method, "{ int i = await 0; }");
-  analyzeIn(compiler, method, "{ String s = await 0; }",
-      warnings: NOT_ASSIGNABLE);
-  analyzeIn(compiler, method, "{ await asyncInt(); }");
-  analyzeIn(compiler, method, "{ int i = await asyncInt(); }");
-  analyzeIn(compiler, method, "{ String s = await asyncInt(); }",
-      warnings: NOT_ASSIGNABLE);
-  analyzeIn(compiler, method, "{ Foo f = self(); }");
-  analyzeIn(compiler, method, "{ Foo f = await self(); }");
-  analyzeIn(compiler, method, "{ Foo f = await self().asyncInt(); }",
-      warnings: NOT_ASSIGNABLE);
-  analyzeIn(compiler, method, "{ int i = await self().asyncInt(); }");
-  analyzeIn(compiler, method, "{ String s = await self().asyncInt(); }",
-      warnings: NOT_ASSIGNABLE);
-}
-
-testAsyncReturn(MockCompiler compiler) {
-  Future check(String code, [expectedWarnings]) {
-    return analyzeTopLevel(code, expectedWarnings);
-  }
-
-  return Future.wait([
-    check("Future<int> foo() async { return; }"),
-    check("Future<int> foo() async { return null; }"),
-    check("Future<int> foo() async { return 0; }"),
-    check("Future<int> foo() async { return ''; }", NOT_ASSIGNABLE),
-    check("Future<int> foo() async { return new Future.value(); }"),
-    check("Future<int> foo() async { return new Future<int>.value(); }"),
-    check("Future<int> foo() async { return new Future<String>.value(); }",
-        NOT_ASSIGNABLE),
-    check("""
-          Future<int> foo() async { return new Future<Future<int>>.value(); }
-          """),
-    check("void foo() async { return; }"),
-    check("void foo() async { return 0; }", MessageKind.RETURN_VALUE_IN_VOID),
-    check("void foo() async { return new Future.value(); }",
-        MessageKind.RETURN_VALUE_IN_VOID),
-    check("int foo() async { return; }"),
-    check("int foo() async { return 0; }", NOT_ASSIGNABLE),
-    check(
-        "int foo() async { return new Future<int>.value(); }", NOT_ASSIGNABLE),
-    check("Future<int> foo() async => null;"),
-    check("Future<int> foo() async => 0;"),
-    check("Future<int> foo() async => '';", NOT_ASSIGNABLE),
-    check("Future<int> foo() async => new Future.value();"),
-    check("Future<int> foo() async => new Future<int>.value();"),
-    check("Future<int> foo() async => new Future<String>.value();",
-        NOT_ASSIGNABLE),
-    check("""
-    Future<int> foo() async => new Future<Future<int>>.value();
-    """),
-    check("void foo() async { return 0; }", MessageKind.RETURN_VALUE_IN_VOID),
-    check("void foo() async { return new Future.value(); }",
-        MessageKind.RETURN_VALUE_IN_VOID),
-    check("int foo() async => 0;", NOT_ASSIGNABLE),
-    check("int foo() async => new Future<int>.value();", NOT_ASSIGNABLE),
-    check("Iterable<int> foo() sync* { return; }"),
-    check("Stream<int> foo() async* { return; }"),
-  ]);
-}
-
-const CLASS_WITH_METHODS = '''
-typedef int String2Int(String s);
-
-int topLevelMethod(String s) {}
-
-class ClassWithMethods {
-  untypedNoArgumentMethod() {}
-  untypedOneArgumentMethod(argument) {}
-  untypedTwoArgumentMethod(argument1, argument2) {}
-
-  int intNoArgumentMethod() {}
-  int intOneArgumentMethod(int argument) {}
-  int intTwoArgumentMethod(int argument1, int argument2) {}
-
-  void intOneArgumentOneOptionalMethod(int a, [int b]) {}
-  void intTwoOptionalMethod([int a, int b]) {}
-  void intOneArgumentOneNamedMethod(int a, {int b}) {}
-  void intTwoNamedMethod({int a, int b}) {}
-
-  Function functionField;
-  var untypedField;
-  int intField;
-
-  static int staticMethod(String str) {}
-  int instanceMethod(String str) {}
-
-  void method() {}
-
-  String2Int string2int;
-}
-class I {
-  int intMethod();
-}
-class SubClass extends ClassWithMethods implements I {
-  void method() {}
-}
-class SubFunction implements Function {}''';
-
-String returnWithType(String type, expression) {
-  return "$type foo() { return $expression; }";
-}
-
-String arrowReturnWithType(String type, expression) {
-  return "$type foo() => $expression;";
-}
-
-Node parseExpression(String text) => parseBodyCode(
-    text,
-    (parser, token) =>
-        parser.parseExpression(parser.syntheticPreviousToken(token)).next);
-
-const Map<String, String> ALT_SOURCE = const <String, String>{
-  'num': r'''
-      abstract class num {
-        num operator +(num other);
-        num operator -(num other);
-        num operator *(num other);
-        num operator %(num other);
-        double operator /(num other);
-        int operator ~/(num other);
-        num operator -();
-        bool operator <(num other);
-        bool operator <=(num other);
-        bool operator >(num other);
-        bool operator >=(num other);
-      }
-      ''',
-  'int': r'''
-      abstract class int extends num {
-        int operator &(int other);
-        int operator |(int other);
-        int operator ^(int other);
-        int operator ~();
-        int operator <<(int shiftAmount);
-        int operator >>(int shiftAmount);
-        int operator -();
-      }
-      ''',
-  'String': r'''
-      class String implements Pattern {
-        String operator +(String other) => this;
-      }
-      ''',
-};
-
-Future setup(test(MockCompiler compiler)) {
-  MockCompiler compiler =
-      new MockCompiler.internal(coreSource: ALT_SOURCE, enableAsyncAwait: true);
-  return compiler.init("import 'dart:async';").then((_) => test(compiler));
-}
-
-ResolutionDartType analyzeType(MockCompiler compiler, String text) {
-  var node = parseExpression(text);
-  TypeCheckerVisitor visitor = new TypeCheckerVisitor(
-      compiler, new TreeElementMapping(null), compiler.resolution.types);
-  return visitor.analyze(node);
-}
-
-analyzeTopLevel(String text, [expectedWarnings]) {
-  if (expectedWarnings == null) expectedWarnings = [];
-  if (expectedWarnings is! List) expectedWarnings = [expectedWarnings];
-
-  MockCompiler compiler = new MockCompiler.internal(enableAsyncAwait: true);
-  compiler.diagnosticHandler = createHandler(compiler, text);
-
-  return compiler.init("import 'dart:async';").then((_) {
-    LibraryElement library = compiler.mainApp;
-
-    Link<Element> topLevelElements =
-        parseUnit(text, compiler, library).reverse();
-
-    ElementX element = null;
-    Node node;
-    TreeElements mapping;
-    // Resolve all declarations and members.
-    for (Link<Element> elements = topLevelElements;
-        !elements.isEmpty;
-        elements = elements.tail) {
-      element = elements.head;
-      if (element.isClass) {
-        ClassElementX classElement = element;
-        classElement.ensureResolved(compiler.resolution);
-        classElement.forEachLocalMember((Element e) {
-          if (!e.isSynthesized) {
-            element = e;
-            node = element.parseNode(compiler.parsingContext);
-            compiler.resolver.resolve(element);
-            mapping = element.treeElements;
-          }
-        });
-      } else {
-        node = element.parseNode(compiler.parsingContext);
-        compiler.resolver.resolve(element);
-        mapping = element.treeElements;
-      }
-    }
-    // Type check last class declaration or member.
-    TypeCheckerVisitor checker =
-        new TypeCheckerVisitor(compiler, mapping, compiler.resolution.types);
-    DiagnosticCollector collector = compiler.diagnosticCollector;
-    collector.clear();
-    checker.analyze(node, mustHaveType: false);
-    compareWarningKinds(text, expectedWarnings, collector.warnings);
-
-    compiler.diagnosticHandler = null;
-  });
-}
-
-/**
- * Analyze the statement [text] and check messages from the type checker.
- * [errors] and [warnings] can be either [:null:], a single [MessageKind] or
- * a list of [MessageKind]s. If [hints] and [infos] are [:null:] the
- * corresponding message kinds are ignored.
- */
-analyze(MockCompiler compiler, String text,
-    {errors, warnings, List hints, List infos, bool flushDeferred: false}) {
-  if (warnings == null) warnings = [];
-  if (warnings is! List) warnings = [warnings];
-  if (errors == null) errors = [];
-  if (errors is! List) errors = [errors];
-
-  compiler.diagnosticHandler = createHandler(compiler, text);
-
-  Token tokens = scan(text);
-  NodeListener listener =
-      new NodeListener(const ScannerOptions(), compiler.reporter, null);
-  Parser parser = new Parser(listener);
-  parser.parseStatement(parser.syntheticPreviousToken(tokens));
-  Node node = listener.popNode();
-  Element compilationUnit = new CompilationUnitElementX(
-      new Script(null, null, null), compiler.mainApp);
-  Element function = new MockElement(compilationUnit);
-  TreeElements elements = compiler.resolveNodeStatement(node, function);
-  compiler.enqueuer.resolution.emptyDeferredQueueForTesting();
-  TypeCheckerVisitor checker =
-      new TypeCheckerVisitor(compiler, elements, compiler.resolution.types);
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  collector.clear();
-  checker.analyze(node, mustHaveType: false);
-  if (flushDeferred) {
-    compiler.enqueuer.resolution.emptyDeferredQueueForTesting();
-  }
-  compareWarningKinds(text, warnings, collector.warnings);
-  compareWarningKinds(text, errors, collector.errors);
-  if (hints != null) compareWarningKinds(text, hints, collector.hints);
-  if (infos != null) compareWarningKinds(text, infos, collector.infos);
-  compiler.diagnosticHandler = null;
-}
-
-void generateOutput(MockCompiler compiler, String text) {
-  for (CollectedMessage message in compiler.diagnosticCollector.warnings) {
-    int begin = message.begin;
-    int end = message.end;
-    SourceFile sourceFile = new StringSourceFile.fromName('analysis', text);
-    print(
-        sourceFile.getLocationMessage(message.message.toString(), begin, end));
-  }
-}
-
-analyzeIn(MockCompiler compiler, FunctionElement element, String text,
-    {warnings, hints}) {
-  if (warnings == null) warnings = [];
-  if (warnings is! List) warnings = [warnings];
-  if (hints == null) hints = [];
-  if (hints is! List) hints = [hints];
-
-  compiler.resolver.resolve(element);
-  Token tokens = scan(text);
-  NodeListener listener =
-      new NodeListener(const ScannerOptions(), compiler.reporter, null);
-  Parser parser = new Parser(listener)
-    ..asyncState = element.asyncMarker.asyncParserState;
-  parser.parseStatement(parser.syntheticPreviousToken(tokens));
-  Node node = listener.popNode();
-  TreeElements elements = compiler.resolveNodeStatement(node, element);
-  TypeCheckerVisitor checker =
-      new TypeCheckerVisitor(compiler, elements, compiler.resolution.types);
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  collector.clear();
-  checker.analyze(node, mustHaveType: false);
-  generateOutput(compiler, text);
-  compareWarningKinds(text, warnings, collector.warnings);
-  compareWarningKinds(text, hints, collector.hints);
-}
diff --git a/tests/compiler/dart2js/old_frontend/type_equals_test.dart b/tests/compiler/dart2js/old_frontend/type_equals_test.dart
deleted file mode 100644
index f36b82e..0000000
--- a/tests/compiler/dart2js/old_frontend/type_equals_test.dart
+++ /dev/null
@@ -1,115 +0,0 @@
-// 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.
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import 'package:compiler/src/elements/resolution_types.dart';
-import "../compiler_helper.dart";
-
-test(compiler, String name1, String name2, {bool expect}) {
-  Expect.isTrue((expect != null), 'required parameter "expect" not given');
-  dynamic clazz = findElement(compiler, "Class");
-  clazz.ensureResolved(compiler.resolution);
-  dynamic element1 = clazz.buildScope().lookup(name1);
-  dynamic element2 = clazz.buildScope().lookup(name2);
-  Expect.isNotNull(element1);
-  Expect.isNotNull(element2);
-  Expect.equals(element1.kind, ElementKind.FUNCTION);
-  Expect.equals(element2.kind, ElementKind.FUNCTION);
-  element1.computeType(compiler.resolution);
-  element2.computeType(compiler.resolution);
-  FunctionSignature signature1 = element1.functionSignature;
-  FunctionSignature signature2 = element2.functionSignature;
-
-  // Function signatures are used to be to provide void types (only occurring as
-  // as return types) and (inlined) function types (only occurring as method
-  // parameter types).
-  //
-  // Only a single type is used from each signature. That is, it is not the
-  // intention to check the whole signatures against eachother.
-  ResolutionDartType type1;
-  ResolutionDartType type2;
-  if (signature1.requiredParameterCount == 0) {
-    // If parameters is empty, use return type.
-    type1 = signature1.type.returnType;
-  } else {
-    // Otherwise use the first argument type.
-    type1 = signature1.requiredParameters.first.type;
-  }
-  if (signature2.requiredParameterCount == 0) {
-    // If parameters is empty, use return type.
-    type2 = signature2.type.returnType;
-  } else {
-    // Otherwise use the first argument type.
-    type2 = signature2.requiredParameters.first.type;
-  }
-  if (expect) {
-    Expect.equals(type1, type2, "$type1 != $type2");
-  } else {
-    Expect.notEquals(type1, type2, "$type1 == $type2");
-  }
-}
-
-void main() {
-  var uri = new Uri(scheme: 'source');
-  var compiler = mockCompilerFor(r"""
-      typedef int Typedef1<X,Y>(String s1);
-      typedef void Typedef2<Z>(T t1, S s1);
-
-      class Class<T,S> {
-        void void1() {}
-        void void2() {}
-        void int1(int a) {}
-        void int2(int b) {}
-        void String1(String a) {}
-        void String2(String b) {}
-        void ListInt1(List<int> a) {}
-        void ListInt2(List<int> b) {}
-        void ListString1(List<String> a) {}
-        void ListString2(List<String> b) {}
-        void MapIntString1(Map<int,String> a) {}
-        void MapIntString2(Map<int,String> b) {}
-        void TypeVar1(T t1, S s1) {}
-        void TypeVar2(T t2, S s2) {}
-        void Function1a(int a(String s1)) {}
-        void Function2a(int b(String s2)) {}
-        void Function1b(void a(T t1, S s1)) {}
-        void Function2b(void b(T t2, S s2)) {}
-        void Typedef1a(Typedef1<int,String> a) {}
-        void Typedef2a(Typedef1<int,String> b) {}
-        void Typedef1b(Typedef2<T> a) {}
-        void Typedef2b(Typedef2<T> b) {}
-        void Typedef1c(Typedef2<S> a) {}
-        void Typedef2c(Typedef2<S> b) {}
-      }
-
-      void main() {}
-      """, uri, analyzeAll: true, analyzeOnly: true);
-  asyncTest(() => compiler.run(uri).then((_) {
-        test(compiler, "void1", "void2", expect: true);
-        test(compiler, "int1", "int2", expect: true);
-        test(compiler, "String1", "String2", expect: true);
-        test(compiler, "ListInt1", "ListInt2", expect: true);
-        test(compiler, "ListString1", "ListString2", expect: true);
-        test(compiler, "MapIntString1", "MapIntString2", expect: true);
-        test(compiler, "TypeVar1", "TypeVar2", expect: true);
-        test(compiler, "Function1a", "Function2a", expect: true);
-        test(compiler, "Function1b", "Function2b", expect: true);
-        test(compiler, "Typedef1a", "Typedef2a", expect: true);
-        test(compiler, "Typedef1b", "Typedef2b", expect: true);
-        test(compiler, "Typedef1c", "Typedef2c", expect: true);
-
-        test(compiler, "void1", "int1", expect: false);
-        test(compiler, "int1", "String1", expect: false);
-        test(compiler, "String1", "ListInt1", expect: false);
-        test(compiler, "ListInt1", "ListString1", expect: false);
-        test(compiler, "ListString1", "MapIntString1", expect: false);
-        test(compiler, "MapIntString1", "TypeVar1", expect: false);
-        test(compiler, "TypeVar1", "Function1a", expect: false);
-        test(compiler, "Function1a", "Function1b", expect: false);
-        test(compiler, "Function1b", "Typedef1a", expect: false);
-        test(compiler, "Typedef1a", "Typedef1b", expect: false);
-        test(compiler, "Typedef1b", "Typedef1c", expect: false);
-      }));
-}
diff --git a/tests/compiler/dart2js/old_frontend/type_order_test.dart b/tests/compiler/dart2js/old_frontend/type_order_test.dart
deleted file mode 100644
index be592dc..0000000
--- a/tests/compiler/dart2js/old_frontend/type_order_test.dart
+++ /dev/null
@@ -1,89 +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.
-
-library type_order_test;
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import '../type_test_helper.dart';
-import 'package:compiler/src/elements/resolution_types.dart';
-import "package:compiler/src/elements/elements.dart"
-    show ClassElement, TypedefElement;
-
-void main() {
-  asyncTest(() => TypeEnvironment.create(r"""
-      class A<AT, AS> {}
-      typedef BS B<BT, BS>(BT t);
-      class C<CT, CS> extends A<CS, CT> {}
-      class X {}
-      class Y {}
-      class Z {}
-      """).then((env) {
-        var types = <ResolutionDartType>[];
-        ResolutionDartType add(ResolutionDartType type) {
-          types.add(type);
-          return type;
-        }
-
-        ResolutionDartType dynamic_ = add(env['dynamic']);
-        ResolutionDartType void_ = add(env['void']);
-
-        ClassElement A = env.getElement('A');
-        TypedefElement B = env.getElement('B');
-        ClassElement C = env.getElement('C');
-        ResolutionDartType X = add(env['X']);
-        ResolutionDartType Y = add(env['Y']);
-        ResolutionDartType Z = add(env['Z']);
-
-        ResolutionInterfaceType A_this = add(A.thisType);
-        ResolutionInterfaceType A_raw = add(A.rawType);
-        ResolutionTypeVariableType AT = add(A_this.typeArguments[0]);
-        ResolutionTypeVariableType AS = add(A_this.typeArguments[1]);
-        ResolutionInterfaceType A_X_Y = add(instantiate(A, [X, Y]));
-        ResolutionInterfaceType A_Y_X = add(instantiate(A, [Y, X]));
-
-        ResolutionTypedefType B_this =
-            add(B.computeType(env.compiler.resolution));
-        ResolutionTypedefType B_raw = add(B.rawType);
-        ResolutionTypeVariableType BT = add(B_this.typeArguments[0]);
-        ResolutionTypeVariableType BS = add(B_this.typeArguments[1]);
-        ResolutionFunctionType B_this_alias = add(B.alias);
-        ResolutionTypedefType B_X_Y = add(instantiate(B, [X, Y]));
-        ResolutionFunctionType B_X_Y_alias = add(B_X_Y.unaliased);
-        ResolutionTypedefType B_Y_X = add(instantiate(B, [Y, X]));
-        ResolutionFunctionType B_Y_X_alias = add(B_Y_X.unaliased);
-
-        ResolutionInterfaceType C_this = add(C.thisType);
-        ResolutionInterfaceType C_raw = add(C.rawType);
-        ResolutionTypeVariableType CT = add(C_this.typeArguments[0]);
-        ResolutionTypeVariableType CS = add(C_this.typeArguments[1]);
-
-        Expect.listEquals(<ResolutionDartType>[
-          void_,
-          dynamic_,
-          A_raw,
-          A_this,
-          A_X_Y,
-          A_Y_X,
-          AT,
-          AS,
-          B_raw,
-          B_this,
-          B_X_Y,
-          B_Y_X,
-          BT,
-          BS,
-          C_raw,
-          C_this,
-          CT,
-          CS,
-          X,
-          Y,
-          Z,
-          B_this_alias,
-          B_Y_X_alias,
-          B_X_Y_alias,
-        ], Types.sorted(types));
-      }));
-}
diff --git a/tests/compiler/dart2js/old_frontend/type_promotion_test.dart b/tests/compiler/dart2js/old_frontend/type_promotion_test.dart
deleted file mode 100644
index c09089f..0000000
--- a/tests/compiler/dart2js/old_frontend/type_promotion_test.dart
+++ /dev/null
@@ -1,30 +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.
-
-// Test that dart2js produces the expected static type warnings for type
-// promotion language tests. This ensures that the analyzer and dart2js agrees
-// on these tests.
-
-import 'warnings_checker.dart';
-
-/// Map from test files to a map of their expected status. If the status map is
-/// `null` no warnings must be missing or unexpected, otherwise the status map
-/// can contain a list of line numbers for keys 'missing' and 'unexpected' for
-/// the warnings of each category.
-const Map<String, dynamic> TESTS = const {
-  'language/type_promotion_assign_test.dart': null,
-  'language/type_promotion_closure_test.dart': null,
-  'language/type_promotion_functions_test.dart': const {
-    'missing': const [65, 66, 67]
-  }, // Issue 14933.
-  'language/type_promotion_local_test.dart': null,
-  'language/type_promotion_logical_and_test.dart': null,
-  'language/type_promotion_more_specific_test.dart': null,
-  'language/type_promotion_multiple_test.dart': null,
-  'language/type_promotion_parameter_test.dart': null,
-};
-
-void main() {
-  checkWarnings(TESTS);
-}
diff --git a/tests/compiler/dart2js/old_frontend/type_variable_bound_test.dart b/tests/compiler/dart2js/old_frontend/type_variable_bound_test.dart
deleted file mode 100644
index e01e18e..0000000
--- a/tests/compiler/dart2js/old_frontend/type_variable_bound_test.dart
+++ /dev/null
@@ -1,282 +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.
-
-import 'dart:async';
-import "package:async_helper/async_helper.dart";
-import '../compiler_helper.dart';
-import "package:expect/expect.dart";
-
-Future compile(String source) {
-  Uri uri = Uri.parse('test:code');
-  var compiler = mockCompilerFor(source, uri,
-      analyzeOnly: true, enableTypeAssertions: true);
-  compiler.diagnosticHandler = createHandler(compiler, source);
-  return compiler.run(uri).then((_) {
-    return compiler;
-  });
-}
-
-Future test(String source, {var errors, var warnings}) async {
-  if (errors == null) errors = [];
-  if (errors is! List) errors = [errors];
-  if (warnings == null) warnings = [];
-  if (warnings is! List) warnings = [warnings];
-  var compiler = await compile(source);
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.equals(!errors.isEmpty, compiler.compilationFailed);
-  Expect.equals(
-      errors.length,
-      collector.errors.length,
-      'unexpected error count: ${collector.errors.length} '
-      'expected ${errors.length}');
-  Expect.equals(
-      warnings.length,
-      collector.warnings.length,
-      'unexpected warning count: ${collector.warnings.length} '
-      'expected ${warnings.length}');
-
-  for (int i = 0; i < errors.length; i++) {
-    Expect.equals(errors[i], collector.errors.elementAt(i).message.kind);
-  }
-  for (int i = 0; i < warnings.length; i++) {
-    Expect.equals(warnings[i], collector.warnings.elementAt(i).message.kind);
-  }
-}
-
-Future test1() async {
-  var compiler = await compile(r"""
-class A<T extends T> {}
-
-void main() {
-  new A();
-}
-""");
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isFalse(compiler.compilationFailed);
-  Expect.isTrue(
-      collector.errors.isEmpty, 'unexpected errors: ${collector.errors}');
-  Expect.equals(1, collector.warnings.length,
-      'expected exactly one warning, but got ${collector.warnings}');
-
-  print(collector.warnings.elementAt(0));
-  Expect.equals(MessageKind.CYCLIC_TYPE_VARIABLE,
-      collector.warnings.elementAt(0).message.kind);
-  Expect.equals("T",
-      collector.warnings.elementAt(0).message.arguments['typeVariableName']);
-}
-
-Future test2() async {
-  var compiler = await compile(r"""
-class B<T extends S, S extends T> {}
-
-void main() {
-  new B();
-}
-""");
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isFalse(compiler.compilationFailed);
-  print(collector.errors);
-  Expect.isTrue(collector.errors.isEmpty, 'unexpected errors');
-  Expect.equals(2, collector.warnings.length,
-      'expected exactly two errors, but got ${collector.warnings}');
-
-  Expect.equals(MessageKind.CYCLIC_TYPE_VARIABLE,
-      collector.warnings.elementAt(0).message.kind);
-  Expect.equals("T",
-      collector.warnings.elementAt(0).message.arguments['typeVariableName']);
-
-  Expect.equals(MessageKind.CYCLIC_TYPE_VARIABLE,
-      collector.warnings.elementAt(1).message.kind);
-  Expect.equals("S",
-      collector.warnings.elementAt(1).message.arguments['typeVariableName']);
-}
-
-Future test3() async {
-  var compiler = await compile(r"""
-class C<T extends S, S extends U, U extends T> {}
-
-void main() {
-  new C();
-}
-""");
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isFalse(compiler.compilationFailed);
-  print(collector.errors);
-  Expect.isTrue(collector.errors.isEmpty, 'unexpected errors');
-  Expect.equals(3, collector.warnings.length,
-      'expected exactly one error, but got ${collector.warnings}');
-
-  Expect.equals(MessageKind.CYCLIC_TYPE_VARIABLE,
-      collector.warnings.elementAt(0).message.kind);
-  Expect.equals("T",
-      collector.warnings.elementAt(0).message.arguments['typeVariableName']);
-
-  Expect.equals(MessageKind.CYCLIC_TYPE_VARIABLE,
-      collector.warnings.elementAt(1).message.kind);
-  Expect.equals("S",
-      collector.warnings.elementAt(1).message.arguments['typeVariableName']);
-
-  Expect.equals(MessageKind.CYCLIC_TYPE_VARIABLE,
-      collector.warnings.elementAt(2).message.kind);
-  Expect.equals("U",
-      collector.warnings.elementAt(2).message.arguments['typeVariableName']);
-}
-
-Future test4() async {
-  var compiler = await compile(r"""
-class D<T extends S, S extends U, U extends S> {}
-
-void main() {
-  new D();
-}
-""");
-  DiagnosticCollector collector = compiler.diagnosticCollector;
-  Expect.isFalse(compiler.compilationFailed);
-  print(collector.errors);
-  Expect.isTrue(collector.errors.isEmpty, 'unexpected errors');
-  Expect.equals(2, collector.warnings.length,
-      'expected exactly one error, but got ${collector.warnings}');
-
-  Expect.equals(MessageKind.CYCLIC_TYPE_VARIABLE,
-      collector.warnings.elementAt(0).message.kind);
-  Expect.equals("S",
-      collector.warnings.elementAt(0).message.arguments['typeVariableName']);
-
-  Expect.equals(MessageKind.CYCLIC_TYPE_VARIABLE,
-      collector.warnings.elementAt(1).message.kind);
-  Expect.equals("U",
-      collector.warnings.elementAt(1).message.arguments['typeVariableName']);
-}
-
-Future test5() {
-  return test(r"""
-class A<T extends num> {}
-
-void main() {
-  new A();
-  new A<num>();
-  new A<dynamic>();
-  new A<int>();
-  new A<double>();
-}
-""");
-}
-
-Future test6() {
-  return test(r"""
-class A<T extends num> {}
-
-void main() {
-  new A<String>();
-}
-""", warnings: MessageKind.INVALID_TYPE_VARIABLE_BOUND);
-}
-
-Future test7() {
-  return test(r"""
-class A<T extends num> {}
-class B<T> extends A<T> {} // Warning produced here.
-
-void main() {
-  new B(); // No warning produced here.
-  new B<String>(); // No warning produced here.
-}
-""", warnings: MessageKind.INVALID_TYPE_VARIABLE_BOUND);
-}
-
-Future test8() {
-  return test(r"""
-class B<T extends B<T>> {}
-class C<T extends B<T>> extends B<T> {}
-class D<T extends C<T>> extends C<T> {}
-class E<T extends E<T>> extends D<T> {}
-class F extends E<F> {}
-
-void main() {
-  new B();
-  new B<dynamic>();
-  new B<F>();
-  new B<B<F>>();
-  new C();
-  new C<dynamic>();
-  new C<B<F>>();
-  new D();
-  new D<dynamic>();
-  new D<C<F>>();
-  new E();
-  new E<dynamic>();
-  new E<E<F>>();
-  new F();
-}
-""");
-}
-
-Future test9() {
-  return test(r"""
-class B<T extends B<T>> {}
-class C<T extends B<T>> extends B<T> {}
-class D<T extends C<T>> extends C<T> {}
-class E<T extends E<T>> extends D<T> {}
-class F extends E<F> {}
-
-void main() {
-  new D<B<F>>(); // Warning: B<F> is not a subtype of C<T>.
-  new E<D<F>>(); // Warning: E<F> is not a subtype of E<T>.
-}
-""", warnings: [
-    MessageKind.INVALID_TYPE_VARIABLE_BOUND,
-    MessageKind.INVALID_TYPE_VARIABLE_BOUND
-  ]);
-}
-
-Future test10() {
-  return test(r"""
-class A {
-  const A();
-}
-class Test<T extends A> {
-  final T x = const A();
-  const Test();
-}
-main() {
-  print(const Test<A>());
-}
-""");
-}
-
-// TODO(het): The error is reported twice because both the Dart and JS constant
-// compilers are run on the const constructor, investigate why.
-Future test11() {
-  return test(r"""
-class A {
-  const A();
-}
-class B extends A {
-  const B();
-}
-class Test<T extends A> {
-  final T x = const A();
-  const Test();
-}
-main() {
-  print(const Test<B>());
-}
-""", errors: [MessageKind.NOT_ASSIGNABLE, MessageKind.NOT_ASSIGNABLE]);
-}
-
-main() {
-  asyncTest(() async {
-    await test1();
-    await test2();
-    await test3();
-    await test4();
-    await test5();
-    await test6();
-    await test7();
-    await test8();
-    await test9();
-    await test10();
-    await test11();
-  });
-}
diff --git a/tests/compiler/dart2js/old_frontend/type_variable_occurrence_test.dart b/tests/compiler/dart2js/old_frontend/type_variable_occurrence_test.dart
deleted file mode 100644
index ac88d12..0000000
--- a/tests/compiler/dart2js/old_frontend/type_variable_occurrence_test.dart
+++ /dev/null
@@ -1,130 +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.
-
-library type_variable_occurrence_test;
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/elements/elements.dart' show ClassElement;
-import 'package:compiler/src/elements/resolution_types.dart';
-import 'package:compiler/src/elements/types.dart';
-import 'package:expect/expect.dart';
-
-import '../type_test_helper.dart';
-
-void main() {
-  testTypeVariableOccurrence();
-}
-
-testTypeVariableOccurrence() {
-  asyncTest(() => TypeEnvironment.create(r"""
-      typedef S Typedef1<S>();
-      typedef void Typedef2<S>(S s);
-      typedef void Typedef3<S>(A<S> a);
-
-      class A<T> {
-        int field1;
-        T field2;
-        A<int> field3;
-        A<T> field4;
-        A<A<int>> field5;
-        A<A<T>> field6;
-
-        Typedef1 field7;
-        Typedef1<int> field8;
-        Typedef1<T> field9;
-        Typedef1<Typedef1<T>> field10;
-
-        Typedef2 field11;
-        Typedef2<int> field12;
-        Typedef2<T> field13;
-        Typedef2<Typedef1<T>> field14;
-
-        Typedef3 field15;
-        Typedef3<int> field16;
-        Typedef3<T> field17;
-        Typedef3<Typedef1<T>> field18;
-
-        void method1() {}
-        T method2() => null;
-        A<T> method3() => null;
-        void method4(T t) {}
-        void method5(A<T> t) {}
-        void method6(void foo(T t)) {}
-        void method7([T t]) {}
-        void method8({T t}) {}
-      }
-      """).then((env) {
-        ClassElement A = env.getElement('A');
-
-        expect(bool expectResult, String memberName) {
-          ResolutionDartType memberType = env.getMemberType(memberName, A);
-          ResolutionTypeVariableType typeVariable =
-              memberType.typeVariableOccurrence;
-          if (expectResult) {
-            Expect.isNotNull(typeVariable);
-            Expect.equals(A, DartTypes.getClassContext(memberType));
-          } else {
-            Expect.isNull(typeVariable);
-            Expect.isNull(DartTypes.getClassContext(memberType));
-          }
-        }
-
-        // int field1;
-        expect(false, 'field1');
-        // T field2;
-        expect(true, 'field2');
-        // A<int> field3;
-        expect(false, 'field3');
-        // A<T> field4;
-        expect(true, 'field4');
-        // A<A<int>> field5;
-        expect(false, 'field5');
-        // A<A<T>> field6;
-        expect(true, 'field6');
-
-        // Typedef1 field7;
-        expect(false, 'field7');
-        // Typedef1<int> field8;
-        expect(false, 'field8');
-        // Typedef1<T> field9;
-        expect(true, 'field9');
-        // Typedef1<Typedef1<T>> field10;
-        expect(true, 'field10');
-
-        // Typedef2 field11;
-        expect(false, 'field11');
-        // Typedef2<int> field12;
-        expect(false, 'field12');
-        // Typedef2<T> field13;
-        expect(true, 'field13');
-        // Typedef2<Typedef1<T>> field14;
-        expect(true, 'field14');
-
-        // Typedef3 field15;
-        expect(false, 'field15');
-        // Typedef3<int> field16;
-        expect(false, 'field16');
-        // Typedef3<T> field17;
-        expect(true, 'field17');
-        // Typedef3<Typedef1<T>> field18;
-        expect(true, 'field18');
-
-        // void method1() {}
-        expect(false, 'method1');
-        // T method2() => null;
-        expect(true, 'method2');
-        // A<T> method3() => null;
-        expect(true, 'method3');
-        // void method4(T t) {}
-        expect(true, 'method4');
-        // void method5(A<T> t) {}
-        expect(true, 'method5');
-        // void method6(void foo(T t)) {}
-        expect(true, 'method6');
-        // void method7([T t]);
-        expect(true, 'method7');
-        // void method8({T t});
-        expect(true, 'method8');
-      }));
-}
diff --git a/tests/compiler/dart2js/old_frontend/unparser2_test.dart b/tests/compiler/dart2js/old_frontend/unparser2_test.dart
deleted file mode 100644
index 458b6f3..0000000
--- a/tests/compiler/dart2js/old_frontend/unparser2_test.dart
+++ /dev/null
@@ -1,115 +0,0 @@
-// 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.
-
-import "package:expect/expect.dart";
-import "package:compiler/src/parser/element_listener.dart";
-import "package:compiler/src/parser/node_listener.dart";
-import "package:front_end/src/fasta/parser.dart";
-import "package:front_end/src/fasta/scanner.dart";
-import "package:compiler/src/tree/tree.dart";
-
-import "package:compiler/src/diagnostics/diagnostic_listener.dart";
-import "package:compiler/src/elements/elements.dart"
-    show CompilationUnitElement, LibraryElement;
-import "package:compiler/src/elements/modelx.dart"
-    show CompilationUnitElementX, LibraryElementX;
-import "package:compiler/src/script.dart";
-
-main() {
-  testClassDef();
-  testClass1Field();
-  testClass2Fields();
-  testClass1Field1Method();
-  testClass1Field2Method();
-  testClassDefTypeParam();
-  testEnumDef();
-  testEnum1Value();
-  testEnum2Value();
-  testEnum3Value();
-  testEnum3CommaValue();
-}
-
-testClassDef() {
-  compareCode('class T{}');
-}
-
-testClass1Field() {
-  compareCode('class T{var x;}');
-}
-
-testClass2Fields() {
-  compareCode('class T{var x;var y;}');
-}
-
-testClass1Field1Method() {
-  compareCode('class T{var x;m(){}}');
-}
-
-testClass1Field2Method() {
-  compareCode('class T{a(){}b(){}}');
-}
-
-testClassDefTypeParam() {
-  compareCode('class T<X>{}');
-}
-
-testEnumDef() {
-  compareCode('enum T {}');
-}
-
-testEnum1Value() {
-  compareCode('enum T {A}');
-}
-
-testEnum2Value() {
-  compareCode('enum T {A,B}');
-}
-
-testEnum3Value() {
-  compareCode('enum T {A,B,C}');
-}
-
-testEnum3CommaValue() {
-  compareCode('enum T {A,B,C,}', expectedResult: 'enum T {A,B,C}');
-}
-
-void compareCode(String code, {String expectedResult}) {
-  if (expectedResult == null) {
-    expectedResult = code;
-  }
-  Expect.equals(expectedResult, doUnparse(code));
-}
-
-String doUnparse(String source) {
-  MessageCollector diagnosticListener = new MessageCollector();
-  Script script = new Script(null, null, null);
-  LibraryElement lib = new LibraryElementX(script);
-  CompilationUnitElement element = new CompilationUnitElementX(script, lib);
-  StringScanner scanner = new StringScanner(source);
-  Token beginToken = scanner.tokenize();
-  NodeListener listener =
-      new NodeListener(const ScannerOptions(), diagnosticListener, element);
-  Parser parser = new Parser(listener);
-  parser.parseUnit(beginToken);
-  Node node = listener.popNode();
-  Expect.isTrue(listener.nodes.isEmpty);
-  return unparse(node);
-}
-
-class MessageCollector extends DiagnosticReporter {
-  List<String> messages;
-  MessageCollector() {
-    messages = [];
-  }
-  void internalError(node, covariant String reason) {
-    messages.add(reason);
-    throw reason;
-  }
-
-  void log(message) {
-    messages.add(message);
-  }
-
-  noSuchMethod(Invocation invocation) => throw 'unsupported operation';
-}
diff --git a/tests/compiler/dart2js/old_frontend/unparser_test.dart b/tests/compiler/dart2js/old_frontend/unparser_test.dart
deleted file mode 100644
index cd815c8..0000000
--- a/tests/compiler/dart2js/old_frontend/unparser_test.dart
+++ /dev/null
@@ -1,432 +0,0 @@
-// 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.
-
-import 'package:expect/expect.dart';
-import 'parser_helper.dart';
-import 'package:compiler/src/tree/tree.dart';
-
-testUnparse(String statement) {
-  Node node = parseStatement(statement);
-  Expect.equals(statement, unparse(node));
-}
-
-testUnparseMember(String member) {
-  Node node = parseMember(member);
-  Expect.equals(member, unparse(node));
-}
-
-testUnparseUnit(String code) {
-  Node node = fullParseUnit(code);
-  Expect.equals(code, unparse(node));
-}
-
-testUnparseTopLevelWithMetadata(String code) {
-  testUnparseUnit(code);
-  // TODO(ahe): Enable when supported.
-  // testUnparseUnit('@foo $code');
-}
-
-testSignedConstants() {
-  testUnparse('var x=-42;');
-  testUnparse('var x=-.42;');
-  testUnparse('var x=-0;');
-  testUnparse('var x=-0.0;');
-  testUnparse('var x=-.0;');
-}
-
-testGenericTypes() {
-  testUnparse('var x=new List<List<int>>();');
-  testUnparse('var x=new List<List<List<int>>>();');
-  testUnparse('var x=new List<List<List<List<int>>>>();');
-  testUnparse('var x=new List<List<List<List<List<int>>>>>();');
-}
-
-testForLoop() {
-  testUnparse('for(;i<100;i++ ){}');
-  testUnparse('for(i=0;i<100;i++ ){}');
-}
-
-testEmptyList() {
-  testUnparse('var x=[] ;');
-}
-
-testClosure() {
-  testUnparse('var x=(var x)=>x;');
-}
-
-testIndexedOperatorDecl() {
-  testUnparseMember('operator[](int i)=>null;');
-  testUnparseMember('operator[]=(int i,int j)=>null;');
-}
-
-testNativeMethods() {
-  testUnparseMember('foo()native;');
-  testUnparseMember('foo()native "bar";');
-  testUnparseMember('foo()native "this.x = 41";');
-}
-
-testPrefixIncrements() {
-  testUnparse(' ++i;');
-  testUnparse(' ++a[i];');
-  testUnparse(' ++a[ ++b[i]];');
-}
-
-testConstModifier() {
-  testUnparse('foo([var a=const[] ]){}');
-  testUnparse('foo([var a=const{}]){}');
-  testUnparse('foo(){var a=const[] ;var b=const{};}');
-  testUnparse('foo([var a=const[const{"a":const[1,2,3]}]]){}');
-}
-
-testSimpleObjectInstantiation() {
-  testUnparse('main(){new Object();}');
-}
-
-testLibraryName() {
-  testUnparseTopLevelWithMetadata('library com;');
-  testUnparseTopLevelWithMetadata('library com.example;');
-  testUnparseTopLevelWithMetadata('library com.example.dart;');
-}
-
-testImport() {
-  testUnparseTopLevelWithMetadata('import "søhest";');
-  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest;');
-}
-
-testExport() {
-  testUnparseTopLevelWithMetadata('export "søhest";');
-}
-
-testConditionalImport() {
-  testUnparseTopLevelWithMetadata('import "søhest" if(some.dotted.id)"other";');
-  testUnparseTopLevelWithMetadata('import "søhest" if(id=="some str")"other";');
-  testUnparseTopLevelWithMetadata('import "søhest"'
-      ' if(id=="some str")"other"'
-      ' if(id)"other2";');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" if(some.dotted.id)"other" as fiskehest;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" if(id=="some str")"other" as fiskehest;');
-  testUnparseTopLevelWithMetadata('import "søhest"'
-      ' if(id=="some str")"other"'
-      ' if(id)"other2"'
-      ' as fiskehest;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" if(some.dotted.id)"other" deferred as fiskehest;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" if(id=="some str")"other" deferred as fiskehest;');
-  testUnparseTopLevelWithMetadata('import "søhest"'
-      ' if(id=="some str")"other"'
-      ' if(id)"other2"'
-      ' deferred as fiskehest;');
-  testUnparseTopLevelWithMetadata('import "søhest"'
-      ' if(id=="some str")"other"'
-      ' if(id)"other2"'
-      ' deferred as fiskehest'
-      ' show foo,bar;');
-}
-
-testConditionalExport() {
-  testUnparseTopLevelWithMetadata('export "søhest" if(some.dotted.id)"other";');
-  testUnparseTopLevelWithMetadata('export "søhest" if(id=="some str")"other";');
-  testUnparseTopLevelWithMetadata('export "søhest"'
-      ' if(id=="some str")"other"'
-      ' if(id)"other2";');
-  testUnparseTopLevelWithMetadata('export "søhest"'
-      ' if(id=="some str")"other"'
-      ' if(id)"other2"'
-      ' show foo,bar;');
-}
-
-testPart() {
-  testUnparseTopLevelWithMetadata('part "søhest";');
-}
-
-testPartOf() {
-  testUnparseTopLevelWithMetadata('part of com;');
-  testUnparseTopLevelWithMetadata('part of com.example;');
-  testUnparseTopLevelWithMetadata('part of com.example.dart;');
-}
-
-testCombinators() {
-  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest show a;');
-  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest show hide;');
-  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest show show;');
-  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest show a,hide;');
-  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest show a,show;');
-
-  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest hide a;');
-  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest hide hide;');
-  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest hide show;');
-  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest hide a,hide;');
-  testUnparseTopLevelWithMetadata('import "søhest" as fiskehest hide a,show;');
-
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest show a hide a;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest show hide hide hide;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest show show hide show;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest show a,hide hide a,hide;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest show a,show hide a,show;');
-
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest hide a show a;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest hide hide show hide;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest hide show show show;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest hide a,hide show a,hide;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest hide a,show show a,show;');
-
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest show a show a;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest show hide show hide;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest show show show show;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest show a,hide show a,hide;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest show a,show show a,show;');
-
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest hide a hide a;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest hide hide hide hide;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest hide show hide show;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest hide a,hide hide a,hide;');
-  testUnparseTopLevelWithMetadata(
-      'import "søhest" as fiskehest hide a,show hide a,show;');
-
-  testUnparseTopLevelWithMetadata('export "søhest" show a;');
-  testUnparseTopLevelWithMetadata('export "søhest" show hide;');
-  testUnparseTopLevelWithMetadata('export "søhest" show show;');
-  testUnparseTopLevelWithMetadata('export "søhest" show a,hide;');
-  testUnparseTopLevelWithMetadata('export "søhest" show a,show;');
-
-  testUnparseTopLevelWithMetadata('export "søhest" hide a;');
-  testUnparseTopLevelWithMetadata('export "søhest" hide hide;');
-  testUnparseTopLevelWithMetadata('export "søhest" hide show;');
-  testUnparseTopLevelWithMetadata('export "søhest" hide a,hide;');
-  testUnparseTopLevelWithMetadata('export "søhest" hide a,show;');
-
-  testUnparseTopLevelWithMetadata('export "søhest" show a hide a;');
-  testUnparseTopLevelWithMetadata('export "søhest" show hide hide hide;');
-  testUnparseTopLevelWithMetadata('export "søhest" show show hide show;');
-  testUnparseTopLevelWithMetadata('export "søhest" show a,hide hide a,hide;');
-  testUnparseTopLevelWithMetadata('export "søhest" show a,show hide a,show;');
-
-  testUnparseTopLevelWithMetadata('export "søhest" hide a show a;');
-  testUnparseTopLevelWithMetadata('export "søhest" hide hide show hide;');
-  testUnparseTopLevelWithMetadata('export "søhest" hide show show show;');
-  testUnparseTopLevelWithMetadata('export "søhest" hide a,hide show a,hide;');
-  testUnparseTopLevelWithMetadata('export "søhest" hide a,show show a,show;');
-
-  testUnparseTopLevelWithMetadata('export "søhest" show a show a;');
-  testUnparseTopLevelWithMetadata('export "søhest" show hide show hide;');
-  testUnparseTopLevelWithMetadata('export "søhest" show show show show;');
-  testUnparseTopLevelWithMetadata('export "søhest" show a,hide show a,hide;');
-  testUnparseTopLevelWithMetadata('export "søhest" show a,show show a,show;');
-
-  testUnparseTopLevelWithMetadata('export "søhest" hide a hide a;');
-  testUnparseTopLevelWithMetadata('export "søhest" hide hide hide hide;');
-  testUnparseTopLevelWithMetadata('export "søhest" hide show hide show;');
-  testUnparseTopLevelWithMetadata('export "søhest" hide a,hide hide a,hide;');
-  testUnparseTopLevelWithMetadata('export "søhest" hide a,show hide a,show;');
-}
-
-testDeferredImport() {
-  testUnparseTopLevelWithMetadata('import "lib.dart" as a;');
-  testUnparseTopLevelWithMetadata('import "lib.dart" deferred as a;');
-  testUnparseTopLevelWithMetadata('import "lib.dart" deferred as a show b;');
-  testUnparseTopLevelWithMetadata('import "lib.dart" deferred as a hide b;');
-}
-
-testUnparseMemberAndAsMemberOfFoo(String code) {
-  testUnparseMember(code);
-  testUnparseTopLevelWithMetadata('class Foo{$code}');
-}
-
-testRedirectingFactoryConstructors() {
-  testUnparseMemberAndAsMemberOfFoo("factory Foo()=Bar;");
-  testUnparseMemberAndAsMemberOfFoo("factory Foo()=Bar.baz;");
-  testUnparseMemberAndAsMemberOfFoo("factory Foo()=Bar<T>;");
-  testUnparseMemberAndAsMemberOfFoo("factory Foo()=Bar<List<T>,T>;");
-  testUnparseMemberAndAsMemberOfFoo("factory Foo()=Bar<T>.baz;");
-  testUnparseMemberAndAsMemberOfFoo("factory Foo()=Bar<List<T>,T>.baz;");
-  testUnparseMemberAndAsMemberOfFoo("factory Foo()=prefix.Bar;");
-  testUnparseMemberAndAsMemberOfFoo("factory Foo()=prefix.Bar.baz;");
-  testUnparseMemberAndAsMemberOfFoo("factory Foo()=prefix.Bar<T>;");
-  testUnparseMemberAndAsMemberOfFoo("factory Foo()=prefix.Bar<List<T>,T>;");
-  testUnparseMemberAndAsMemberOfFoo("factory Foo()=prefix.Bar<T>.baz;");
-  testUnparseMemberAndAsMemberOfFoo("factory Foo()=prefix.Bar<List<T>,T>.baz;");
-  testUnparseMemberAndAsMemberOfFoo("const factory Foo()=Bar;");
-  testUnparseMemberAndAsMemberOfFoo("const factory Foo()=Bar.baz;");
-  testUnparseMemberAndAsMemberOfFoo("const factory Foo()=Bar<T>;");
-  testUnparseMemberAndAsMemberOfFoo("const factory Foo()=Bar<List<T>,T>;");
-  testUnparseMemberAndAsMemberOfFoo("const factory Foo()=Bar<T>.baz;");
-  testUnparseMemberAndAsMemberOfFoo("const factory Foo()=Bar<List<T>,T>.baz;");
-  testUnparseMemberAndAsMemberOfFoo("const factory Foo()=prefix.Bar;");
-  testUnparseMemberAndAsMemberOfFoo("const factory Foo()=prefix.Bar.baz;");
-  testUnparseMemberAndAsMemberOfFoo("const factory Foo()=prefix.Bar<T>;");
-  testUnparseMemberAndAsMemberOfFoo(
-      "const factory Foo()=prefix.Bar<List<T>,T>;");
-  testUnparseMemberAndAsMemberOfFoo("const factory Foo()=prefix.Bar<T>.baz;");
-  testUnparseMemberAndAsMemberOfFoo(
-      "const factory Foo()=prefix.Bar<List<T>,T>.baz;");
-  testUnparseMemberAndAsMemberOfFoo("external factory Foo()=Bar;");
-  testUnparseMemberAndAsMemberOfFoo("external factory Foo()=Bar.baz;");
-  testUnparseMemberAndAsMemberOfFoo("external factory Foo()=Bar<T>;");
-  testUnparseMemberAndAsMemberOfFoo("external factory Foo()=Bar<List<T>,T>;");
-  testUnparseMemberAndAsMemberOfFoo("external factory Foo()=Bar<T>.baz;");
-  testUnparseMemberAndAsMemberOfFoo(
-      "external factory Foo()=Bar<List<T>,T>.baz;");
-  testUnparseMemberAndAsMemberOfFoo("external factory Foo()=prefix.Bar;");
-  testUnparseMemberAndAsMemberOfFoo("external factory Foo()=prefix.Bar.baz;");
-  testUnparseMemberAndAsMemberOfFoo("external factory Foo()=prefix.Bar<T>;");
-  testUnparseMemberAndAsMemberOfFoo(
-      "external factory Foo()=prefix.Bar<List<T>,T>;");
-  testUnparseMemberAndAsMemberOfFoo(
-      "external factory Foo()=prefix.Bar<T>.baz;");
-  testUnparseMemberAndAsMemberOfFoo(
-      "external factory Foo()=prefix.Bar<List<T>,T>.baz;");
-  testUnparseMemberAndAsMemberOfFoo("external const factory Foo()=Bar;");
-  testUnparseMemberAndAsMemberOfFoo("external const factory Foo()=Bar.baz;");
-  testUnparseMemberAndAsMemberOfFoo("external const factory Foo()=Bar<T>;");
-  testUnparseMemberAndAsMemberOfFoo(
-      "external const factory Foo()=Bar<List<T>,T>;");
-  testUnparseMemberAndAsMemberOfFoo("external const factory Foo()=Bar<T>.baz;");
-  testUnparseMemberAndAsMemberOfFoo(
-      "external const factory Foo()=Bar<List<T>,T>.baz;");
-  testUnparseMemberAndAsMemberOfFoo("external const factory Foo()=prefix.Bar;");
-  testUnparseMemberAndAsMemberOfFoo(
-      "external const factory Foo()=prefix.Bar.baz;");
-  testUnparseMemberAndAsMemberOfFoo(
-      "external const factory Foo()=prefix.Bar<T>;");
-  testUnparseMemberAndAsMemberOfFoo(
-      "external const factory Foo()=prefix.Bar<List<T>,T>;");
-  testUnparseMemberAndAsMemberOfFoo(
-      "external const factory Foo()=prefix.Bar<T>.baz;");
-  testUnparseMemberAndAsMemberOfFoo(
-      "external const factory Foo()=prefix.Bar<List<T>,T>.baz;");
-}
-
-testClassDeclarations() {
-  testUnparseTopLevelWithMetadata('class Foo{}');
-  testUnparseTopLevelWithMetadata('abstract class Foo{}');
-  testUnparseTopLevelWithMetadata('class Fisk{operator-(x){}}');
-}
-
-testMixinApplications() {
-  testUnparseTopLevelWithMetadata('class C = S with M;');
-  testUnparseTopLevelWithMetadata('class C = S with M1,M2;');
-  testUnparseTopLevelWithMetadata('class C = S with M1,M2,M3;');
-
-  testUnparseTopLevelWithMetadata('class C<A> = S with M;');
-  testUnparseTopLevelWithMetadata('class C<A,B> = S with M;');
-
-  testUnparseTopLevelWithMetadata('class C = S<A> with M;');
-  testUnparseTopLevelWithMetadata('class C = S<A,B> with M;');
-
-  testUnparseTopLevelWithMetadata('class C = S with M<A>;');
-  testUnparseTopLevelWithMetadata('class C = S with M<A,B>;');
-  testUnparseTopLevelWithMetadata('class C = S with M1<A>,M2;');
-  testUnparseTopLevelWithMetadata('class C = S with M1,M2<A,B>;');
-
-  testUnparseTopLevelWithMetadata('abstract class C = S with M;');
-  testUnparseTopLevelWithMetadata('abstract class C<A> = S<A> with M<A>;');
-}
-
-testUnparseParameters(List<String> variableDeclarations) {
-  var sb = new StringBuffer();
-  sb.write('Constructor(');
-  int index = 0;
-  for (String variableDeclaration in variableDeclarations) {
-    if (index != 0) {
-      sb.write(', ');
-    }
-    sb.write(variableDeclaration);
-    index++;
-  }
-  sb.write(');');
-
-  FunctionExpression node = parseMember(sb.toString());
-  index = 0;
-  for (VariableDefinitions parameter in node.parameters.nodes) {
-    Expect.equals(variableDeclarations[index], unparse(parameter));
-    index++;
-  }
-}
-
-testParameters() {
-  testUnparseParameters(["foo", "bar=0", "int baz", "int boz=0"]);
-  testUnparseParameters(
-      ["this.foo", "this.bar=0", "int this.baz", "int this.boz=0"]);
-  testUnparseParameters(
-      ["foo()", "void bar()", "int baz(a)", "int boz(int a,int b)=null"]);
-  testUnparseParameters([
-    "this.foo()",
-    //"void this.bar()", // Commented out due to Issue 7852
-    //"int this.baz(a)", // Commented out due to Issue 7852
-    //"int this.boz(int a,int b)=null" // Commented out due to Issue 7852
-  ]);
-  testUnparseParameters(
-      ["@a foo", "@b @c bar=0", "@D(0) int baz", "@E([f],{g:h}) int boz=0"]);
-}
-
-testSymbolLiterals() {
-  testUnparse("#+;");
-  testUnparse("#-;");
-  testUnparse("#*;");
-  testUnparse("#/;");
-  testUnparse("#~/;");
-  testUnparse("#%;");
-  testUnparse("#<;");
-  testUnparse("#<=;");
-  testUnparse("#>;");
-  testUnparse("#>=;");
-  testUnparse("#==;");
-  testUnparse("#&;");
-  testUnparse("#|;");
-  testUnparse("#^;");
-
-  testUnparse("#a;");
-  testUnparse("#a.b;");
-  testUnparse("#a.b.c;");
-  testUnparse("#aa.bb.cc.dd;");
-}
-
-main() {
-  testSignedConstants();
-  testGenericTypes();
-  testForLoop();
-  testEmptyList();
-  testClosure();
-  testIndexedOperatorDecl();
-  testNativeMethods();
-  testPrefixIncrements();
-  testConstModifier();
-  testSimpleObjectInstantiation();
-  testLibraryName();
-  testImport();
-  testExport();
-  testConditionalImport();
-  testConditionalExport();
-  testPart();
-  testPartOf();
-  testCombinators();
-  testDeferredImport();
-  testRedirectingFactoryConstructors();
-  testClassDeclarations();
-  testMixinApplications();
-  testParameters();
-  testSymbolLiterals();
-}
diff --git a/tests/compiler/dart2js/old_frontend/warnings_checker.dart b/tests/compiler/dart2js/old_frontend/warnings_checker.dart
deleted file mode 100644
index 2bb7c4e..0000000
--- a/tests/compiler/dart2js/old_frontend/warnings_checker.dart
+++ /dev/null
@@ -1,85 +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.
-
-// Test that dart2js produces the expected static type warnings to ensures that
-// the analyzer and dart2js agrees on the tests.
-
-import 'dart:async';
-import 'dart:io';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import '../memory_compiler.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/filenames.dart';
-import 'package:compiler/src/io/source_file.dart';
-import 'package:compiler/src/source_file_provider.dart';
-import 'package:compiler/src/util/uri_extras.dart';
-import 'dart:convert';
-
-final _multiTestRegExpSeperator = new RegExp(r"//[#/]");
-
-void checkWarnings(Map<String, dynamic> tests, [List<String> arguments]) {
-  bool isWindows = Platform.isWindows;
-  bool warningsMismatch = false;
-  bool verbose = arguments != null && arguments.contains('-v');
-  asyncTest(() => Future.forEach(tests.keys, (String test) async {
-        Uri uri = Uri.base.resolve('tests/$test');
-        String source = utf8.decode(readAll(uriPathToNative(uri.path)));
-        SourceFile file = new StringSourceFile(
-            uri, relativize(currentDirectory, uri, isWindows), source);
-        Map<int, String> expectedWarnings = {};
-        int lineNo = 0;
-        for (String line in source.split('\n')) {
-          if (line.contains(_multiTestRegExpSeperator) &&
-              (line.contains('static type warning') ||
-                  line.contains('static warning'))) {
-            expectedWarnings[lineNo] = line;
-          }
-          lineNo++;
-        }
-        Set<int> unseenWarnings = new Set<int>.from(expectedWarnings.keys);
-        DiagnosticCollector collector = new DiagnosticCollector();
-        await runCompiler(
-            entryPoint: uri,
-            diagnosticHandler: collector,
-            options: [Flags.analyzeOnly, Flags.useOldFrontend],
-            showDiagnostics: verbose);
-        Map<String, List<int>> statusMap = tests[test];
-        // Line numbers with known unexpected warnings.
-        List<int> unexpectedStatus = [];
-        if (statusMap != null && statusMap.containsKey('unexpected')) {
-          unexpectedStatus = statusMap['unexpected'];
-        }
-        // Line numbers with known missing warnings.
-        List<int> missingStatus = [];
-        if (statusMap != null && statusMap.containsKey('missing')) {
-          missingStatus = statusMap['missing'];
-        }
-        for (CollectedMessage message in collector.warnings) {
-          Expect.equals(uri, message.uri);
-          int lineNo = file.getLocation(message.begin).line - 1;
-          if (expectedWarnings.containsKey(lineNo)) {
-            unseenWarnings.remove(lineNo);
-          } else if (!unexpectedStatus.contains(lineNo + 1)) {
-            warningsMismatch = true;
-            print(file.getLocationMessage(
-                'Unexpected warning: ${message.message}',
-                message.begin,
-                message.end));
-          }
-        }
-        if (!unseenWarnings.isEmpty) {
-          for (int lineNo in unseenWarnings) {
-            if (!missingStatus.contains(lineNo + 1)) {
-              warningsMismatch = true;
-              String line = expectedWarnings[lineNo];
-              print('$uri [${lineNo+1}]: Missing static type warning.');
-              print(line);
-            }
-          }
-        }
-      }).then((_) {
-        Expect.isFalse(warningsMismatch);
-      }));
-}
diff --git a/tests/compiler/dart2js/old_frontend/zero_termination_test.dart b/tests/compiler/dart2js/old_frontend/zero_termination_test.dart
deleted file mode 100644
index 0165af1..0000000
--- a/tests/compiler/dart2js/old_frontend/zero_termination_test.dart
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright (c) 2015, 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.
-
-// A regression test for issue 22667.
-//
-// Makes sure that we don't print a '\0' character for files that are not
-// properly new-line terminated.
-library zero_termination_test;
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:expect/expect.dart';
-import 'package:path/path.dart' as path;
-
-import '../end_to_end/launch_helper.dart' show launchDart2Js;
-
-Uri pathOfData = Platform.script;
-Directory tempDir;
-String outFilePath;
-
-_sendNotFound(HttpResponse response) {
-  response.statusCode = HttpStatus.NOT_FOUND;
-  response.close();
-}
-
-Future handleRequest(HttpRequest request) {
-  final String path = request.uri.path.substring(1);
-  final Uri requestPath = pathOfData.resolve(path);
-  final File file = new File(requestPath.toFilePath());
-  return file.exists().then((bool found) {
-    if (found) {
-      file.openRead().pipe(request.response).catchError((e) {
-        _sendNotFound(request.response);
-      });
-    } else {
-      _sendNotFound(request.response);
-    }
-  });
-}
-
-void cleanup() {
-  File outFile = new File(outFilePath);
-  if (outFile.existsSync()) {
-    outFile.deleteSync();
-  }
-}
-
-void check(ProcessResult result) {
-  Expect.notEquals(0, result.exitCode);
-  List<int> stdout = result.stdout;
-  String stdoutString = utf8.decode(stdout);
-  Expect.isTrue(stdoutString.contains("Error"), "stdout:\n$stdoutString");
-  // Make sure the "499" from the last line is in the output.
-  Expect.isTrue(stdoutString.contains("499"), "stdout:\n$stdoutString");
-
-  // Make sure that the output does not contain any 0 character.
-  Expect.isFalse(stdout.contains(0));
-}
-
-Future testFile() async {
-  String inFilePath =
-      pathOfData.resolve('data/one_line_dart_program.dart').path;
-  List<String> args = [
-    inFilePath,
-    "--out=" + outFilePath,
-    Flags.useOldFrontend
-  ];
-  await cleanup();
-  check(await launchDart2Js(args, noStdoutEncoding: true));
-  await cleanup();
-}
-
-Future serverRunning(HttpServer server) async {
-  int port = server.port;
-  String inFilePath = "http://127.0.0.1:$port/data/one_line_dart_program.dart";
-  List<String> args = [
-    inFilePath,
-    "--out=" + outFilePath,
-    Flags.useOldFrontend
-  ];
-
-  server.listen(handleRequest);
-  try {
-    await cleanup();
-    check(await launchDart2Js(args, noStdoutEncoding: true));
-  } finally {
-    await server.close();
-    await cleanup();
-  }
-}
-
-Future testHttp() {
-  return HttpServer
-      .bind(InternetAddress.LOOPBACK_IP_V4, 0)
-      .then((HttpServer server) => serverRunning(server));
-}
-
-runTests() async {
-  tempDir = Directory.systemTemp.createTempSync('directory_test');
-  outFilePath = path.join(tempDir.path, "out.js");
-
-  try {
-    await testFile();
-    await testHttp();
-  } finally {
-    await tempDir.delete(recursive: true);
-  }
-}
-
-main() {
-  asyncTest(() async {
-    await runTests();
-  });
-}
diff --git a/tests/compiler/dart2js/output_type_test.dart b/tests/compiler/dart2js/output_type_test.dart
index ae79f4e..4217edc 100644
--- a/tests/compiler/dart2js/output_type_test.dart
+++ b/tests/compiler/dart2js/output_type_test.dart
@@ -37,12 +37,9 @@
 CompileFunc oldCompileFunc;
 
 Future<Null> test(List<String> arguments, List<String> expectedOutput,
-    {List<String> groupOutputs: const <String>[], bool useKernel}) async {
+    {List<String> groupOutputs: const <String>[]}) async {
   List<String> options = new List<String>.from(arguments)
     ..add("--library-root=${Uri.base.resolve('sdk/')}");
-  if (!useKernel) {
-    options.add(Flags.useOldFrontend);
-  }
   print('--------------------------------------------------------------------');
   print('dart2js ${options.join(' ')}');
   TestRandomAccessFileOutputProvider outputProvider;
@@ -75,7 +72,7 @@
   enableWriteString = false;
   oldCompileFunc = compileFunc;
 
-  runTests({bool useKernel}) async {
+  runTests() async {
     PRINT_GRAPH = true;
     TRACE_FILTER_PATTERN_FOR_TEST = 'x';
     await test([
@@ -91,7 +88,7 @@
       'dart.cfg', // From TRACE_FILTER_PATTERN_FOR_TEST
     ], groupOutputs: [
       '.dot', // From PRINT_GRAPH
-    ], useKernel: useKernel);
+    ]);
 
     PRINT_GRAPH = false;
     TRACE_FILTER_PATTERN_FOR_TEST = null;
@@ -102,26 +99,17 @@
       'out.js_1.part.js',
       'out.js_1.part.js.map',
     ];
-    if (!useKernel) {
-      // Option --use-multi-source-info is only supported for the old frontend.
-      expectedOutput.add('out.js.map.v2');
-      expectedOutput.add('out.js_1.part.js.map.v2');
-      additionOptionals.add(Flags.useMultiSourceInfo);
-    }
 
     await test(
         [
           'tests/compiler/dart2js/deferred/data/deferred_helper.dart',
           Flags.useContentSecurityPolicy,
         ]..addAll(additionOptionals),
-        expectedOutput,
-        useKernel: useKernel);
+        expectedOutput);
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/path with spaces/file with spaces.dart b/tests/compiler/dart2js/path with spaces/file with spaces.dart
deleted file mode 100644
index b0cc204..0000000
--- a/tests/compiler/dart2js/path with spaces/file with spaces.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'library space/lib with spaces.dart';
-
-main() {
-  if (foo() != 499) throw "bad value";
-}
diff --git a/tests/compiler/dart2js/path with spaces/library space/lib with spaces.dart b/tests/compiler/dart2js/path with spaces/library space/lib with spaces.dart
deleted file mode 100644
index 16da6e3..0000000
--- a/tests/compiler/dart2js/path with spaces/library space/lib with spaces.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library spaces;
-
-part "part space/part space.dart";
-
-foo() => bar();
diff --git a/tests/compiler/dart2js/path with spaces/library space/part space/part space.dart b/tests/compiler/dart2js/path with spaces/library space/part space/part space.dart
deleted file mode 100644
index 58aff0f..0000000
--- a/tests/compiler/dart2js/path with spaces/library space/part space/part space.dart
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of spaces;
-
-bar() => 499;
diff --git a/tests/compiler/dart2js/quarantined/http_launch_data/http_launch_main.dart b/tests/compiler/dart2js/quarantined/http_launch_data/http_launch_main.dart
deleted file mode 100644
index b2359a9..0000000
--- a/tests/compiler/dart2js/quarantined/http_launch_data/http_launch_main.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'lib1.dart';
-
-main() {
-  print(foo());
-}
diff --git a/tests/compiler/dart2js/quarantined/http_launch_data/http_launch_main_package.dart b/tests/compiler/dart2js/quarantined/http_launch_data/http_launch_main_package.dart
deleted file mode 100644
index 03ffa18..0000000
--- a/tests/compiler/dart2js/quarantined/http_launch_data/http_launch_main_package.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// ignore: URI_DOES_NOT_EXIST
-import 'package:simple/simple.dart';
-
-main() {
-  // ignore: UNDEFINED_FUNCTION
-  print(foo());
-}
diff --git a/tests/compiler/dart2js/quarantined/http_launch_data/lib1.dart b/tests/compiler/dart2js/quarantined/http_launch_data/lib1.dart
deleted file mode 100644
index 7e4ab7e..0000000
--- a/tests/compiler/dart2js/quarantined/http_launch_data/lib1.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-foo() => "hello http tester";
diff --git a/tests/compiler/dart2js/quarantined/http_launch_data/packages/simple/simple.dart b/tests/compiler/dart2js/quarantined/http_launch_data/packages/simple/simple.dart
deleted file mode 100644
index 7e4ab7e..0000000
--- a/tests/compiler/dart2js/quarantined/http_launch_data/packages/simple/simple.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-foo() => "hello http tester";
diff --git a/tests/compiler/dart2js/quarantined/http_launch_data/pkcert/README b/tests/compiler/dart2js/quarantined/http_launch_data/pkcert/README
deleted file mode 100644
index fe764a9..0000000
--- a/tests/compiler/dart2js/quarantined/http_launch_data/pkcert/README
+++ /dev/null
@@ -1,16 +0,0 @@
-This is a certificate database used by Dart for testing purposes.
-
-It is created as a certificate database by NSS (Network Security Services),
-a library from Mozilla, using the certutil tool.  It uses a cert9.db file,
-rather than a cert8.db file, so the database directory must be specified with
-"sql:" in front of the directory path, or the environment variable
-NSS_DEFAULT_DB_TYPE must be set to "sql".
-
-The password for the key database is "dartdart".
-
-The database contains a root certificate from Equifax, used to verify the
-client https connection to www.google.dk.  It contains a self-signed
-certificate for a local certificate authority myauthority_cert, and a
-server certificate for localhost called localhost_cert, signed by
-myauthority_cert.  It contains the key for localhost_cert, but
-not the key for myauthority_cert.
diff --git a/tests/compiler/dart2js/quarantined/http_launch_data/pkcert/cert9.db b/tests/compiler/dart2js/quarantined/http_launch_data/pkcert/cert9.db
deleted file mode 100644
index 497fca6..0000000
--- a/tests/compiler/dart2js/quarantined/http_launch_data/pkcert/cert9.db
+++ /dev/null
Binary files differ
diff --git a/tests/compiler/dart2js/quarantined/http_launch_data/pkcert/key4.db b/tests/compiler/dart2js/quarantined/http_launch_data/pkcert/key4.db
deleted file mode 100644
index fc06432..0000000
--- a/tests/compiler/dart2js/quarantined/http_launch_data/pkcert/key4.db
+++ /dev/null
Binary files differ
diff --git a/tests/compiler/dart2js/quarantined/http_test.dart b/tests/compiler/dart2js/quarantined/http_test.dart
deleted file mode 100644
index 309fc5f..0000000
--- a/tests/compiler/dart2js/quarantined/http_test.dart
+++ /dev/null
@@ -1,186 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// Test:
-//   *) Compiling a script fetched over HTTP.
-//   *) Importing a library fetched over HTTP.
-//   *) Automatically resolving package_root when script is fetched over HTTP.
-
-library http_launch_test;
-
-import 'dart:async';
-import 'dart:io';
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'package:path/path.dart' as path;
-
-import '../end_to_end/launch_helper.dart' show launchDart2Js;
-
-Uri pathOfData = Platform.script.resolve('http_launch_data/');
-Directory tempDir;
-String outFilePath;
-
-_sendNotFound(HttpResponse response) {
-  response.statusCode = HttpStatus.NOT_FOUND;
-  response.close();
-}
-
-Future handleRequest(HttpRequest request) {
-  final String path = request.uri.path.substring(1);
-  final Uri requestPath = pathOfData.resolve(path);
-  final File file = new File(requestPath.toFilePath());
-  return file.exists().then((bool found) {
-    if (found) {
-      file.openRead().pipe(request.response).catchError((e) {
-        _sendNotFound(request.response);
-      });
-    } else {
-      _sendNotFound(request.response);
-    }
-  });
-}
-
-void check(ProcessResult result) {
-  Expect.equals(0, result.exitCode);
-  File outFile = new File(outFilePath);
-  Expect.isTrue(outFile.existsSync());
-  Expect.isTrue(outFile.readAsStringSync().contains("hello http tester"));
-}
-
-void checkNotFound(ProcessResult result, String filename) {
-  Expect.notEquals(0, result.exitCode);
-  Expect.isTrue(result.stdout.contains("404"));
-  Expect.isTrue(result.stdout.contains(filename));
-}
-
-cleanup() {
-  File outFile = new File(outFilePath);
-  if (outFile.existsSync()) {
-    outFile.deleteSync();
-  }
-}
-
-Future testNonHttp() {
-  String inFilePath = pathOfData.resolve('http_launch_main.dart').toFilePath();
-  List<String> args = [inFilePath, "--out=" + outFilePath];
-  return launchDart2Js(args).then(check).then((_) {
-    cleanup();
-  });
-}
-
-Future testHttpMain(String serverUrl) {
-  String inFilePath = '$serverUrl/http_launch_main.dart';
-  List<String> args = [inFilePath, "--out=" + outFilePath];
-  return launchDart2Js(args).then(check).then((_) {
-    cleanup();
-  });
-}
-
-Future testHttpLib(String serverUrl) {
-  File file = new File(path.join(tempDir.path, "in.dart"));
-  file.writeAsStringSync("""
-  import '$serverUrl/lib1.dart';
-  main() { print(foo()); }
-  """);
-  String inFilePath = file.path;
-  List<String> args = [inFilePath, "--out=" + outFilePath];
-  return launchDart2Js(args)
-      .then(check)
-      .whenComplete(file.deleteSync)
-      .then((_) {
-    cleanup();
-  });
-}
-
-Future testHttpPackage(String serverUrl) {
-  String inFilePath =
-      pathOfData.resolve('http_launch_main_package.dart').toFilePath();
-  String packageRoot = '$serverUrl/packages/';
-  List<String> args = [
-    inFilePath,
-    "--out=" + outFilePath,
-    "--package-root=" + packageRoot
-  ];
-  return launchDart2Js(args).then(check).then((_) {
-    cleanup();
-  });
-}
-
-Future testBadHttp(String serverUrl) {
-  File file = new File(path.join(tempDir.path, "in_bad.dart"));
-  file.writeAsStringSync("""
-  import '$serverUrl/not_existing.dart';
-  main() { print(foo()); }
-  """);
-  String inFilePath = file.path;
-  List<String> args = [inFilePath, "--out=" + outFilePath];
-  return launchDart2Js(args)
-      .then((pr) => checkNotFound(pr, "not_existing.dart"))
-      .whenComplete(file.deleteSync)
-      .then((_) {
-    cleanup();
-  });
-}
-
-Future testBadHttp2(String serverUrl) {
-  String inFilePath = '$serverUrl/not_found.dart';
-  List<String> args = [inFilePath, "--out=" + outFilePath];
-  return launchDart2Js(args)
-      .then((processResult) => checkNotFound(processResult, "not_found.dart"))
-      .then((_) {
-    cleanup();
-  });
-}
-
-serverRunning(HttpServer server, String scheme) {
-  tempDir = Directory.systemTemp.createTempSync('directory_test');
-  outFilePath = path.join(tempDir.path, "out.js");
-  int port = server.port;
-  String serverUrl = "$scheme://127.0.0.1:$port";
-
-  asyncStart();
-  server.listen(handleRequest);
-  return new Future.value()
-      .then((_) => cleanup()) // Make sure we start fresh.
-      .then((_) => testNonHttp())
-      .then((_) => testHttpMain(serverUrl))
-      .then((_) => testHttpLib(serverUrl))
-      .then((_) => testHttpPackage(serverUrl))
-      .then((_) => testBadHttp(serverUrl))
-      .then((_) => testBadHttp2(serverUrl))
-      .whenComplete(() => tempDir.delete(recursive: true))
-      .whenComplete(server.close)
-      .then((_) => asyncEnd());
-}
-
-Future testHttp() {
-  return HttpServer
-      .bind(InternetAddress.LOOPBACK_IP_V4, 0)
-      .then((HttpServer server) => serverRunning(server, "http"));
-}
-
-void initializeSSL() {
-  Uri pathOfPkcert = pathOfData.resolve('pkcert');
-  String testPkcertDatabase = pathOfPkcert.toFilePath();
-  // Issue 29926.
-  // ignore: UNDEFINED_METHOD
-  SecureSocket.initialize(database: testPkcertDatabase, password: 'dartdart');
-}
-
-Future testHttps() {
-  initializeSSL();
-  return HttpServer
-      // Issue 29926.
-      // ignore: NOT_ENOUGH_REQUIRED_ARGUMENTS
-      .bindSecure(InternetAddress.LOOPBACK_IP_V4, 0,
-          // Issue 29926.
-          // ignore: UNDEFINED_NAMED_PARAMETER
-          certificateName: 'localhost_cert')
-      .then((HttpServer server) => serverRunning(server, "https"));
-}
-
-main() {
-  asyncStart();
-  testHttp().then((_) => testHttps).whenComplete(asyncEnd);
-}
diff --git a/tests/compiler/dart2js/receiver_type_test.dart b/tests/compiler/dart2js/receiver_type_test.dart
index 711633f..da0a7a2 100644
--- a/tests/compiler/dart2js/receiver_type_test.dart
+++ b/tests/compiler/dart2js/receiver_type_test.dart
@@ -13,14 +13,12 @@
 
 main() {
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(CompileMode.memory);
     print('--test from kernel------------------------------------------------');
-    await runTest(CompileMode.kernel);
+    await runTest();
   });
 }
 
-Future runTest(CompileMode mode) async {
+Future runTest() async {
   var env = await TypeEnvironment.create("""
     class A {
       call() {}
@@ -38,7 +36,7 @@
       localFunction() {}
       () {};
     }
-    """, compileMode: mode, testBackendWorld: true);
+    """, testBackendWorld: true);
 
   Map<String, String> expectedMap = const {
     'A': '[exact=A]',
diff --git a/tests/compiler/dart2js/rti/backend_type_helper_test.dart b/tests/compiler/dart2js/rti/backend_type_helper_test.dart
index 9c72330..2549436 100644
--- a/tests/compiler/dart2js/rti/backend_type_helper_test.dart
+++ b/tests/compiler/dart2js/rti/backend_type_helper_test.dart
@@ -5,7 +5,6 @@
 import 'dart:io';
 
 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/entities.dart';
 import 'package:compiler/src/js_emitter/program_builder/program_builder.dart';
@@ -15,10 +14,9 @@
 import '../memory_compiler.dart';
 
 main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     CompilationResult result = await runCompiler(
-        entryPoint: Platform.script.resolve('data/subtype_named_args.dart'),
-        options: useKernel ? [] : [Flags.useOldFrontend]);
+        entryPoint: Platform.script.resolve('data/subtype_named_args.dart'));
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
     ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
@@ -35,9 +33,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/rti/disable_rti_test.dart b/tests/compiler/dart2js/rti/disable_rti_test.dart
index 67b3e3d..c420f57 100644
--- a/tests/compiler/dart2js/rti/disable_rti_test.dart
+++ b/tests/compiler/dart2js/rti/disable_rti_test.dart
@@ -56,11 +56,10 @@
 };
 
 main() {
-  runTest({bool useKernel}) async {
+  runTest() async {
     CompilationResult result = await runCompiler(
         memorySourceFiles: {'main.dart': code},
-        options: [Flags.disableRtiOptimization, Flags.disableInlining]
-          ..addAll(useKernel ? [] : [Flags.useOldFrontend]));
+        options: [Flags.disableRtiOptimization, Flags.disableInlining]);
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
     ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
@@ -100,9 +99,7 @@
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTest(useKernel: true);
+    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/rti/type_representation_test.dart b/tests/compiler/dart2js/rti/type_representation_test.dart
index 80647d9..167ab47 100644
--- a/tests/compiler/dart2js/rti/type_representation_test.dart
+++ b/tests/compiler/dart2js/rti/type_representation_test.dart
@@ -24,17 +24,15 @@
 
 void main() {
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await testAll(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await testAll(useKernel: true);
+    await testAll();
     print('--test from kernel (strong)---------------------------------------');
-    await testAll(useKernel: true, strongMode: true);
+    await testAll(strongMode: true);
   });
 }
 
-testAll({bool useKernel, bool strongMode: false}) async {
-  await testTypeRepresentations(useKernel: useKernel, strongMode: strongMode);
+testAll({bool strongMode: false}) async {
+  await testTypeRepresentations(strongMode: strongMode);
 }
 
 List<FunctionTypeData> signatures = const <FunctionTypeData>[
@@ -55,7 +53,7 @@
       "<T extends num, S>(FutureOr<T> a, S b, List<void> c)"),
 ];
 
-testTypeRepresentations({bool useKernel, bool strongMode}) async {
+testTypeRepresentations({bool strongMode}) async {
   String source = '''
 import 'dart:async';
 
@@ -69,9 +67,7 @@
 ''';
   CompilationResult result = await runCompiler(
       memorySourceFiles: {'main.dart': source},
-      options: useKernel
-          ? (strongMode ? [Flags.strongMode] : [])
-          : [Flags.useOldFrontend]);
+      options: strongMode ? [Flags.strongMode] : []);
   Expect.isTrue(result.isSuccess);
   Compiler compiler = result.compiler;
   JavaScriptBackend backend = compiler.backend;
@@ -126,7 +122,6 @@
   String bounds = backend.namer.functionTypeGenericBoundsTag;
   String futureOr = backend.namer.futureOrTag;
   String futureOrType = backend.namer.futureOrTypeTag;
-  String typedefTag = backend.namer.typedefTag;
 
   ClassEntity List_ = findClass(closedWorld, 'List');
   TypeVariableType List_E =
@@ -166,12 +161,11 @@
   String String_rep = getJsName(String_.element);
 
   String getTypedefTag(DartType type) {
-    if (useKernel) {
-      // TODO(johnniwinther): Should/can we preserve typedef names from kernel?
-      return '';
-    }
-    TypedefType typedef = type;
-    return ', $typedefTag: ${getJsName(typedef.element)}';
+    // TODO(johnniwinther): Should/can we preserve typedef names from kernel?
+    //String typedefTag = backend.namer.typedefTag;
+    //TypedefType typedef = type;
+    //return ', $typedefTag: ${getJsName(typedef.element)}';
+    return '';
   }
 
   String Typedef1_tag = getTypedefTag(Typedef1_);
diff --git a/tests/compiler/dart2js/sourcemaps/multi_source_info_test.dart b/tests/compiler/dart2js/sourcemaps/multi_source_info_test.dart
deleted file mode 100644
index a1c654c..0000000
--- a/tests/compiler/dart2js/sourcemaps/multi_source_info_test.dart
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/compiler_new.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:expect/expect.dart';
-import '../memory_compiler.dart';
-
-main() {
-  asyncTest(() async {
-    String oldMap = (await compile([Flags.useOldFrontend]))
-        .getOutput('', OutputType.sourceMap);
-    String newMap =
-        (await compile([Flags.useOldFrontend, Flags.useNewSourceInfo]))
-            .getOutput('', OutputType.sourceMap);
-    OutputCollector multiCollector1 =
-        await compile([Flags.useOldFrontend, Flags.useMultiSourceInfo]);
-    String multiMap1a = multiCollector1.getOutput('', OutputType.sourceMap);
-    String multiMap1b =
-        multiCollector1.getOutput('out.js', OutputType.sourceMap);
-    Expect.equals(oldMap, multiMap1a);
-    Expect.equals(newMap, multiMap1b);
-    OutputCollector multiCollector2 = await compile([
-      Flags.useOldFrontend,
-      Flags.useMultiSourceInfo,
-      Flags.useNewSourceInfo
-    ]);
-    String multiMap2a = multiCollector2.getOutput('', OutputType.sourceMap);
-    String multiMap2b =
-        multiCollector2.getOutput('out.js', OutputType.sourceMap);
-    Expect.equals(newMap, multiMap2a);
-    Expect.equals(oldMap, multiMap2b);
-  });
-}
-
-Future<OutputCollector> compile(List<String> options) async {
-  OutputCollector collector = new OutputCollector();
-  await runCompiler(
-      entryPoint: Uri.parse('memory:main.dart'),
-      memorySourceFiles: const {'main.dart': 'main() {}'},
-      outputProvider: collector,
-      options: options);
-  return collector;
-}
diff --git a/tests/compiler/dart2js/sourcemaps/source_mapping2_test.dart b/tests/compiler/dart2js/sourcemaps/source_mapping2_test.dart
deleted file mode 100644
index bd74cbe..0000000
--- a/tests/compiler/dart2js/sourcemaps/source_mapping2_test.dart
+++ /dev/null
@@ -1,124 +0,0 @@
-// 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.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/io/code_output.dart';
-import 'package:compiler/src/io/source_file.dart';
-import 'package:compiler/src/io/source_information.dart';
-import 'package:compiler/src/js_backend/js_backend.dart';
-import 'package:compiler/src/js_emitter/full_emitter/emitter.dart' as full
-    show Emitter;
-
-import '../old_frontend/mock_compiler.dart';
-
-Future<CodeOutput> compileAll(SourceFile sourceFile) {
-  MockCompiler compiler = new MockCompiler.internal();
-  Uri uri = new Uri(path: sourceFile.filename);
-  compiler.sourceFiles[uri.toString()] = sourceFile;
-  JavaScriptBackend backend = compiler.backend;
-  return compiler.run(uri).then((_) {
-    // TODO(floitsch): the outputBuffers are only accessible in the full
-    // emitter.
-    full.Emitter fullEmitter = backend.emitter.emitter;
-    return fullEmitter
-        .outputBuffers[compiler.backend.outputUnitData.mainOutputUnit];
-  });
-}
-
-void testSourceMapLocations(String codeWithMarkers) {
-  List<int> expectedLocations = new List<int>();
-  for (int i = 0; i < codeWithMarkers.length; ++i) {
-    if (codeWithMarkers[i] == '@') {
-      expectedLocations.add(i - expectedLocations.length);
-    }
-  }
-  String code = codeWithMarkers.replaceAll('@', '');
-
-  SourceFile sourceFile = new StringSourceFile.fromName('<test script>', code);
-  asyncTest(() => compileAll(sourceFile).then((CodeOutput output) {
-        Set<int> locations = new Set<int>();
-        SourceLocations sourceLocations = output.sourceLocations.single;
-        sourceLocations
-            .forEachSourceLocation((int offset, SourceLocation sourcePosition) {
-          if (sourcePosition != null &&
-              sourcePosition.sourceUri == sourceFile.uri) {
-            locations.add(sourcePosition.offset);
-          }
-        });
-
-        for (int i = 0; i < expectedLocations.length; ++i) {
-          int expectedLocation = expectedLocations[i];
-          if (!locations.contains(expectedLocation)) {
-            int originalLocation = expectedLocation + i;
-            SourceFile sourceFileWithMarkers =
-                new StringSourceFile.fromName('<test script>', codeWithMarkers);
-            String message = sourceFileWithMarkers.getLocationMessage(
-                'Missing location', originalLocation, originalLocation + 1);
-            Expect.fail(message);
-          }
-        }
-      }));
-}
-
-String FUNCTIONS_TEST = '''
-@void main() { print(test(15)); @}
-// The 'if' has been added to avoid inlining of 'test'.
-@int test(int x) { if (x != null) return x; else return null; @}''';
-
-String RETURN_TEST = 'void main() { print(((x) { @return x; })(0)); }';
-
-String NOT_TEST = 'void main() { ((x) { if (@!x) print(x); })(1==2); }';
-
-String UNARY_TEST = 'void main() { ((x, y) { print(@-x + @~y); })(1,2); }';
-
-String BINARY_TEST =
-    'void main() { ((x, y) { if (x @!= y) print(x @* y); })(1,2); }';
-
-String SEND_TEST = '''
-void main() {
-  @staticSend(0);
-  NewSend o = @new NewSend();
-  @o.dynamicSend(0);
-  var closureSend = (x) { print(x); };
-  @closureSend(0);
-}
-// The 'if' has been added to avoid inlining of 'staticSend'.
-void staticSend(x) { if (x == null) return; print(x); }
-class NewSend { void dynamicSend(x) { print(x); } }
-''';
-
-String SEND_SET_TEST = '''
-String global;
-void main() { @global = ''; print(new A().foo()); }
-class A { int x; foo() { @x = 3; } }''';
-
-String LOOP_TEST = '''
-void main() {
-  @for (int i = 0; i < 100; ++i) { print(test(13)); @}
-}
-int test(int x) {
-  int result = 1; @while (result < x) { result <<= 1; @} return result;
-}''';
-
-String INTERCEPTOR_TEST = '''void main() { var l = []; @l.add(0); print(l); }
-''';
-
-main() {
-  // These tests are fragile, since mappings for specific source locations
-  // could disappear due to various optimizations like code elimination,
-  // function inlining, etc. If you broke the test, please try to rewrite it
-  // so that the new code is not optimized, otherwise just remove the marker
-  // from problematic location.
-  testSourceMapLocations(FUNCTIONS_TEST);
-  testSourceMapLocations(RETURN_TEST);
-  testSourceMapLocations(NOT_TEST);
-  testSourceMapLocations(UNARY_TEST);
-  testSourceMapLocations(BINARY_TEST);
-  testSourceMapLocations(SEND_TEST);
-  testSourceMapLocations(SEND_SET_TEST);
-  testSourceMapLocations(LOOP_TEST);
-  testSourceMapLocations(INTERCEPTOR_TEST);
-}
diff --git a/tests/compiler/dart2js/type_test_helper.dart b/tests/compiler/dart2js/type_test_helper.dart
index 95e82a0..9705244 100644
--- a/tests/compiler/dart2js/type_test_helper.dart
+++ b/tests/compiler/dart2js/type_test_helper.dart
@@ -17,13 +17,9 @@
     show ClassElement, LibraryElement, TypedefElement;
 import 'package:compiler/src/kernel/kernel_strategy.dart';
 import 'package:compiler/src/world.dart' show ClosedWorld;
-import 'compiler_helper.dart' as mock;
-import 'compiler_helper.dart' show CompileMode;
 import 'memory_compiler.dart' as memory;
 import 'kernel/compiler_helper.dart' as dill;
 
-export 'compiler_helper.dart' show CompileMode;
-
 DartType instantiate(Entity element, List<DartType> arguments) {
   if (element is ClassElement) {
     return new ResolutionInterfaceType(element, arguments);
@@ -42,8 +38,7 @@
   Resolution get resolution => compiler.resolution;
 
   static Future<TypeEnvironment> create(String source,
-      {CompileMode compileMode: CompileMode.mock,
-      bool useDillCompiler: false,
+      {bool useDillCompiler: false,
       bool expectNoErrors: false,
       bool expectNoWarningsOrErrors: false,
       bool stopAfterTypeInference: false,
@@ -68,52 +63,19 @@
       source = '$mainSource\n$source';
     }
     memory.DiagnosticCollector collector;
-    if (compileMode == CompileMode.kernel) {
-      collector = new memory.DiagnosticCollector();
-      uri = Uri.parse('memory:main.dart');
-      compiler = await dill.compileWithDill(
-          entryPoint: uri,
-          memorySourceFiles: {'main.dart': source},
-          diagnosticHandler: collector,
-          options: stopAfterTypeInference
-              ? ([Flags.disableTypeInference]..addAll(options))
-              : ([
-                  Flags.disableTypeInference,
-                  Flags.analyzeAll,
-                  Flags.analyzeOnly
-                ]..addAll(options)),
-          beforeRun: (Compiler compiler) {
-            compiler.stopAfterTypeInference = stopAfterTypeInference;
-          });
-    } else {
-      if (compileMode == CompileMode.mock) {
-        uri = new Uri(scheme: 'source');
-        mock.MockCompiler mockCompiler = mock.mockCompilerFor(source, uri,
-            analyzeAll: !stopAfterTypeInference,
-            analyzeOnly: !stopAfterTypeInference);
-        mockCompiler.diagnosticHandler =
-            mock.createHandler(mockCompiler, source);
-        collector = mockCompiler.diagnosticCollector;
-        compiler = mockCompiler;
-        compiler.stopAfterTypeInference = stopAfterTypeInference;
-        await compiler.run(uri);
-      } else {
-        collector = new memory.DiagnosticCollector();
-        uri = Uri.parse('memory:main.dart');
-        memory.CompilationResult result = await memory.runCompiler(
-            entryPoint: uri,
-            memorySourceFiles: {'main.dart': source},
-            diagnosticHandler: collector,
-            options: stopAfterTypeInference
-                ? ([Flags.useOldFrontend]..addAll(options))
-                : ([Flags.useOldFrontend, Flags.analyzeAll, Flags.analyzeOnly]
-                  ..addAll(options)),
-            beforeRun: (compiler) {
-              compiler.stopAfterTypeInference = stopAfterTypeInference;
-            });
-        compiler = result.compiler;
-      }
-    }
+    collector = new memory.DiagnosticCollector();
+    uri = Uri.parse('memory:main.dart');
+    compiler = await dill.compileWithDill(
+        entryPoint: uri,
+        memorySourceFiles: {'main.dart': source},
+        diagnosticHandler: collector,
+        options: stopAfterTypeInference
+            ? ([Flags.disableTypeInference]..addAll(options))
+            : ([Flags.disableTypeInference, Flags.analyzeAll, Flags.analyzeOnly]
+              ..addAll(options)),
+        beforeRun: (Compiler compiler) {
+          compiler.stopAfterTypeInference = stopAfterTypeInference;
+        });
     if (expectNoErrors || expectNoWarningsOrErrors) {
       var errors = collector.errors;
       Expect.isTrue(errors.isEmpty, 'Unexpected errors: ${errors}');
diff --git a/tests/compiler/dart2js/uri_retention_test.dart b/tests/compiler/dart2js/uri_retention_test.dart
index 782e0f7..eaa6b35 100644
--- a/tests/compiler/dart2js/uri_retention_test.dart
+++ b/tests/compiler/dart2js/uri_retention_test.dart
@@ -12,10 +12,9 @@
 import 'package:expect/expect.dart';
 import 'memory_compiler.dart' show runCompiler, OutputCollector;
 
-Future<String> compileSources(sources, {bool minify, bool useKernel}) async {
+Future<String> compileSources(sources, {bool minify}) async {
   var options = [];
   if (minify) options.add(Flags.minify);
-  if (!useKernel) options.add(Flags.useOldFrontend);
   OutputCollector outputCollector = new OutputCollector();
   await runCompiler(
       memorySourceFiles: sources,
@@ -24,15 +23,14 @@
   return outputCollector.getOutput('', OutputType.js);
 }
 
-Future test(sources, {bool libName, bool fileName, bool useKernel}) {
-  return compileSources(sources, minify: false, useKernel: useKernel)
-      .then((output) {
+Future test(sources, {bool libName, bool fileName}) {
+  return compileSources(sources, minify: false).then((output) {
     // Unminified the sources should always contain the library name and the
     // file name.
     Expect.isTrue(output.contains("main_lib"));
     Expect.isTrue(output.contains("main.dart"));
   }).then((_) {
-    compileSources(sources, minify: true, useKernel: useKernel).then((output) {
+    compileSources(sources, minify: true).then((output) {
       Expect.equals(libName, output.contains("main_lib"));
       Expect.isFalse(output.contains("main.dart"));
     });
@@ -40,22 +38,13 @@
 }
 
 void main() {
-  runTests({bool useKernel}) async {
-    await test(MEMORY_SOURCE_FILES1,
-        libName: false, fileName: false, useKernel: useKernel);
-    if (!useKernel) {
-      await test(MEMORY_SOURCE_FILES2,
-          libName: true, fileName: false, useKernel: useKernel);
-      await test(MEMORY_SOURCE_FILES3,
-          libName: true, fileName: true, useKernel: useKernel);
-    }
+  runTests() async {
+    await test(MEMORY_SOURCE_FILES1, libName: false, fileName: false);
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
 
@@ -73,46 +62,3 @@
 }
 """,
 };
-
-// Requires the library name, but not the URIs.
-const MEMORY_SOURCE_FILES2 = const <String, String>{
-  'main.dart': """
-library main_lib;
-
-@MirrorsUsed(targets: 'main_lib')
-import 'dart:mirrors';
-import 'file2.dart';
-
-class A {
-}
-
-main() {
-  print(Uri.base);
-  // Unfortunately we can't use new B().uri yet, because that would require
-  // some type-feedback to know that the '.uri' is not the one from the library.
-  print(new B());
-  print(reflectClass(A).declarations.length);
-}
-""",
-  'file2.dart': """
-library other_lib;
-
-class B {
-  final uri = "xyz";
-}
-""",
-};
-
-// Requires the uri (and will contain the library-name, too).
-const MEMORY_SOURCE_FILES3 = const <String, String>{
-  'main.dart': """
-library main_lib;
-
-@MirrorsUsed(targets: 'main_lib')
-import 'dart:mirrors';
-
-main() {
-  print(currentMirrorSystem().findLibrary(#main_lib).uri);
-}
-""",
-};
diff --git a/tests/compiler/dart2js/user_crash_test.dart b/tests/compiler/dart2js/user_crash_test.dart
index 250f4cb..d70695f 100644
--- a/tests/compiler/dart2js/user_crash_test.dart
+++ b/tests/compiler/dart2js/user_crash_test.dart
@@ -6,16 +6,14 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 import 'package:compiler/compiler_new.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'memory_compiler.dart';
 
 final EXCEPTION = 'Crash-marker';
 
 main() {
-  runTests({bool useKernel}) async {
-    test('Empty program', await run(useKernel: useKernel));
-    test('Crash diagnostics',
-        await run(useKernel: useKernel, diagnostics: new CrashingDiagnostics()),
+  runTests() async {
+    test('Empty program', await run());
+    test('Crash diagnostics', await run(diagnostics: new CrashingDiagnostics()),
         expectedLines: [
           'Uncaught exception in diagnostic handler: $EXCEPTION',
           null /* Stack trace*/
@@ -25,11 +23,9 @@
         ]);
     test(
         'Throw in package discovery',
-        await run(
-            useKernel: useKernel,
-            packagesDiscoveryProvider: (_) {
-              throw EXCEPTION;
-            }),
+        await run(packagesDiscoveryProvider: (_) {
+          throw EXCEPTION;
+        }),
         expectedLines: [
           'Uncaught exception in package discovery: $EXCEPTION',
           null /* Stack trace*/
@@ -40,30 +36,20 @@
     test(
         'new Future.error in package discovery',
         await run(
-            useKernel: useKernel,
             packagesDiscoveryProvider: (_) => new Future.error(EXCEPTION)),
         expectedExceptions: [EXCEPTION]);
 
-    List<String> expectedLines;
-    if (useKernel) {
-      expectedLines = ['Error: Input file not found: memory:main.dart.'];
-    } else {
-      expectedLines = [
-        'Uncaught exception in input provider: $EXCEPTION',
-        null, // Stack trace
-        'memory:main.dart:\nError: $EXCEPTION' /* READ_SELF_ERROR */
-      ];
-    }
+    List<String> expectedLines = [
+      'Error: Input file not found: memory:main.dart.'
+    ];
     test('Throw in input provider',
-        await run(useKernel: useKernel, memorySourceFiles: new CrashingMap()),
+        await run(memorySourceFiles: new CrashingMap()),
         expectedLines: expectedLines);
   }
 
   asyncTest(() async {
-    print('--test from ast---------------------------------------------------');
-    await runTests(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await runTests(useKernel: true);
+    await runTests();
   });
 }
 
@@ -90,8 +76,7 @@
 Future<RunResult> run(
     {Map<String, String> memorySourceFiles: const {'main.dart': 'main() {}'},
     CompilerDiagnostics diagnostics,
-    PackagesDiscoveryProvider packagesDiscoveryProvider,
-    bool useKernel}) async {
+    PackagesDiscoveryProvider packagesDiscoveryProvider}) async {
   RunResult result = new RunResult();
   await runZoned(() async {
     try {
@@ -99,8 +84,7 @@
           entryPoint: Uri.parse('memory:main.dart'),
           memorySourceFiles: memorySourceFiles,
           diagnosticHandler: diagnostics,
-          packagesDiscoveryProvider: packagesDiscoveryProvider,
-          options: useKernel ? [] : [Flags.useOldFrontend]);
+          packagesDiscoveryProvider: packagesDiscoveryProvider);
     } catch (e) {
       result.exceptions.add(e);
     }
diff --git a/tests/compiler/dart2js_extra/dummy_compiler_test.dart b/tests/compiler/dart2js_extra/dummy_compiler_test.dart
index 09c60e4..3e3a64f 100644
--- a/tests/compiler/dart2js_extra/dummy_compiler_test.dart
+++ b/tests/compiler/dart2js_extra/dummy_compiler_test.dart
@@ -11,7 +11,7 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler.dart';
 
-import '../dart2js/old_frontend/mock_libraries.dart';
+import 'mock_libraries.dart';
 
 String libProvider(Uri uri) {
   if (uri.path.endsWith(".platform")) {
diff --git a/tests/compiler/dart2js_extra/instantiation_stub_test.dart b/tests/compiler/dart2js_extra/instantiation_stub_test.dart
new file mode 100644
index 0000000..d62266f
--- /dev/null
+++ b/tests/compiler/dart2js_extra/instantiation_stub_test.dart
@@ -0,0 +1,53 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+// This needs one-arg instantiation.
+@NoInline()
+T f1a<T>(T t) => t;
+
+// This needs no instantiation because it is not closurized.
+@NoInline()
+T f1b<T>(T t1, T t2) => t1;
+
+class Class {
+  // This needs two-arg instantiation.
+  @NoInline()
+  bool f2a<T, S>(T t, S s) => t == s;
+
+  // This needs no instantiation because it is not closurized.
+  @NoInline()
+  bool f2b<T, S>(T t, S s1, S s2) => t == s1;
+}
+
+@NoInline()
+int method1(int i, int Function(int) f) => f(i);
+
+@NoInline()
+bool method2(int a, int b, bool Function(int, int) f) => f(a, b);
+
+@NoInline()
+int method3(int a, int b, int c, int Function(int, int, int) f) => f(a, b, c);
+
+main() {
+  // This needs three-arg instantiation.
+  T local1<T, S, U>(T t, S s, U u) => t;
+
+  // This needs no instantiation because but a local function is always
+  // closurized so we assume it does.
+  T local2<T, S, U>(T t, S s, U u1, U u2) => t;
+
+  Expect.equals(42, method1(42, f1a));
+  Expect.equals(f1b(42, 87), 42);
+
+  Class c = new Class();
+  Expect.isFalse(method2(0, 1, c.f2a));
+  Expect.isFalse(c.f2b(42, 87, 123));
+
+  Expect.equals(0, method3(0, 1, 2, local1));
+  Expect.equals(42, local2(42, 87, 123, 256));
+}
diff --git a/tests/compiler/dart2js/old_frontend/mock_libraries.dart b/tests/compiler/dart2js_extra/mock_libraries.dart
similarity index 100%
rename from tests/compiler/dart2js/old_frontend/mock_libraries.dart
rename to tests/compiler/dart2js_extra/mock_libraries.dart
diff --git a/tests/corelib_2/apply3_test.dart b/tests/corelib_2/apply3_test.dart
index d96fa0d..5bf1bce 100644
--- a/tests/corelib_2/apply3_test.dart
+++ b/tests/corelib_2/apply3_test.dart
@@ -5,7 +5,6 @@
 // Test [Function.apply] on user-defined classes that implement [noSuchMethod].
 
 import "package:expect/expect.dart";
-import 'dart:mirrors';
 
 class F {
   call([p1]) => "call";
@@ -24,46 +23,12 @@
 main() {
   Expect.equals('call', Function.apply(new F(), []));
   Expect.equals('call', Function.apply(new F(), [1]));
-  Expect.equals('NSM', Function.apply(new F(), [1, 2]));
-  Expect.equals('NSM', Function.apply(new F(), [1, 2, 3]));
+  Expect.throwsNoSuchMethodError(() => Function.apply(new F(), [1, 2]));
+  Expect.throwsNoSuchMethodError(() => Function.apply(new F(), [1, 2, 3]));
 
-  var symbol = const Symbol('a');
-  var requiredParameters = [1];
-  var optionalParameters = new Map<Symbol, int>()..[symbol] = 42;
-  Invocation i =
-      Function.apply(new G(), requiredParameters, optionalParameters);
-
-  Expect.equals(const Symbol('call'), i.memberName);
-  Expect.listEquals(requiredParameters, i.positionalArguments);
-  Expect.mapEquals(optionalParameters, i.namedArguments);
-  Expect.isTrue(i.isMethod);
-  Expect.isFalse(i.isGetter);
-  Expect.isFalse(i.isSetter);
-  Expect.isFalse(i.isAccessor);
-
-  // Check that changing the passed list and map for parameters does
-  // not affect [i].
-  requiredParameters[0] = 42;
-  optionalParameters[symbol] = 12;
-  Expect.listEquals([1], i.positionalArguments);
-  Expect.mapEquals(new Map()..[symbol] = 42, i.namedArguments);
-
-  // Check that using [i] for invocation yields the same [Invocation]
-  // object.
-  var mirror = reflect(new G());
-  Invocation other = mirror.delegate(i);
-  Expect.equals(i.memberName, other.memberName);
-  Expect.listEquals(i.positionalArguments, other.positionalArguments);
-  Expect.mapEquals(i.namedArguments, other.namedArguments);
-  Expect.equals(i.isMethod, other.isMethod);
-  Expect.equals(i.isGetter, other.isGetter);
-  Expect.equals(i.isSetter, other.isSetter);
-  Expect.equals(i.isAccessor, other.isAccessor);
+  Expect.throwsNoSuchMethodError(() => Function.apply(new G(), [1], {#a: 42}));
 
   // Test that [i] can be used to hit an existing method.
   Expect.equals(43, new H().call(1, a: 42));
-  Expect.equals(43, Function.apply(new H(), [1], new Map()..[symbol] = 42));
-  mirror = reflect(new H());
-  Expect.equals(43, mirror.delegate(i));
-  Expect.equals(43, mirror.delegate(other));
+  Expect.equals(43, Function.apply(new H(), [1], {#a: 42}));
 }
diff --git a/tests/corelib_2/bigint_test.dart b/tests/corelib_2/bigint_test.dart
index e6845d0..290e477 100644
--- a/tests/corelib_2/bigint_test.dart
+++ b/tests/corelib_2/bigint_test.dart
@@ -484,6 +484,29 @@
   e = BigInt.parse("123456789012345678901234567890");
   m = BigInt.parse("123456789012345678901234567899");
   Expect.equals(BigInt.parse("40128068573873018143207285483"), x.modPow(e, m));
+  x = BigInt.parse(
+      "142223781135477974841804437037182877109549636480215350570761436386728140"
+      "00321219503871352719175100865184619168128345594681547640115731246638");
+  e = BigInt.parse(
+      "688057170495263083245752731085731160016625265771524738691797062279575950"
+      "919479651156310413084174304361991240273181430924411258203766946639349880"
+      "404106504114953688890200429043051936362182997575167191584461538746041795"
+      "019663740246921124383173799957296515067912829778249931473903780958741032"
+      "64534184571632120755");
+  m = BigInt.parse(
+      "144173682842817587002196172066264549138375068078359231382946906898412792"
+      "452632726597279520229873489736777248181678202636100459215718497240474064"
+      "366927544074501134727745837254834206456400508719134610847814227274992298"
+      "238973375146473350157304285346424982280927848339601514720098577525635486"
+      "320547905945936448443");
+  Expect.equals(
+      BigInt.parse(
+          "41228476947144730491819644448449646627743926889389391986712371102685"
+          "14984467753960109321610008533258676279344318597060690521027646613453"
+          "25674994677820913027869835916005689276806408148698486814119894325284"
+          "18918299321385420296108046942018595594076729397423805685944237555128"
+          "652606412065971965116137839721723231"),
+      x.modPow(e, m));
 }
 
 testBigintModInverse() {
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 6c66c0c..485d97c 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -22,7 +22,6 @@
 error_stack_trace_test/static: MissingCompileTimeError
 
 [ $compiler == dartdevk ]
-apply3_test: RuntimeError
 bigint_from_test: RuntimeError # Issue 32589
 bool_from_environment2_test/03: Crash
 int_modulo_arith_test/modPow: RuntimeError
@@ -39,7 +38,7 @@
 regexp/pcre_test: Pass, Slow # Issue 22008
 
 [ $runtime == flutter ]
-apply3_test: CompileTimeError # mirrors not supported
+apply3_test: RuntimeError
 bool_from_environment_test: Fail # Flutter Issue 9111
 format_exception_test: RuntimeError # Flutter Issue 9111
 from_environment_const_type_test/01: Fail # Flutter Issue 9111
@@ -94,6 +93,10 @@
 [ $arch == x64 && $system == windows ]
 stopwatch_test: Skip # Flaky test due to expected performance behaviour.
 
+[ $arch == simarm || $arch == simarm64 || $arch == simdbc64 ]
+bigint_parse_radix_test: Pass, Slow # Bigint computations are slow on simulated architectures.
+bigint_test: Pass, Slow # Bigint computations are slow on simulated architectures.
+
 [ $compiler == dart2analyzer && !$checked && !$strong ]
 from_environment_const_type_test/02: MissingCompileTimeError
 from_environment_const_type_test/03: MissingCompileTimeError
@@ -193,8 +196,8 @@
 symbol_reserved_word_test/03: RuntimeError # Issue 19972, new Symbol('void') should be allowed.
 
 [ $compiler == dart2js && $fast_startup ]
-apply3_test: Fail # mirrors not supported
-dynamic_nosuchmethod_test: Fail # mirrors not supported
+apply3_test: RuntimeError
+dynamic_nosuchmethod_test: RuntimeError
 
 [ $compiler == dart2js && $fast_startup && $fasta && $strong ]
 cast_test: RuntimeError
@@ -222,9 +225,7 @@
 map_entry_test: RuntimeError
 
 [ $compiler == dart2js && $fasta && $host_checked && $strong ]
-apply3_test: RuntimeError
 cast_test: RuntimeError
-dynamic_nosuchmethod_test: RuntimeError
 error_stack_trace1_test: RuntimeError # Issue 12399
 growable_list_test: RuntimeError # Concurrent modifications test always runs
 int_parse_radix_test/01: RuntimeError
@@ -246,7 +247,6 @@
 uri_test: RuntimeError
 
 [ $compiler == dart2js && $fasta && $minified && $strong ]
-apply3_test: RuntimeError
 cast_test: RuntimeError
 dynamic_nosuchmethod_test: RuntimeError
 error_stack_trace1_test: RuntimeError # Issue 12399
@@ -305,16 +305,8 @@
 string_replace_static_test: MissingCompileTimeError
 string_static_test: MissingCompileTimeError
 
-# 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.
-[ $compiler == dartk && $mode == debug && $strong && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
-bigint_parse_radix_test: Pass, Timeout # Please triage.
-bigint_test: Pass, Timeout # Please triage.
-
 # ===== dartk + vm status lines =====
 [ $compiler == dartk && $runtime == vm && $strong ]
-apply3_test: RuntimeError
 apply_generic_function_test: RuntimeError
 iterable_fold_test/02: RuntimeError
 iterable_reduce_test/01: CompileTimeError # Issue 31533
@@ -329,9 +321,6 @@
 [ $compiler != dartk && $runtime == vm && $checked ]
 apply_test/01: RuntimeError
 
-[ $compiler == dartkp && $mode == debug && $runtime == dart_precompiled && $strong ]
-growable_list_test: Crash
-
 [ $compiler == dartkp && $runtime == dart_precompiled && $strong ]
 apply_generic_function_test: RuntimeError
 iterable_fold_test/02: RuntimeError
@@ -416,7 +405,6 @@
 typed_data_with_limited_ints_test: Skip # dart2js and dartdevc don't know about --limit-ints-to-64-bits
 
 [ $runtime != none && ($compiler == dartdevc || $compiler == dartdevk) ]
-apply3_test: RuntimeError # Issue 29921
 bigint_test: Pass, Slow
 compare_to2_test: RuntimeError # Issue 30170
 date_time10_test: RuntimeError # Issue 29921
@@ -597,13 +585,12 @@
 from_environment_const_type_undefined_test/16: MissingCompileTimeError
 iterable_to_set_test: RuntimeError # is-checks do not implement strong mode type system
 
-[ $compiler == dartkp || $compiler == precompiler ]
-apply3_test: SkipByDesign
-dynamic_nosuchmethod_test: SkipByDesign
-
 [ $compiler == precompiler || $runtime == vm && !$checked && !$strong ]
 int_parse_radix_test/badTypes: RuntimeError # wrong exception returned
 
+[ $compiler == precompiler || $runtime == vm && !$strong ]
+apply3_test: RuntimeError
+
 [ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
 regexp/global_test: Skip # Issue 21709
 regexp/pcre_test: Pass, Slow, Timeout
@@ -617,4 +604,5 @@
 
 [ $hot_reload || $hot_reload_rollback ]
 bigint_parse_radix_test: Pass, Timeout # Issue 31659
+bigint_test: Pass, Crash # Issue 31660
 integer_parsed_mul_div_vm_test: Pass, Slow # Slow
diff --git a/tests/corelib_2/dynamic_nosuchmethod_test.dart b/tests/corelib_2/dynamic_nosuchmethod_test.dart
index 730cdbb..2577b48 100644
--- a/tests/corelib_2/dynamic_nosuchmethod_test.dart
+++ b/tests/corelib_2/dynamic_nosuchmethod_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import 'dart:mirrors';
 
 // Test that noSuchMethod calls behave as expected for dynamic object invocations.
 class BaseClass {
@@ -19,7 +18,9 @@
   ReturnInvocationName(this._bar);
 
   noSuchMethod(Invocation invocation) {
-    return MirrorSystem.getName(invocation.memberName);
+    var name = invocation.memberName.toString();
+    var match = new RegExp(r'Symbol\("([^"]+)"\)').matchAsPrefix(name);
+    return match != null ? match.group(1) : name;
   }
 
   bar() {
diff --git a/tests/language_2/async_covariant_type_test.dart b/tests/language_2/async_covariant_type_test.dart
new file mode 100644
index 0000000..c619673
--- /dev/null
+++ b/tests/language_2/async_covariant_type_test.dart
@@ -0,0 +1,20 @@
+// 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.
+
+// Test that TypeErrors happen for async methods without using returned Future.
+
+import 'dart:async';
+import 'package:expect/expect.dart';
+
+class D<T> {
+  // Parametric covariance check is usually compiled into method.
+  Future<T> add(T n) async {
+    return n;
+  }
+}
+
+main() async {
+  D<num> d = new D<int>();
+  Expect.throwsTypeError(() => d.add(4.6));
+}
diff --git a/tests/language_2/async_dcall_type_test.dart b/tests/language_2/async_dcall_type_test.dart
new file mode 100644
index 0000000..b3ffbe6
--- /dev/null
+++ b/tests/language_2/async_dcall_type_test.dart
@@ -0,0 +1,30 @@
+// 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.
+
+// Test that TypeErrors happen for async methods without using returned Future.
+
+import 'dart:async';
+import 'package:expect/expect.dart';
+
+Future<int> iota(int n) async {
+  await null;
+  return n;
+}
+
+class C {
+  Future<int> add(int n) async {
+    await null;
+    return n;
+  }
+}
+
+main() async {
+  dynamic f = iota;
+  Expect.throwsTypeError(() => f('ten'));
+  Expect.throwsTypeError(() => f(4.7));
+
+  dynamic o = new C();
+  Expect.throwsTypeError(() => o.add('ten'));
+  Expect.throwsTypeError(() => o.add(4.7));
+}
diff --git a/tests/language_2/asyncstar_covariant_type_test.dart b/tests/language_2/asyncstar_covariant_type_test.dart
new file mode 100644
index 0000000..836daf0
--- /dev/null
+++ b/tests/language_2/asyncstar_covariant_type_test.dart
@@ -0,0 +1,20 @@
+// 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.
+
+// Test that TypeErrors for async* methods happen without using returned Stream.
+
+import 'dart:async';
+import 'package:expect/expect.dart';
+
+class D<T> {
+  // Parametric covariance check is usually compiled into method.
+  Stream<T> add(T n) async* {
+    yield n;
+  }
+}
+
+main() async {
+  D<num> d = new D<int>();
+  Expect.throwsTypeError(() => d.add(4.6));
+}
diff --git a/tests/language_2/asyncstar_dcall_type_test.dart b/tests/language_2/asyncstar_dcall_type_test.dart
new file mode 100644
index 0000000..1330a6d
--- /dev/null
+++ b/tests/language_2/asyncstar_dcall_type_test.dart
@@ -0,0 +1,28 @@
+// 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.
+
+// Test that TypeErrors for async* methods happen without using returned Stream.
+
+import 'dart:async';
+import 'package:expect/expect.dart';
+
+Stream<int> iota(int n) async* {
+  yield n;
+}
+
+class C {
+  Stream<int> add(int n) async* {
+    yield n;
+  }
+}
+
+main() async {
+  dynamic f = iota;
+  Expect.throwsTypeError(() => f('ten'));
+  Expect.throwsTypeError(() => f(4.7));
+
+  dynamic o = new C();
+  Expect.throwsTypeError(() => o.add('ten'));
+  Expect.throwsTypeError(() => o.add(4.7));
+}
diff --git a/tests/language_2/bug32305_test.dart b/tests/language_2/bug32305_test.dart
new file mode 100644
index 0000000..5943764
--- /dev/null
+++ b/tests/language_2/bug32305_test.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.
+
+void main() {
+  int Function(int) f;
+
+  List<num> l = [];
+  /*@compile-error=unspecified*/ var a = l.map(f);
+}
diff --git a/tests/language_2/call_method_must_not_be_getter_test.dart b/tests/language_2/call_method_must_not_be_getter_test.dart
index d21132b..ac070dd 100644
--- a/tests/language_2/call_method_must_not_be_getter_test.dart
+++ b/tests/language_2/call_method_must_not_be_getter_test.dart
@@ -9,6 +9,16 @@
   void Function() get call => () {};
 }
 
+class D {
+  get call => this;
+}
+
+// Recurs outside the try-block to avoid disabling inlining.
+callD() {
+  dynamic d = new D();
+  d();
+}
+
 main() {
   C c = new C();
   dynamic d = c;
@@ -20,6 +30,9 @@
   void Function() f = c; //# 02: compile-time error
   // Nor does it permit a dynamic invocation of `call`.
   Expect.throws(() => d()); //# 03: ok
+  // Same as previous line, but with a getter that can stack overflow if
+  // incorrect behavior is present. Merged from issue21159_test.
+  Expect.throwsNoSuchMethodError(() => callD()); //# 03: ok
 
   // However, all these things are possible if `call` is mentioned explicitly.
   c.call(); //# 04: ok
diff --git a/tests/language_2/const_evaluation_test.dart b/tests/language_2/const_evaluation_test.dart
index e176c16..cd0353e 100644
--- a/tests/language_2/const_evaluation_test.dart
+++ b/tests/language_2/const_evaluation_test.dart
@@ -5,8 +5,6 @@
 // Check that compile-time evaluation of constants is consistent with runtime
 // evaluation.
 
-import 'dart:mirrors';
-
 import 'package:expect/expect.dart';
 
 const top_const = identical(-0.0, 0);
@@ -38,9 +36,6 @@
     Expect.equals(instance_var, local_const);
     Expect.equals(local_const, local_final);
     Expect.equals(local_final, local_var);
-    var metadata = reflectClass(C).metadata[0].reflectee; //# 01: ok
-    Expect.equals(top_const, metadata); //                //# 01: continued
-    Expect.equals(local_var, metadata); //                //# 01: continued
   }
 }
 
diff --git a/tests/language_2/field_increment_bailout_test.dart b/tests/language_2/field_increment_bailout_test.dart
index 7275f67..cddb38c 100644
--- a/tests/language_2/field_increment_bailout_test.dart
+++ b/tests/language_2/field_increment_bailout_test.dart
@@ -4,7 +4,6 @@
 
 // dart2js regression test for issue 8781.
 
-import "dart:mirrors" show reflect;
 import "package:expect/expect.dart";
 
 class N {
@@ -37,17 +36,17 @@
   }
 }
 
-class L {
-  final list;
-  L(this.list);
-  // Use noSuchMethod to defeat type inferencing.
-  noSuchMethod(mirror) => reflect(list).delegate(mirror);
-}
-
 main() {
-  var o = new A(new N(new L([1]), new L([2])));
+  var o = new A(new N(confuse([1]), confuse([2])));
 
   for (var i = 1; i <= 2; i++) Expect.equals(i, o.next());
 
   Expect.equals(null, o.list);
 }
+
+// Use confuse to defeat type inferencing.
+@NoInline()
+@AssumeDynamic()
+confuse(x) {
+  return x;
+}
diff --git a/tests/language_2/instantiate_tearoff_test.dart b/tests/language_2/instantiate_tearoff_test.dart
index 254949e..6a551f6 100644
--- a/tests/language_2/instantiate_tearoff_test.dart
+++ b/tests/language_2/instantiate_tearoff_test.dart
@@ -58,6 +58,7 @@
     String Function(X, int) x = foo;
     return x;
   }
+
   dynamic fn = bar<String>();
   Expect.equals("${fn.runtimeType}", "${stringAndIntToString.runtimeType}");
   Expect.equals(fn("a", 1), "String, int");
diff --git a/tests/language_2/invocation_mirror2_test.dart b/tests/language_2/invocation_mirror2_test.dart
index c8264ec..6f62d6e 100644
--- a/tests/language_2/invocation_mirror2_test.dart
+++ b/tests/language_2/invocation_mirror2_test.dart
@@ -2,17 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:mirrors" show reflect;
 import "package:expect/expect.dart";
 
-class GetName {
-  set flif(_) => "flif=";
-}
-
-int getName(im) => reflect(new GetName()).delegate(im);
-
 class C {
-  var im;
+  Invocation im;
   noSuchMethod(im) => this.im = im;
   flif() {}
 }
@@ -20,6 +13,6 @@
 main() {
   dynamic c = new C();
   c.flif = 42;
-  Expect.equals(42, getName(c.im));
+  Expect.equals(const Symbol("flif="), c.im.memberName);
   Expect.equals(42, c.im.positionalArguments[0]);
 }
diff --git a/tests/language_2/issue21159_test.dart b/tests/language_2/issue21159_test.dart
deleted file mode 100644
index 62227c6..0000000
--- a/tests/language_2/issue21159_test.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:expect/expect.dart";
-
-class C {
-  get call => this;
-}
-
-// Recurs outside the try-block to avoid disabling inlining.
-foo() {
-  dynamic c = new C();
-  c();
-}
-
-main() {
-  bool exceptionCaught = false;
-  try {
-    foo();
-  } on StackOverflowError catch (e) {
-    exceptionCaught = true;
-  }
-  Expect.equals(true, exceptionCaught);
-}
diff --git a/tests/language_2/language_2.status b/tests/language_2/language_2.status
index e4180aa..bdfe9cd 100644
--- a/tests/language_2/language_2.status
+++ b/tests/language_2/language_2.status
@@ -57,7 +57,6 @@
 # errors aren't detected by fasta, but reported by back ends as compile-time
 # errors.
 [ $compiler != dart2js && $runtime != dart_precompiled && $runtime != vm && $fasta ]
-deferred_constraints_constants_test/default_argument2: MissingCompileTimeError
 function_type_parameter2_negative_test: Fail
 function_type_parameter_negative_test: Fail
 implicit_creation/implicit_const_not_default_values_test/e12: MissingCompileTimeError
@@ -279,6 +278,7 @@
 implicit_creation/implicit_new_or_const_test: Fail # No support for implicit creation.
 implicit_creation/implicit_new_prefix_constructor_generic_named_test: Fail # No support for implicit creation.
 implicit_creation/implicit_new_prefix_constructor_named_test: Fail # No support for implicit creation.
+setter_override2_test/02: MissingCompileTimeError # Issue 14736
 
 [ $compiler == app_jit || $compiler == none ]
 library_env_test/has_no_mirror_support: RuntimeError, OK
@@ -315,7 +315,6 @@
 deferred_static_seperate_test: Crash # Requires deferred libraries
 deferred_super_dependency_test: Pass, Crash # Requires deferred libraries
 deferred_type_dependency_test: Crash # Requires deferred libraries
-issue21159_test: Pass, Crash # Issue 29094
 issue_1751477_test: Crash # Requires deferred libraries
 issue_22780_test/01: Pass, Crash # Issue 29094
 regress_22443_test: Crash # Requires deferred libraries
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 790afc0..c9ddf1c 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -120,6 +120,7 @@
 string_escape4_negative_test: CompileTimeError
 string_interpolate1_negative_test: CompileTimeError
 string_interpolate2_negative_test: CompileTimeError
+super_call4_test/01: MissingCompileTimeError
 super_setter_test: StaticWarning
 switch1_negative_test: CompileTimeError
 switch3_negative_test: CompileTimeError
@@ -1159,6 +1160,7 @@
 regress_30121_test: CompileTimeError # Issue 31087
 regress_30339_test: CompileTimeError
 reify_typevar_static_test/00: MissingCompileTimeError # Issue 28823
+setter_override2_test/02: MissingCompileTimeError # Issue 14736
 string_interpolate_test: CompileTimeError
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
@@ -1203,6 +1205,7 @@
 async_congruence_unnamed_test/01: MissingCompileTimeError
 async_congruence_unnamed_test/02: MissingCompileTimeError
 black_listed_test/none: Fail # Issue 14228
+bug32305_test: MissingCompileTimeError
 built_in_identifier_type_annotation_test/35: MissingCompileTimeError # Issue 28813
 built_in_identifier_type_annotation_test/36: MissingCompileTimeError # Issue 28813
 built_in_identifier_type_annotation_test/37: MissingCompileTimeError # Issue 28813
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 9a340bb..4b7d3be 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -12,7 +12,6 @@
 issue23244_test: RuntimeError # Isolates - enum canonicalization - Issue 23244
 library_env_test/has_mirror_support: RuntimeError, OK
 library_env_test/has_no_html_support: RuntimeError, OK
-null_test/mirrors: SkipByDesign # Uses mirrors.
 vm/*: SkipByDesign # Tests for the VM.
 
 [ $compiler != dart2js ]
@@ -146,6 +145,8 @@
 function_type/function_type9_test: RuntimeError # Issue 30476
 function_type_alias2_test: RuntimeError
 function_type_alias4_test: RuntimeError
+syncstar_covariant_type_test: RuntimeError # dart2js misplaces check in Iterator, not Iterable.
+syncstar_dcall_type_test: RuntimeError # dart2js misplaces check in Iterator, not Iterable.
 
 [ $compiler == dart2js && $runtime == safari ]
 field_override_optimization_test: RuntimeError
@@ -181,8 +182,6 @@
 async_star_test/02: RuntimeError
 await_test: RuntimeError
 bad_override_test/03: MissingCompileTimeError
-bad_override_test/04: MissingCompileTimeError
-bad_override_test/05: MissingCompileTimeError
 bit_operations_test/03: RuntimeError
 bit_operations_test/04: RuntimeError
 bit_operations_test/none: RuntimeError
@@ -282,9 +281,6 @@
 covariant_override/runtime_check_test: RuntimeError
 covariant_subtyping_test: RuntimeError
 cyclic_constructor_test/01: Crash # Stack Overflow
-deferred_constraints_constants_test/default_argument2: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
-deferred_constraints_constants_test/none: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
-deferred_constraints_constants_test/reference_after_load: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_type_annotation_test/as_operation: MissingCompileTimeError
 deferred_constraints_type_annotation_test/catch_check: MissingCompileTimeError
 deferred_constraints_type_annotation_test/is_check: MissingCompileTimeError
@@ -323,7 +319,6 @@
 field_override3_test/01: MissingCompileTimeError
 field_override3_test/02: MissingCompileTimeError
 field_override3_test/03: MissingCompileTimeError
-field_override4_test/02: MissingCompileTimeError
 final_attempt_reinitialization_test/01: MissingCompileTimeError
 final_attempt_reinitialization_test/02: MissingCompileTimeError
 full_stacktrace1_test: RuntimeError # Issue 12698
@@ -335,7 +330,6 @@
 generic_function_dcall_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_tearoff_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_typedef_test: RuntimeError
-getter_override2_test/02: MissingCompileTimeError
 getter_override_test/00: MissingCompileTimeError
 getter_override_test/01: MissingCompileTimeError
 getter_override_test/02: MissingCompileTimeError
@@ -368,8 +362,6 @@
 method_override7_test/00: MissingCompileTimeError
 method_override7_test/01: MissingCompileTimeError
 method_override7_test/02: MissingCompileTimeError
-method_override8_test/00: MissingCompileTimeError
-method_override8_test/01: MissingCompileTimeError
 mint_arithmetic_test: RuntimeError # non JS number semantics
 mixin_forwarding_constructor4_test/01: MissingCompileTimeError
 mixin_forwarding_constructor4_test/02: MissingCompileTimeError
@@ -467,22 +459,9 @@
 not_enough_positional_arguments_test/05: MissingCompileTimeError
 not_enough_positional_arguments_test/06: MissingCompileTimeError
 not_enough_positional_arguments_test/07: MissingCompileTimeError
-null_test/mirrors: RuntimeError
-null_test/none: RuntimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
-override_field_method1_negative_test: Fail
-override_field_method2_negative_test: Fail
-override_field_method4_negative_test: Fail
-override_field_method5_negative_test: Fail
 override_field_test/01: MissingCompileTimeError
-override_inheritance_mixed_test/01: MissingCompileTimeError
-override_inheritance_mixed_test/02: MissingCompileTimeError
-override_inheritance_mixed_test/03: MissingCompileTimeError
-override_inheritance_mixed_test/04: MissingCompileTimeError
-override_inheritance_mixed_test/08: MissingCompileTimeError
-override_inheritance_mixed_test/09: MissingCompileTimeError
-override_method_with_field_test/01: MissingCompileTimeError
 positional_parameters_type_test/01: MissingCompileTimeError
 positional_parameters_type_test/02: MissingCompileTimeError
 private_super_constructor_test/01: MissingCompileTimeError
@@ -532,11 +511,17 @@
 type_variable_scope_test/03: Crash # Internal Error: Unexpected type variable in static context.
 
 [ $compiler == dart2js && !$checked ]
+async_covariant_type_test: RuntimeError # checked / strong mode test
+async_dcall_type_test: RuntimeError # checked / strong mode test
+asyncstar_covariant_type_test: RuntimeError # checked / strong mode test
+asyncstar_dcall_type_test: RuntimeError # checked / strong mode test
 covariance_field_test/01: RuntimeError
 covariance_field_test/02: RuntimeError
 covariance_field_test/03: RuntimeError
 covariance_field_test/04: RuntimeError
 covariance_field_test/05: RuntimeError
+syncstar_covariant_type_test: RuntimeError # checked / strong mode test
+syncstar_dcall_type_test: RuntimeError # checked / strong mode test
 
 [ $compiler == dart2js && !$checked && !$enable_asserts ]
 assertion_test: RuntimeError, OK
@@ -553,31 +538,8 @@
 issue31596_test: RuntimeError
 
 [ $compiler == dart2js && $fast_startup ]
-const_evaluation_test/*: Fail # mirrors not supported
-deferred_constraints_constants_test: Pass # mirrors not supported, passes for the wrong reason
-deferred_constraints_constants_test/none: Fail # mirrors not supported
-deferred_constraints_constants_test/reference_after_load: Fail # mirrors not supported
-enum_mirror_test: Fail # mirrors not supported
-field_increment_bailout_test: Fail # mirrors not supported
-instance_creation_in_function_annotation_test: Fail # mirrors not supported
-invocation_mirror2_test: Fail # mirrors not supported
-invocation_mirror_invoke_on2_test: Fail # mirrors not supported
-invocation_mirror_invoke_on_test: Fail # mirrors not supported
-issue21079_test: Fail # mirrors not supported
 library_env_test/has_mirror_support: Fail # mirrors not supported
 library_env_test/has_no_mirror_support: Pass # fails for the wrong reason.
-many_overridden_no_such_method_test: Fail # mirrors not supported
-no_such_method_test: Fail # mirrors not supported
-null_test/0*: Pass # mirrors not supported, fails for the wrong reason
-null_test/none: Fail # mirrors not supported
-overridden_no_such_method_test: Fail # mirrors not supported
-redirecting_factory_reflection_test: Fail # mirrors not supported
-regress_13462_0_test: Fail # mirrors not supported
-regress_13462_1_test: Fail # mirrors not supported
-regress_18535_test: Fail # mirrors not supported
-regress_28255_test: Fail # mirrors not supported
-super_call4_test: Fail # mirrors not supported
-super_getter_setter_test: CompileTimeError
 vm/reflect_core_vm_test: Fail # mirrors not supported
 
 [ $compiler == dart2js && $fast_startup && $fasta && $strong ]
@@ -593,8 +555,6 @@
 async_star_test/05: RuntimeError
 async_star_test/none: RuntimeError
 bad_override_test/03: MissingCompileTimeError
-bad_override_test/04: MissingCompileTimeError
-bad_override_test/05: MissingCompileTimeError
 bit_operations_test: RuntimeError
 branch_canonicalization_test: RuntimeError
 call_method_implicit_tear_off_implements_function_test/02: RuntimeError
@@ -641,9 +601,6 @@
 cyclic_type_test/04: RuntimeError
 cyclic_typedef_test/10: Crash # Crash when compiling file:///usr/local/google/home/sra/Dart/sdk/out/ReleaseX64/generated_tests/language_2/cyclic_typedef_test_10.dart,
 cyclic_typedef_test/11: Crash # Crash when compiling file:///usr/local/google/home/sra/Dart/sdk/out/ReleaseX64/generated_tests/language_2/cyclic_typedef_test_11.dart,
-deferred_constraints_constants_test/default_argument2: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
-deferred_constraints_constants_test/none: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
-deferred_constraints_constants_test/reference_after_load: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
@@ -668,14 +625,12 @@
 f_bounded_quantification4_test: RuntimeError
 fauxverride_test/03: MissingCompileTimeError
 fauxverride_test/05: MissingCompileTimeError
-field_increment_bailout_test: RuntimeError
 field_initialization_order_test/01: MissingCompileTimeError
 field_initialization_order_test/none: RuntimeError
 field_override3_test/00: MissingCompileTimeError
 field_override3_test/01: MissingCompileTimeError
 field_override3_test/02: MissingCompileTimeError
 field_override3_test/03: MissingCompileTimeError
-field_override4_test/02: MissingCompileTimeError
 flatten_test/05: MissingRuntimeError
 flatten_test/08: MissingRuntimeError
 flatten_test/09: MissingRuntimeError
@@ -714,7 +669,6 @@
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
 generic_no_such_method_dispatcher_test: CompileTimeError
 generic_tearoff_test: CompileTimeError
-getter_override2_test/02: MissingCompileTimeError
 getter_override_test/00: MissingCompileTimeError
 getter_override_test/01: MissingCompileTimeError
 getter_override_test/02: MissingCompileTimeError
@@ -752,8 +706,6 @@
 method_override7_test/00: MissingCompileTimeError
 method_override7_test/01: MissingCompileTimeError
 method_override7_test/02: MissingCompileTimeError
-method_override8_test/00: MissingCompileTimeError
-method_override8_test/01: MissingCompileTimeError
 method_override_test: CompileTimeError
 minify_closure_variable_collision_test: CompileTimeError
 mint_arithmetic_test: RuntimeError # non JS number semantics
@@ -843,15 +795,9 @@
 nosuchmethod_forwarding/nosuchmethod_forwarding_test/05: RuntimeError
 nosuchmethod_forwarding/nosuchmethod_forwarding_test/06: RuntimeError
 null_no_such_method_test: CompileTimeError
-null_test/mirrors: RuntimeError
-null_test/none: RuntimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
 overridden_no_such_method_test: RuntimeError
-override_field_method1_negative_test: Fail
-override_field_method2_negative_test: Fail
-override_field_method4_negative_test: Fail
-override_field_method5_negative_test: Fail
 override_field_test/01: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError
 override_inheritance_field_test/06: CompileTimeError
@@ -860,13 +806,6 @@
 override_inheritance_generic_test/02: CompileTimeError
 override_inheritance_method_test/28: CompileTimeError
 override_inheritance_method_test/29: CompileTimeError
-override_inheritance_mixed_test/01: MissingCompileTimeError
-override_inheritance_mixed_test/02: MissingCompileTimeError
-override_inheritance_mixed_test/03: MissingCompileTimeError
-override_inheritance_mixed_test/04: MissingCompileTimeError
-override_inheritance_mixed_test/08: MissingCompileTimeError
-override_inheritance_mixed_test/09: MissingCompileTimeError
-override_method_with_field_test/01: MissingCompileTimeError
 parser_quirks_test: CompileTimeError
 redirecting_factory_default_values_test/01: MissingCompileTimeError
 redirecting_factory_default_values_test/02: MissingCompileTimeError
@@ -998,8 +937,6 @@
 bad_override_test/01: MissingCompileTimeError
 bad_override_test/02: MissingCompileTimeError
 bad_override_test/03: MissingCompileTimeError
-bad_override_test/04: MissingCompileTimeError
-bad_override_test/05: MissingCompileTimeError
 bit_operations_test: RuntimeError
 branch_canonicalization_test: RuntimeError
 call_method_implicit_tear_off_implements_function_test/02: RuntimeError
@@ -1065,8 +1002,6 @@
 cyclic_typedef_test/11: Crash # Stack Overflow
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
-deferred_constraints_constants_test/none: RuntimeError
-deferred_constraints_constants_test/reference_after_load: RuntimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
@@ -1096,14 +1031,12 @@
 fauxverride_test/03: MissingCompileTimeError
 fauxverride_test/05: MissingCompileTimeError
 field3_test/01: MissingCompileTimeError
-field_increment_bailout_test: RuntimeError
 field_initialization_order_test/01: MissingCompileTimeError
 field_initialization_order_test/none: RuntimeError
 field_override3_test/00: MissingCompileTimeError
 field_override3_test/01: MissingCompileTimeError
 field_override3_test/02: MissingCompileTimeError
 field_override3_test/03: MissingCompileTimeError
-field_override4_test/02: MissingCompileTimeError
 field_override_test/00: MissingCompileTimeError
 field_override_test/01: MissingCompileTimeError
 flatten_test/05: MissingRuntimeError
@@ -1124,6 +1057,7 @@
 function_subtype_setter0_test: RuntimeError
 function_type_alias2_test: RuntimeError
 function_type_alias4_test: RuntimeError
+generic_async_star_test: RuntimeError
 generic_closure_test/01: RuntimeError
 generic_closure_test/none: RuntimeError
 generic_function_bounds_test: RuntimeError
@@ -1147,7 +1081,6 @@
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
 generic_no_such_method_dispatcher_test: CompileTimeError
 generic_tearoff_test: CompileTimeError
-getter_override2_test/02: MissingCompileTimeError
 getter_override_test/00: MissingCompileTimeError
 getter_override_test/01: MissingCompileTimeError
 getter_override_test/02: MissingCompileTimeError
@@ -1176,7 +1109,6 @@
 int64_literal_test/none: RuntimeError
 integer_division_by_zero_test: RuntimeError # Issue 8301
 internal_library_test/02: Crash # type 'DillLibraryBuilder' is not a subtype of type 'SourceLibraryBuilder<KernelTypeBuilder, Library>' of 'value' where
-invocation_mirror2_test: RuntimeError # mirrors not supported
 invocation_mirror_invoke_on2_test: RuntimeError
 invocation_mirror_invoke_on_test: RuntimeError
 issue18628_2_test/01: MissingCompileTimeError
@@ -1210,7 +1142,6 @@
 malbounded_type_test_test/00: MissingCompileTimeError
 malbounded_type_test_test/01: MissingCompileTimeError
 malbounded_type_test_test/02: MissingCompileTimeError
-many_overridden_no_such_method_test: RuntimeError
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
@@ -1218,9 +1149,6 @@
 method_override7_test/01: MissingCompileTimeError
 method_override7_test/02: MissingCompileTimeError
 method_override7_test/03: MissingCompileTimeError
-method_override8_test/00: MissingCompileTimeError
-method_override8_test/01: MissingCompileTimeError
-method_override8_test/03: MissingCompileTimeError
 method_override_test: CompileTimeError
 minify_closure_variable_collision_test: CompileTimeError
 mint_arithmetic_test: RuntimeError # non JS number semantics
@@ -1333,21 +1261,13 @@
 nested_generic_closure_test: RuntimeError
 no_main_test/01: CompileTimeError
 no_such_method_mock_test: RuntimeError
-no_such_method_test: RuntimeError
 nosuchmethod_forwarding/nosuchmethod_forwarding_arguments_test: RuntimeError
 nosuchmethod_forwarding/nosuchmethod_forwarding_test/05: RuntimeError
 nosuchmethod_forwarding/nosuchmethod_forwarding_test/06: RuntimeError
 null_no_such_method_test: CompileTimeError
-null_test/mirrors: RuntimeError
-null_test/none: RuntimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
 operator2_negative_test: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-overridden_no_such_method_test: RuntimeError
-override_field_method1_negative_test: Fail
-override_field_method2_negative_test: Fail
-override_field_method4_negative_test: Fail
-override_field_method5_negative_test: Fail
 override_field_test/01: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
 override_field_test/03: MissingCompileTimeError
@@ -1363,13 +1283,6 @@
 override_inheritance_generic_test/02: CompileTimeError
 override_inheritance_method_test/28: CompileTimeError
 override_inheritance_method_test/29: CompileTimeError
-override_inheritance_mixed_test/01: MissingCompileTimeError
-override_inheritance_mixed_test/02: MissingCompileTimeError
-override_inheritance_mixed_test/03: MissingCompileTimeError
-override_inheritance_mixed_test/04: MissingCompileTimeError
-override_inheritance_mixed_test/08: MissingCompileTimeError
-override_inheritance_mixed_test/09: MissingCompileTimeError
-override_method_with_field_test/01: MissingCompileTimeError
 parser_quirks_test: CompileTimeError
 partial_tearoff_instantiation_test/05: Crash # Assertion failure: kind=special,memberName=instantiate,callStructure:CallStructure(arity=0, types=1)
 partial_tearoff_instantiation_test/06: Crash # Assertion failure: kind=special,memberName=instantiate,callStructure:CallStructure(arity=0, types=1)
@@ -1409,8 +1322,6 @@
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
-super_call4_test: CompileTimeError
-super_getter_setter_test: CompileTimeError
 super_no_such_method1_test: CompileTimeError
 super_no_such_method2_test: CompileTimeError
 super_no_such_method3_test: CompileTimeError
@@ -1583,8 +1494,6 @@
 bad_override_test/01: MissingCompileTimeError
 bad_override_test/02: MissingCompileTimeError
 bad_override_test/03: MissingCompileTimeError
-bad_override_test/04: MissingCompileTimeError
-bad_override_test/05: MissingCompileTimeError
 bit_operations_test: RuntimeError
 branch_canonicalization_test: RuntimeError
 call_method_implicit_tear_off_implements_function_test/02: RuntimeError
@@ -1646,8 +1555,6 @@
 cyclic_typedef_test/11: Crash # Stack Overflow
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
-deferred_constraints_constants_test/none: RuntimeError
-deferred_constraints_constants_test/reference_after_load: RuntimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
@@ -1677,14 +1584,12 @@
 fauxverride_test/03: MissingCompileTimeError
 fauxverride_test/05: MissingCompileTimeError
 field3_test/01: MissingCompileTimeError
-field_increment_bailout_test: RuntimeError
 field_initialization_order_test/01: MissingCompileTimeError
 field_initialization_order_test/none: RuntimeError
 field_override3_test/00: MissingCompileTimeError
 field_override3_test/01: MissingCompileTimeError
 field_override3_test/02: MissingCompileTimeError
 field_override3_test/03: MissingCompileTimeError
-field_override4_test/02: MissingCompileTimeError
 field_override_test/00: MissingCompileTimeError
 field_override_test/01: MissingCompileTimeError
 flatten_test/05: MissingRuntimeError
@@ -1705,6 +1610,7 @@
 function_subtype_setter0_test: RuntimeError
 function_type_alias2_test: RuntimeError
 function_type_alias4_test: RuntimeError
+generic_async_star_test: RuntimeError
 generic_function_bounds_test: RuntimeError
 generic_function_dcall_test: RuntimeError
 generic_function_type_as_type_argument_test/01: MissingCompileTimeError
@@ -1726,7 +1632,6 @@
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
 generic_no_such_method_dispatcher_test: CompileTimeError
 generic_tearoff_test: CompileTimeError
-getter_override2_test/02: MissingCompileTimeError
 getter_override_test/00: MissingCompileTimeError
 getter_override_test/01: MissingCompileTimeError
 getter_override_test/02: MissingCompileTimeError
@@ -1797,9 +1702,6 @@
 method_override7_test/01: MissingCompileTimeError
 method_override7_test/02: MissingCompileTimeError
 method_override7_test/03: MissingCompileTimeError
-method_override8_test/00: MissingCompileTimeError
-method_override8_test/01: MissingCompileTimeError
-method_override8_test/03: MissingCompileTimeError
 method_override_test: CompileTimeError
 minify_closure_variable_collision_test: CompileTimeError
 mint_arithmetic_test: RuntimeError # non JS number semantics
@@ -1921,15 +1823,9 @@
 nosuchmethod_forwarding/nosuchmethod_forwarding_test/05: RuntimeError
 nosuchmethod_forwarding/nosuchmethod_forwarding_test/06: RuntimeError
 null_no_such_method_test: CompileTimeError
-null_test/mirrors: RuntimeError
-null_test/none: RuntimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
 overridden_no_such_method_test: RuntimeError
-override_field_method1_negative_test: Fail
-override_field_method2_negative_test: Fail
-override_field_method4_negative_test: Fail
-override_field_method5_negative_test: Fail
 override_field_test/01: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
 override_field_test/03: MissingCompileTimeError
@@ -1945,13 +1841,6 @@
 override_inheritance_generic_test/02: CompileTimeError
 override_inheritance_method_test/28: CompileTimeError
 override_inheritance_method_test/29: CompileTimeError
-override_inheritance_mixed_test/01: MissingCompileTimeError
-override_inheritance_mixed_test/02: MissingCompileTimeError
-override_inheritance_mixed_test/03: MissingCompileTimeError
-override_inheritance_mixed_test/04: MissingCompileTimeError
-override_inheritance_mixed_test/08: MissingCompileTimeError
-override_inheritance_mixed_test/09: MissingCompileTimeError
-override_method_with_field_test/01: MissingCompileTimeError
 parser_quirks_test: CompileTimeError
 recursive_generic_test: RuntimeError
 redirecting_factory_default_values_test/01: MissingCompileTimeError
@@ -1990,8 +1879,6 @@
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
-super_call4_test: CompileTimeError
-super_getter_setter_test: CompileTimeError
 super_no_such_method1_test: CompileTimeError
 super_no_such_method2_test: CompileTimeError
 super_no_such_method3_test: CompileTimeError
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index ed5dedb..96bed6a 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -152,12 +152,13 @@
 regress_30121_test: CompileTimeError # Issue 31087
 regress_30339_test: CompileTimeError # As expected. Should we make this a multi test?
 reify_typevar_static_test/00: MissingCompileTimeError # Issue 29920
+setter_override2_test/02: MissingCompileTimeError # Issue 14736
 stacktrace_test: RuntimeError # Issue 29920
 string_interpolate_test: CompileTimeError
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
-super_call4_test: RuntimeError
+super_call4_test/01: MissingCompileTimeError
 super_no_such_method1_test: RuntimeError
 super_no_such_method2_test: RuntimeError
 super_no_such_method3_test: RuntimeError
@@ -294,8 +295,6 @@
 bad_override_test/01: MissingCompileTimeError
 bad_override_test/02: MissingCompileTimeError
 bad_override_test/03: MissingCompileTimeError
-bad_override_test/04: MissingCompileTimeError
-bad_override_test/05: MissingCompileTimeError
 built_in_identifier_type_annotation_test/05: RuntimeError # Issue 32194
 built_in_identifier_type_annotation_test/none: RuntimeError # Issue 32194
 call_method_as_cast_test/06: RuntimeError # Kernel allows classes to subtype `Function` so DDK elides the explicit cast.
@@ -378,7 +377,6 @@
 field_override3_test/01: MissingCompileTimeError
 field_override3_test/02: MissingCompileTimeError
 field_override3_test/03: MissingCompileTimeError
-field_override4_test/02: MissingCompileTimeError
 field_override_test/00: MissingCompileTimeError
 field_override_test/01: MissingCompileTimeError
 function_propagation_test: RuntimeError
@@ -390,7 +388,6 @@
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Warning: Superclass has no method named 'foo'.
 generic_no_such_method_dispatcher_test: CompileTimeError # Issue 31533
 generic_test/01: MissingCompileTimeError # front end does not validate `extends`
-getter_override2_test/02: MissingCompileTimeError
 getter_override_test/00: MissingCompileTimeError
 getter_override_test/01: MissingCompileTimeError
 getter_override_test/02: MissingCompileTimeError
@@ -443,9 +440,6 @@
 method_override7_test/00: MissingCompileTimeError
 method_override7_test/01: MissingCompileTimeError
 method_override7_test/02: MissingCompileTimeError
-method_override8_test/00: MissingCompileTimeError
-method_override8_test/01: MissingCompileTimeError
-method_override8_test/03: MissingCompileTimeError
 method_override_test: CompileTimeError # Issue 31616
 mixin_forwarding_constructor4_test/01: MissingCompileTimeError
 mixin_forwarding_constructor4_test/02: MissingCompileTimeError
@@ -530,10 +524,6 @@
 null_no_such_method_test: CompileTimeError # Issue 31533
 null_test/none: RuntimeError # Issue 32194
 null_to_string_test: RuntimeError # Issue 32194
-override_field_method1_negative_test: Fail
-override_field_method2_negative_test: Fail
-override_field_method4_negative_test: Fail
-override_field_method5_negative_test: Fail
 override_field_test/01: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError # Issue 31616
@@ -548,13 +538,6 @@
 override_inheritance_generic_test/02: CompileTimeError # Issue 31616
 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
-override_inheritance_mixed_test/04: MissingCompileTimeError
-override_inheritance_mixed_test/08: MissingCompileTimeError
-override_inheritance_mixed_test/09: MissingCompileTimeError
-override_method_with_field_test/01: MissingCompileTimeError
 redirecting_factory_default_values_test/01: MissingCompileTimeError
 redirecting_factory_default_values_test/02: MissingCompileTimeError
 redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
@@ -580,8 +563,6 @@
 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_getter_setter_test: CompileTimeError
 super_no_such_method1_test: CompileTimeError
 super_no_such_method2_test: CompileTimeError
 super_no_such_method3_test: CompileTimeError
@@ -640,9 +621,11 @@
 [ $compiler == dartdevc || $compiler == dartdevk ]
 abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue #30568
 abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError # Issue #30568
+async_covariant_type_test: RuntimeError # Check too late
 async_star_cancel_while_paused_test: RuntimeError # Issue 29920; Uncaught Expect.listEquals(list length, expected: <4>, actual: <3>) fails: Next element <*3>
 async_star_pause_test: RuntimeError # Uncaught Expect.listEquals(at index 2, expected: <0+>, actual: <0!>) fails
 async_star_test/02: RuntimeError
+asyncstar_covariant_type_test: RuntimeError # Check too late
 asyncstar_throw_in_catch_test: Skip # Times out. Issue 29920
 bit_operations_test: RuntimeError # No bigints on web.; Expect.equals(expected: <-25>, actual: <4294967271>) fails.
 bit_operations_test/01: MissingCompileTimeError
@@ -681,7 +664,6 @@
 expect_test: RuntimeError # Issue 29920; Expect.identical did not fail
 f_bounded_quantification3_test: RuntimeError # Issue 29920; Uncaught Error: type arguments should not be null: (F1, F2) => {
 field3_test/01: MissingCompileTimeError
-field_increment_bailout_test: RuntimeError # Issue 29920; UnimplementedError: JsInstanceMirror.delegate unimplemented
 field_initialization_order_test/none: RuntimeError # Expect.equals(expected: <b.a.ai.bi.>, actual: <b.bi.a.ai.>) fails.
 flatten_test/05: MissingRuntimeError # Issue 29920
 flatten_test/08: MissingRuntimeError # Issue 29920
@@ -702,21 +684,18 @@
 int64_literal_test/*: Skip # This is testing Dart 2.0 int64 semantics.
 integer_division_by_zero_test: RuntimeError # Issue 29920; Expect.throws: Unexpected 'Unsupported operation: Infinity'
 internal_library_test/02: Crash
-invocation_mirror2_test: RuntimeError # UnimplementedError: JsInstanceMirror.delegate unimplemented
 invocation_mirror_invoke_on2_test: RuntimeError # UnimplementedError: JsInstanceMirror.delegate unimplemented
 invocation_mirror_invoke_on_test: RuntimeError # UnimplementedError: JsInstanceMirror.delegate unimplemented
 invocation_mirror_test: RuntimeError # Type 'NativeJavaScriptObject' is not a subtype of type 'int' in strong mode
-issue21159_test: RuntimeError # Issue 30701; TypeError: method.bind is not a function
 issue23244_test: RuntimeError # Issue 29920; Uncaught Unsupported operation: only top-level functions can be spawned.
 least_upper_bound_expansive_test/none: RuntimeError # 30908; Uncaught RangeError: Maximum call stack size exceeded
 left_shift_test: RuntimeError # Ints and doubles are unified.; Expect.equals(expected: <1>, actual: <-4294967295>) fails.
 library_env_test/has_io_support: RuntimeError, OK # Intended to fail, bool.fromEnvironment("dart.library.async") is false
-library_env_test/has_mirror_support: RuntimeError, OK  # Intended to fail, bool.fromEnvironment("dart.library.async") is false
-library_env_test/has_no_html_support: RuntimeError, OK  # Intended to fail, bool.fromEnvironment("dart.library.async") is false
+library_env_test/has_mirror_support: RuntimeError, OK # Intended to fail, bool.fromEnvironment("dart.library.async") is false
+library_env_test/has_no_html_support: RuntimeError, OK # Intended to fail, bool.fromEnvironment("dart.library.async") is false
 local_function2_test/none: RuntimeError # ReferenceError: TToNull is not defined
 local_function3_test/none: RuntimeError # Expect.equals(expected: <true>, actual: <false>) fails.
 local_function_test/none: RuntimeError # Expect.equals(expected: <true>, actual: <false>) fails.
-many_overridden_no_such_method_test: RuntimeError # UnimplementedError: JsInstanceMirror.delegate unimplemented; UnimplementedError: JsInstanceMirror.delegate unimplemented
 method_override7_test/03: MissingCompileTimeError # Issue 30514
 mint_arithmetic_test: RuntimeError # Issue 29920; Expect.equals(expected: <4294967297>, actual: <1>) fails.
 modulo_test: RuntimeError # Ints and doubles are unified.; Expect.throws fails: Did not throw
@@ -727,14 +706,11 @@
 named_parameters_default_eq_test/none: RuntimeError # Expect.isTrue(false) fails.
 nan_identical_test: RuntimeError # Issue 29920; Unsupported operation: Uint64 accessor not supported by dart2js.
 nested_switch_label_test: RuntimeError # Issue 29920; UnimplementedError: node <ShadowContinueSwitchStatement> see https://github.com/dart-lang/sdk/issues/29352 `continue #L1;
-no_such_method_test: RuntimeError # UnimplementedError: JsInstanceMirror.delegate unimplemented
 null_test/mirrors: RuntimeError # Uses mirrors.; ReferenceError: GenericOfT is not defined
 number_identity2_test: RuntimeError # Issue 29920; Expect.isTrue(false) fails.
 numbers_test: RuntimeError # Issue 29920; Expect.equals(expected: <false>, actual: <true>) fails.
-overridden_no_such_method_test: RuntimeError # UnimplementedError: JsInstanceMirror.delegate unimplemented; UnimplementedError: JsInstanceMirror.delegate unimplemented
 override_field_test/03: MissingCompileTimeError
 parser_quirks_test: CompileTimeError
-private3_test: RuntimeError # Type 'PrivateSymbol' is not a subtype of type 'Symbol' in strong mode
 regress_16640_test: RuntimeError # Issue 29920; Uncaught Error: type arguments should not be null: E => {
 regress_22443_test: RuntimeError # Uncaught Expect.isTrue(false) fails.
 regress_27617_test/1: MissingCompileTimeError
@@ -748,6 +724,7 @@
 switch_label2_test: RuntimeError # Issue 29920; UnimplementedError: node <ShadowContinueSwitchStatement> see https://github.com/dart-lang/sdk/issues/29352 `continue #L1;
 switch_label_test: RuntimeError # Issue 29920; UnimplementedError: node <ShadowContinueSwitchStatement> see https://github.com/dart-lang/sdk/issues/29352 `continue #L1;
 switch_try_catch_test: RuntimeError # Issue 29920; Expect.throws: Unexpected 'UnimplementedError: node <ShadowContinueSwitchStatement> see https://github.com/dart-lang/sdk/issues/29352 `continue #L1;
+syncstar_covariant_type_test: RuntimeError # Check too late
 syntax_test/60: MissingCompileTimeError
 syntax_test/61: MissingCompileTimeError
 truncdiv_test: RuntimeError # Issue 29920; Expect.throws fails: Did not throw
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index b58c2c8..6dc969f 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -129,7 +129,6 @@
 malbounded_type_test_test/01: MissingCompileTimeError
 malbounded_type_test_test/02: MissingCompileTimeError
 method_override7_test/03: MissingCompileTimeError
-method_override8_test/03: MissingCompileTimeError
 mixin_forwarding_constructor4_test/01: MissingCompileTimeError # KernelVM bug: Issue 15101
 mixin_forwarding_constructor4_test/02: MissingCompileTimeError # KernelVM bug: Issue 15101
 mixin_forwarding_constructor4_test/03: MissingCompileTimeError # KernelVM bug: Issue 15101
@@ -171,8 +170,6 @@
 override_inheritance_field_test/48: MissingCompileTimeError
 override_inheritance_field_test/53: MissingCompileTimeError
 override_inheritance_field_test/54: MissingCompileTimeError
-override_inheritance_mixed_test/07: MissingCompileTimeError # Issue 32613
-override_inheritance_mixed_test/09: MissingCompileTimeError
 partial_tearoff_instantiation_test/05: MissingCompileTimeError
 partial_tearoff_instantiation_test/06: MissingCompileTimeError
 partial_tearoff_instantiation_test/07: MissingCompileTimeError
@@ -665,8 +662,6 @@
 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_getter_setter_test: CompileTimeError
 super_no_such_method1_test: CompileTimeError
 super_no_such_method2_test: CompileTimeError
 super_no_such_method3_test: CompileTimeError
@@ -727,7 +722,6 @@
 [ $compiler == dartkp && $mode == debug && $runtime == dart_precompiled && $strong ]
 const_instance_field_test/01: Crash # Issue 32326.
 external_test/13: Crash
-extract_type_arguments_test: Crash # Issue 33029
 type_promotion_functions_test/05: Pass
 type_promotion_functions_test/06: Pass
 type_promotion_functions_test/07: Pass
@@ -854,8 +848,6 @@
 async_star_pause_test: Fail, OK
 async_star_test/02: RuntimeError, CompileTimeError # Issue 31402 (Invocation arguments)
 bad_override_test/03: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-bad_override_test/04: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-bad_override_test/05: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 built_in_identifier_prefix_test: CompileTimeError
 call_method_implicit_tear_off_implements_function_test/05: RuntimeError
 call_method_implicit_tear_off_implements_function_test/06: RuntimeError
@@ -895,10 +887,6 @@
 deep_nesting1_negative_test: Skip # Issue 31158
 deep_nesting2_negative_test: Skip # Issue 31158
 deferred_call_empty_before_load_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
-deferred_constraints_constants_test: SkipByDesign
-deferred_constraints_constants_test/default_argument2: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 30273.
-deferred_constraints_constants_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
-deferred_constraints_constants_test/reference_after_load: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 deferred_load_constants_test/none: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
 deferred_load_library_wrong_args_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 30273.
 deferred_not_loaded_check_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
@@ -923,7 +911,6 @@
 field_override3_test/01: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 field_override3_test/02: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 field_override3_test/03: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-field_override4_test/02: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 flatten_test/05: MissingRuntimeError
 flatten_test/08: MissingRuntimeError
 flatten_test/09: MissingRuntimeError
@@ -940,7 +927,6 @@
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Issue 31533
 generic_no_such_method_dispatcher_test: CompileTimeError # Issue 31533
 generic_tearoff_test: CompileTimeError
-getter_override2_test/02: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 getter_override_test/00: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 getter_override_test/01: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 getter_override_test/02: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
@@ -1003,7 +989,6 @@
 method_override7_test/00: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 method_override7_test/01: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 method_override7_test/02: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-method_override8_test/01: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 method_override_test: CompileTimeError # Issue 31616
 mixin_illegal_super_use_test: Skip # Issues 24478 and 23773
 mixin_illegal_superclass_test: Skip # Issues 24478 and 23773
@@ -1017,9 +1002,6 @@
 null_test/mirrors: Skip # Uses mirrors.
 null_test/none: SkipByDesign
 overridden_no_such_method_test: SkipByDesign
-override_field_method2_negative_test: Fail # Issue 32613: override check is missing in CFE.
-override_field_method4_negative_test: Fail # Issue 32613: override check is missing in CFE.
-override_field_method5_negative_test: Fail # Issue 32613: override check is missing in CFE.
 override_field_test/01: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 override_inheritance_field_test/04: CompileTimeError # Issue 31616
 override_inheritance_field_test/06: CompileTimeError # Issue 31616
@@ -1028,12 +1010,6 @@
 override_inheritance_generic_test/02: CompileTimeError
 override_inheritance_method_test/28: CompileTimeError
 override_inheritance_method_test/29: CompileTimeError
-override_inheritance_mixed_test/01: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-override_inheritance_mixed_test/02: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-override_inheritance_mixed_test/03: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-override_inheritance_mixed_test/04: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-override_inheritance_mixed_test/08: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-override_inheritance_mixed_test/08: Pass # Correctly passes.
 parser_quirks_test: CompileTimeError # Issue 31533
 redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
 redirecting_factory_malbounded_test/01: MissingCompileTimeError
@@ -1058,8 +1034,6 @@
 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_getter_setter_test: CompileTimeError
 super_no_such_method1_test: CompileTimeError
 super_no_such_method2_test: CompileTimeError
 super_no_such_method3_test: CompileTimeError
@@ -1131,8 +1105,6 @@
 
 [ $compiler == fasta && $strong ]
 bad_override_test/03: MissingCompileTimeError
-bad_override_test/04: MissingCompileTimeError
-bad_override_test/05: MissingCompileTimeError
 check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
@@ -1165,14 +1137,12 @@
 field_override3_test/01: MissingCompileTimeError
 field_override3_test/02: MissingCompileTimeError
 field_override3_test/03: MissingCompileTimeError
-field_override4_test/02: MissingCompileTimeError
 generic_function_type_as_type_argument_test/01: MissingCompileTimeError
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
 generic_no_such_method_dispatcher_test: CompileTimeError
 generic_tearoff_test: CompileTimeError
-getter_override2_test/02: MissingCompileTimeError
 getter_override_test/00: MissingCompileTimeError
 getter_override_test/01: MissingCompileTimeError
 getter_override_test/02: MissingCompileTimeError
@@ -1182,8 +1152,6 @@
 method_override7_test/00: MissingCompileTimeError
 method_override7_test/01: MissingCompileTimeError
 method_override7_test/02: MissingCompileTimeError
-method_override8_test/00: MissingCompileTimeError
-method_override8_test/01: MissingCompileTimeError
 method_override_test: CompileTimeError
 mixin_illegal_super_use_test/01: MissingCompileTimeError
 mixin_illegal_super_use_test/04: MissingCompileTimeError
@@ -1227,10 +1195,6 @@
 multiline_newline_test/06: MissingCompileTimeError
 multiline_newline_test/06r: MissingCompileTimeError
 null_no_such_method_test: CompileTimeError
-override_field_method1_negative_test: Fail
-override_field_method2_negative_test: Fail
-override_field_method4_negative_test: Fail
-override_field_method5_negative_test: Fail
 override_field_test/01: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError
 override_inheritance_field_test/06: CompileTimeError
@@ -1239,12 +1203,6 @@
 override_inheritance_generic_test/02: CompileTimeError
 override_inheritance_method_test/28: CompileTimeError
 override_inheritance_method_test/29: CompileTimeError
-override_inheritance_mixed_test/01: MissingCompileTimeError
-override_inheritance_mixed_test/02: MissingCompileTimeError
-override_inheritance_mixed_test/03: MissingCompileTimeError
-override_inheritance_mixed_test/04: MissingCompileTimeError
-override_inheritance_mixed_test/08: MissingCompileTimeError
-override_method_with_field_test/01: MissingCompileTimeError
 parser_quirks_test: CompileTimeError
 regress_23089_test: Crash
 regress_23408_test: CompileTimeError
@@ -1258,8 +1216,6 @@
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
-super_call4_test: CompileTimeError
-super_getter_setter_test: CompileTimeError
 super_no_such_method1_test: CompileTimeError
 super_no_such_method2_test: CompileTimeError
 super_no_such_method3_test: CompileTimeError
@@ -1285,14 +1241,22 @@
 abstract_factory_constructor_test/00: MissingCompileTimeError
 abstract_getter_test/01: MissingCompileTimeError
 abstract_syntax_test/00: MissingCompileTimeError
+bad_override_test/04: MissingCompileTimeError
+bad_override_test/05: MissingCompileTimeError
+bug32305_test: MissingCompileTimeError
 call_method_implicit_invoke_local_test/05: MissingCompileTimeError
 closure_invoked_through_interface_target_field_test: MissingCompileTimeError
 closure_invoked_through_interface_target_getter_test: MissingCompileTimeError
 factory2_test/03: MissingCompileTimeError
+field_override4_test/02: MissingCompileTimeError
+getter_override2_test/02: MissingCompileTimeError
 implicit_this_test/01: MissingCompileTimeError
 implicit_this_test/04: MissingCompileTimeError
 invalid_override_in_mixin_test/01: MissingCompileTimeError
 map_literal1_test/01: MissingCompileTimeError
+method_override8_test/00: MissingCompileTimeError
+method_override8_test/01: MissingCompileTimeError
+method_override8_test/03: MissingCompileTimeError
 mixin_of_mixin_test/01: MissingCompileTimeError
 mixin_of_mixin_test/02: MissingCompileTimeError
 mixin_of_mixin_test/03: MissingCompileTimeError
@@ -1300,8 +1264,18 @@
 mixin_of_mixin_test/05: MissingCompileTimeError
 mixin_of_mixin_test/06: MissingCompileTimeError
 nsm5_test: MissingCompileTimeError
+override_field_method1_negative_test: Fail
+override_field_method2_negative_test: Fail
+override_field_method4_negative_test: Fail
+override_field_method5_negative_test: Fail
+override_inheritance_mixed_test/01: MissingCompileTimeError
+override_inheritance_mixed_test/02: MissingCompileTimeError
+override_inheritance_mixed_test/03: MissingCompileTimeError
+override_inheritance_mixed_test/04: MissingCompileTimeError
 override_inheritance_mixed_test/06: MissingCompileTimeError
 override_inheritance_mixed_test/07: MissingCompileTimeError
+override_inheritance_mixed_test/08: MissingCompileTimeError
+override_inheritance_mixed_test/09: MissingCompileTimeError
 override_inheritance_no_such_method_test/01: MissingCompileTimeError
 override_inheritance_no_such_method_test/05: MissingCompileTimeError
 override_inheritance_no_such_method_test/06: MissingCompileTimeError
@@ -1309,6 +1283,7 @@
 override_inheritance_no_such_method_test/09: MissingCompileTimeError
 override_inheritance_no_such_method_test/10: MissingCompileTimeError
 override_inheritance_no_such_method_test/12: MissingCompileTimeError
+override_method_with_field_test/01: MissingCompileTimeError
 prefix_import_collision_test/01: MissingCompileTimeError
 prefix_shadow_test/01: MissingCompileTimeError
 prefix_shadow_test/02: MissingCompileTimeError
@@ -1317,6 +1292,7 @@
 prefix_transitive_import_prefix_test/03: MissingCompileTimeError
 prefix_transitive_import_test/01: MissingCompileTimeError
 prefix_transitive_import_test/02: MissingCompileTimeError
+setter_override2_test/02: MissingCompileTimeError
 variable_shadow_class_test/01: MissingCompileTimeError
 
 [ $fasta && $strong ]
@@ -1378,8 +1354,6 @@
 bad_named_parameters_test/04: MissingCompileTimeError
 bad_named_parameters_test/05: MissingCompileTimeError
 bad_override_test/03: MissingCompileTimeError
-bad_override_test/04: MissingCompileTimeError
-bad_override_test/05: MissingCompileTimeError
 bad_override_test/06: MissingCompileTimeError
 built_in_identifier_type_annotation_test/22: MissingCompileTimeError
 call_constructor_on_unresolvable_class_test/01: MissingCompileTimeError
@@ -1572,7 +1546,6 @@
 field_override3_test/01: MissingCompileTimeError
 field_override3_test/02: MissingCompileTimeError
 field_override3_test/03: MissingCompileTimeError
-field_override4_test/02: MissingCompileTimeError
 field_override_test/02: MissingCompileTimeError
 field_override_test/none: MissingCompileTimeError
 field_type_check_test/01: MissingCompileTimeError
@@ -1622,7 +1595,6 @@
 getter_no_setter_test/00: MissingCompileTimeError
 getter_no_setter_test/01: MissingCompileTimeError
 getter_no_setter_test/03: MissingCompileTimeError
-getter_override2_test/02: MissingCompileTimeError
 getter_override_test/00: MissingCompileTimeError
 getter_override_test/01: MissingCompileTimeError
 getter_override_test/02: MissingCompileTimeError
@@ -1782,8 +1754,6 @@
 method_override7_test/00: MissingCompileTimeError
 method_override7_test/01: MissingCompileTimeError
 method_override7_test/02: MissingCompileTimeError
-method_override8_test/00: MissingCompileTimeError
-method_override8_test/01: MissingCompileTimeError
 mixin_illegal_constructor_test/13: MissingCompileTimeError
 mixin_illegal_constructor_test/14: MissingCompileTimeError
 mixin_illegal_constructor_test/15: MissingCompileTimeError
@@ -1896,10 +1866,6 @@
 optional_named_parameters_test/07: MissingCompileTimeError
 optional_named_parameters_test/08: MissingCompileTimeError
 optional_named_parameters_test/09: MissingCompileTimeError
-override_field_method1_negative_test: Fail
-override_field_method2_negative_test: Fail
-override_field_method4_negative_test: Fail
-override_field_method5_negative_test: Fail
 override_field_test/01: MissingCompileTimeError
 override_inheritance_abstract_test/*: Skip # Tests Dart 2 semantics
 override_inheritance_field_test/05: MissingCompileTimeError
@@ -1936,12 +1902,6 @@
 override_inheritance_method_test/31: MissingCompileTimeError
 override_inheritance_method_test/32: MissingCompileTimeError
 override_inheritance_method_test/33: MissingCompileTimeError
-override_inheritance_mixed_test/01: MissingCompileTimeError
-override_inheritance_mixed_test/02: MissingCompileTimeError
-override_inheritance_mixed_test/03: MissingCompileTimeError
-override_inheritance_mixed_test/04: MissingCompileTimeError
-override_inheritance_mixed_test/08: MissingCompileTimeError
-override_method_with_field_test/01: MissingCompileTimeError
 override_method_with_field_test/02: MissingCompileTimeError
 part2_test/01: MissingCompileTimeError
 partial_tearoff_instantiation_test/01: MissingCompileTimeError
@@ -2020,6 +1980,7 @@
 substring_test/01: MissingCompileTimeError
 super_assign_test/01: MissingCompileTimeError
 super_bound_closure_test/01: MissingCompileTimeError
+super_call4_test/01: MissingCompileTimeError
 super_operator_index_test/01: MissingCompileTimeError
 super_operator_index_test/02: MissingCompileTimeError
 super_operator_index_test/03: MissingCompileTimeError
diff --git a/tests/language_2/language_2_precompiled.status b/tests/language_2/language_2_precompiled.status
index a771e2d..58fc4e0 100644
--- a/tests/language_2/language_2_precompiled.status
+++ b/tests/language_2/language_2_precompiled.status
@@ -87,6 +87,7 @@
 bool_check_test: RuntimeError
 bool_condition_check_test: RuntimeError
 bug31436_test: RuntimeError
+bug32305_test: MissingCompileTimeError
 bug32372_test: RuntimeError
 built_in_identifier_prefix_test: CompileTimeError
 call_constructor_on_unresolvable_class_test/01: MissingCompileTimeError
@@ -910,8 +911,6 @@
 substring_test/01: MissingCompileTimeError
 super_assign_test/01: MissingCompileTimeError
 super_bound_closure_test/01: MissingCompileTimeError
-super_call4_test: CompileTimeError
-super_getter_setter_test: CompileTimeError
 super_operator_index_test/01: MissingCompileTimeError
 super_operator_index_test/02: MissingCompileTimeError
 super_operator_index_test/03: MissingCompileTimeError
diff --git a/tests/language_2/language_2_vm.status b/tests/language_2/language_2_vm.status
index b86d7b2..eb0dd41 100644
--- a/tests/language_2/language_2_vm.status
+++ b/tests/language_2/language_2_vm.status
@@ -171,6 +171,7 @@
 bad_override_test/02: MissingCompileTimeError
 bad_override_test/06: MissingCompileTimeError
 bug31436_test: RuntimeError
+bug32305_test: MissingCompileTimeError
 bug32372_test: RuntimeError
 built_in_identifier_prefix_test: CompileTimeError
 call_constructor_on_unresolvable_class_test/01: MissingCompileTimeError
@@ -918,6 +919,7 @@
 substring_test/01: MissingCompileTimeError
 super_assign_test/01: MissingCompileTimeError
 super_bound_closure_test/01: MissingCompileTimeError
+super_call4_test/01: MissingCompileTimeError
 super_operator_index_test/01: MissingCompileTimeError
 super_operator_index_test/02: MissingCompileTimeError
 super_operator_index_test/03: MissingCompileTimeError
@@ -1134,6 +1136,7 @@
 function_type_alias6_test/none: RuntimeError
 invalid_override_in_mixin_test/01: MissingCompileTimeError
 type_literal_prefix_call_test: RuntimeError
+vm/regress_33040_instantiation_test: RuntimeError
 
 # The VM and does not implement the Dart 2.0 runtime checks yet unless
 # --checked is explicitly passed).
diff --git a/tests/language_2/many_overridden_no_such_method_test.dart b/tests/language_2/many_overridden_no_such_method_test.dart
index a9eb62e..d1230e6 100644
--- a/tests/language_2/many_overridden_no_such_method_test.dart
+++ b/tests/language_2/many_overridden_no_such_method_test.dart
@@ -5,7 +5,6 @@
 
 library OverriddenNoSuchMethodTest.dart;
 
-import "dart:mirrors" show reflect;
 import "package:expect/expect.dart";
 
 part "overridden_no_such_method.dart";
diff --git a/tests/language_2/no_such_method_test.dart b/tests/language_2/no_such_method_test.dart
index f9a52b1..f38285a 100644
--- a/tests/language_2/no_such_method_test.dart
+++ b/tests/language_2/no_such_method_test.dart
@@ -3,34 +3,22 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program testing that NoSuchMethod is properly called.
 
-import "dart:mirrors" show reflect;
 import "package:expect/expect.dart";
 
-class GetName {
-  foo({a, b}) => "foo";
-  moo({b}) => "moo";
-}
-
-String getName(im) => reflect(new GetName()).delegate(im);
-
 class NoSuchMethodTest {
   foo({a: 10, b: 20}) {
     return (10 * a) + b;
   }
 
   noSuchMethod(Invocation im) {
-    Expect.equals("moo", getName(im));
+    Expect.equals(#moo, im.memberName);
     Expect.equals(0, im.positionalArguments.length);
     Expect.equals(1, im.namedArguments.length);
     return foo(b: im.namedArguments[const Symbol("b")]);
   }
-
-  static testMain() {
-    var obj = new NoSuchMethodTest() as dynamic;
-    Expect.equals(199, obj.moo(b: 99)); // obj.NoSuchMethod called here.
-  }
 }
 
 main() {
-  NoSuchMethodTest.testMain();
+  var obj = new NoSuchMethodTest() as dynamic;
+  Expect.equals(199, obj.moo(b: 99)); // obj.NoSuchMethod called here.
 }
diff --git a/tests/language_2/null_test.dart b/tests/language_2/null_test.dart
index ba3459d..10e37fa 100644
--- a/tests/language_2/null_test.dart
+++ b/tests/language_2/null_test.dart
@@ -5,7 +5,6 @@
 
 // VMOptions=--optimization-counter-threshold=5
 
-import "dart:mirrors";
 import "package:expect/expect.dart";
 
 class BadInherit
@@ -171,18 +170,6 @@
   Expect.isFalse(compareWithNull(val));
   Expect.isTrue(compareWithNull(obj));
 
-  ClassMirror cm = reflectClass(Null);
-
-  InstanceMirror im1 = reflect(null);
-  Expect.equals(cm, im1.type);
-  Expect.isTrue(im1.invoke(const Symbol("=="), [null]).reflectee);//# mirrors: ok
-  Expect.isFalse(im1.invoke(const Symbol("=="), [42]).reflectee); //# mirrors: ok
-
-  InstanceMirror im2 = reflect(obj);
-  Expect.equals(cm, im2.type);
-  Expect.isTrue(im2.invoke(const Symbol("=="), [null]).reflectee);//# mirrors: ok
-  Expect.isFalse(im2.invoke(const Symbol("=="), [42]).reflectee); //# mirrors: ok
-
   // Method/value extraction. The runtimeType was checked above, and operator==
   // cannot be extracted.
   // Currently fails in VM.
diff --git a/tests/language_2/overridden_no_such_method.dart b/tests/language_2/overridden_no_such_method.dart
index c9a98bc..9e86672 100644
--- a/tests/language_2/overridden_no_such_method.dart
+++ b/tests/language_2/overridden_no_such_method.dart
@@ -5,17 +5,11 @@
 
 part of OverriddenNoSuchMethodTest.dart;
 
-class GetName {
-  foo(a, b) => "foo";
-}
-
-String getName(im) => reflect(new GetName()).delegate(im);
-
 class OverriddenNoSuchMethod {
   OverriddenNoSuchMethod() {}
 
   noSuchMethod(Invocation mirror) {
-    Expect.equals("foo", getName(mirror));
+    Expect.equals(#foo, mirror.memberName);
     // 'foo' was called with two parameters (not counting receiver).
     List args = mirror.positionalArguments;
     Expect.equals(2, args.length);
diff --git a/tests/language_2/overridden_no_such_method_test.dart b/tests/language_2/overridden_no_such_method_test.dart
index 9c7fe12..3aa37be 100644
--- a/tests/language_2/overridden_no_such_method_test.dart
+++ b/tests/language_2/overridden_no_such_method_test.dart
@@ -5,7 +5,6 @@
 
 library OverriddenNoSuchMethodTest.dart;
 
-import "dart:mirrors" show reflect;
 import "package:expect/expect.dart";
 part "overridden_no_such_method.dart";
 
diff --git a/tests/language_2/setter_override2_test.dart b/tests/language_2/setter_override2_test.dart
index 6249764..80902b7 100644
--- a/tests/language_2/setter_override2_test.dart
+++ b/tests/language_2/setter_override2_test.dart
@@ -12,7 +12,7 @@
 class A {
   var foo = 42; // //# 00: ok
   get foo => 42; // //# 01: ok
-  foo() => 42; // //# 02: ok
+  foo() => 42; // //# 02: compile-time error
   set foo(value) {} // //# 03: ok
 }
 
diff --git a/tests/language_2/super_call4_test.dart b/tests/language_2/super_call4_test.dart
index 239339a..dbff2ea 100644
--- a/tests/language_2/super_call4_test.dart
+++ b/tests/language_2/super_call4_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:mirrors" show reflect;
 import "package:expect/expect.dart";
 
 // Checks that noSuchMethod is resolved in the super class and not in the
@@ -16,50 +15,26 @@
   bool baz({int b});
   bool boz(int a, {int c});
 
-  bool noSuchMethod(Invocation im) {
-    if (im.memberName == const Symbol('foo')) {
-      return im.positionalArguments.isEmpty &&
-          im.namedArguments.isEmpty &&
-          reflect(e).delegate(im);
-    }
-    if (im.memberName == const Symbol('bar')) {
-      return im.positionalArguments.length == 1 &&
-          im.namedArguments.isEmpty &&
-          reflect(e).delegate(im);
-    }
-    if (im.memberName == const Symbol('baz')) {
-      return im.positionalArguments.isEmpty &&
-          im.namedArguments.length == 1 &&
-          reflect(e).delegate(im);
-    }
-    if (im.memberName == const Symbol('boz')) {
-      return im.positionalArguments.length == 1 &&
-          im.namedArguments.length == 1 &&
-          reflect(e).delegate(im);
-    }
-    return false;
-  }
+  bool noSuchMethod(Invocation im) => true;
 }
 
 class D extends C {
-  bool noSuchMethod(Invocation im) {
-    return false;
-  }
+  bool noSuchMethod(Invocation im) => false;
 
   test1() {
-    return super.foo();
+    return super.foo(); //# 01: compile-time error
   }
 
   test2() {
-    return super.bar(1);
+    return super.bar(1); //# 01: compile-time error
   }
 
   test3() {
-    return super.baz(b: 2);
+    return super.baz(b: 2); //# 01: compile-time error
   }
 
   test4() {
-    return super.boz(1, c: 2);
+    return super.boz(1, c: 2); //# 01: compile-time error
   }
 }
 
@@ -72,8 +47,8 @@
 
 main() {
   var d = new D();
-  Expect.isTrue(d.test1());
-  Expect.isTrue(d.test2());
-  Expect.isTrue(d.test3());
-  Expect.isTrue(d.test4());
+  Expect.isNull(d.test1());
+  Expect.isNull(d.test2());
+  Expect.isNull(d.test3());
+  Expect.isNull(d.test4());
 }
diff --git a/tests/language_2/super_getter_setter_test.dart b/tests/language_2/super_getter_setter_test.dart
deleted file mode 100644
index 736957a..0000000
--- a/tests/language_2/super_getter_setter_test.dart
+++ /dev/null
@@ -1,126 +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.
-
-import 'dart:mirrors';
-
-import "package:expect/expect.dart";
-
-class A {
-  var missingSetterField;
-  var missingGetterField;
-  var getterInSuperClassField;
-  var setterInSuperClassField;
-  var getterSetterField;
-  var missingAllField;
-  var indexField = new List(2);
-
-  set setterInSuperClass(a) {
-    setterInSuperClassField = a;
-  }
-
-  get getterInSuperClass => getterInSuperClassField;
-}
-
-class B extends A {
-  get missingSetter => missingSetterField;
-  get setterInSuperClass => setterInSuperClassField;
-
-  set missingGetter(a) {
-    missingGetterField = a;
-  }
-
-  set getterInSuperClass(a) {
-    getterInSuperClassField = a;
-  }
-
-  get getterSetter => getterSetterField;
-  set getterSetter(a) {
-    getterSetterField = a;
-  }
-
-  operator [](index) => indexField[index];
-  operator []=(index, value) {
-    indexField[index] = value;
-  }
-
-  set missingSetter(a);
-  get missingGetter;
-
-  set missingAll(a);
-  get missingAll;
-
-  noSuchMethod(Invocation im) {
-    String name = MirrorSystem.getName(im.memberName);
-    if (name.startsWith('missingSetter')) {
-      Expect.isTrue(im.isSetter);
-      missingSetterField = im.positionalArguments[0];
-    } else if (name.startsWith('missingGetter')) {
-      Expect.isTrue(im.isGetter);
-      return missingGetterField;
-    } else if (name.startsWith('missingAll') && im.isGetter) {
-      return missingAllField;
-    } else if (name.startsWith('missingAll') && im.isSetter) {
-      missingAllField = im.positionalArguments[0];
-    } else {
-      Expect.fail('Should not reach here');
-    }
-  }
-}
-
-class C extends B {
-  test() {
-    Expect.equals(42, super.missingSetter = 42);
-    Expect.equals(42, super.missingSetter);
-    Expect.equals(43, super.missingSetter += 1);
-    Expect.equals(43, super.missingSetter);
-    Expect.equals(43, super.missingSetter++);
-    Expect.equals(44, super.missingSetter);
-
-    Expect.equals(42, super.missingGetter = 42);
-    Expect.equals(42, super.missingGetter);
-    Expect.equals(43, super.missingGetter += 1);
-    Expect.equals(43, super.missingGetter);
-    Expect.equals(43, super.missingGetter++);
-    Expect.equals(44, super.missingGetter);
-
-    Expect.equals(42, super.setterInSuperClass = 42);
-    Expect.equals(42, super.setterInSuperClass);
-    Expect.equals(43, super.setterInSuperClass += 1);
-    Expect.equals(43, super.setterInSuperClass);
-    Expect.equals(43, super.setterInSuperClass++);
-    Expect.equals(44, super.setterInSuperClass);
-
-    Expect.equals(42, super.getterInSuperClass = 42);
-    Expect.equals(42, super.getterInSuperClass);
-    Expect.equals(43, super.getterInSuperClass += 1);
-    Expect.equals(43, super.getterInSuperClass);
-    Expect.equals(43, super.getterInSuperClass++);
-    Expect.equals(44, super.getterInSuperClass);
-
-    Expect.equals(42, super.missingAll = 42);
-    Expect.equals(42, super.missingAll);
-    Expect.equals(43, super.missingAll += 1);
-    Expect.equals(43, super.missingAll);
-    Expect.equals(43, super.missingAll++);
-    Expect.equals(44, super.missingAll);
-
-    Expect.equals(42, super[0] = 42);
-    Expect.equals(42, super[0]);
-    Expect.equals(43, super[0] += 1);
-    Expect.equals(43, super[0]);
-    Expect.equals(43, super[0]++);
-    Expect.equals(44, super[0]);
-
-    Expect.equals(2, super[0] = 2);
-    Expect.equals(2, super[0]);
-    Expect.equals(3, super[0] += 1);
-    Expect.equals(3, super[0]);
-    Expect.equals(3, super[0]++);
-    Expect.equals(4, super[0]);
-  }
-}
-
-main() {
-  new C().test();
-}
diff --git a/tests/language_2/syncstar_covariant_type_test.dart b/tests/language_2/syncstar_covariant_type_test.dart
new file mode 100644
index 0000000..efae12a
--- /dev/null
+++ b/tests/language_2/syncstar_covariant_type_test.dart
@@ -0,0 +1,19 @@
+// 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.
+
+// Test that TypeErrors happen for sync* methods without creating iterator.
+
+import 'package:expect/expect.dart';
+
+class D<T> {
+  // Parametric covariance check is usually compiled into method.
+  Iterable<T> add(T n) sync* {
+    yield n;
+  }
+}
+
+main() {
+  D<num> d = new D<int>();
+  Expect.throwsTypeError(() => d.add(4.6));
+}
diff --git a/tests/language_2/syncstar_dcall_type_test.dart b/tests/language_2/syncstar_dcall_type_test.dart
new file mode 100644
index 0000000..5561419
--- /dev/null
+++ b/tests/language_2/syncstar_dcall_type_test.dart
@@ -0,0 +1,27 @@
+// 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.
+
+// Test that TypeErrors happen for sync* methods without creating iterator.
+
+import 'package:expect/expect.dart';
+
+Iterable<int> iota(int n) sync* {
+  for (int i = 0; i < n; i++) yield i;
+}
+
+class C {
+  Iterable<int> add(int n) sync* {
+    yield n;
+  }
+}
+
+main() {
+  dynamic f = iota;
+  Expect.throwsTypeError(() => f('ten'));
+  Expect.throwsTypeError(() => f(4.7));
+
+  dynamic o = new C();
+  Expect.throwsTypeError(() => o.add('ten'));
+  Expect.throwsTypeError(() => o.add(4.7));
+}
diff --git a/tests/language_2/vm/regress_33025_test.dart b/tests/language_2/vm/regress_33025_test.dart
new file mode 100644
index 0000000..4b083c3
--- /dev/null
+++ b/tests/language_2/vm/regress_33025_test.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.
+
+// Verify that VM correctly handles function type arguments across
+// yield points.
+
+import "package:expect/expect.dart";
+
+void main() {
+  doStuff<String>();
+}
+
+doStuff<T>() async {
+  Expect.equals(String, T);
+  await null;
+  Expect.equals(String, T);
+}
diff --git a/tests/language_2/vm/regress_33040_instantiation_test.dart b/tests/language_2/vm/regress_33040_instantiation_test.dart
new file mode 100644
index 0000000..0b15de0
--- /dev/null
+++ b/tests/language_2/vm/regress_33040_instantiation_test.dart
@@ -0,0 +1,35 @@
+// 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.
+//
+// Exact regression test for issue #33040.
+
+import 'dart:async';
+
+class Optional<T> {}
+
+typedef T ConvertFunction<T>();
+
+T blockingLatest<T>() {
+  return null;
+}
+
+abstract class ObservableModel<T> {}
+
+abstract class AsyncValueMixin<T> {
+  Future<T> get asyncValue {
+    ConvertFunction<T> f = blockingLatest;
+    if (f is! ConvertFunction<T>) throw "error";
+    return null;
+  }
+}
+
+abstract class OptionalSettableObservableModel<T>
+    extends ObservableModel<Optional<T>> with AsyncValueMixin<Optional<T>> {}
+
+class FooObservableModel extends OptionalSettableObservableModel<int> {}
+
+Future<void> main() async {
+  var model = new FooObservableModel();
+  await model.asyncValue;
+}
diff --git a/tests/language_2/vm/regress_33040_test.dart b/tests/language_2/vm/regress_33040_test.dart
new file mode 100644
index 0000000..8b595bf
--- /dev/null
+++ b/tests/language_2/vm/regress_33040_test.dart
@@ -0,0 +1,39 @@
+// 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.
+
+// Verify that prefix sharing optimization is taken into account when
+// concatenating type arguments vectors.
+
+import "package:expect/expect.dart";
+
+class C0 {}
+
+class C1 {}
+
+class C2 {}
+
+class C3 {}
+
+class Wrong {}
+
+void bar<T0, T1>() {
+  void baz<T2, T3>() {
+    Expect.equals(C0, T0);
+    Expect.equals(C1, T1);
+    Expect.equals(C2, T2);
+    Expect.equals(C3, T3);
+  }
+
+  baz<C2, C3>();
+}
+
+class A<X, Y, Z> {
+  void foo() {
+    bar<X, Y>();
+  }
+}
+
+void main() {
+  new A<C0, C1, Wrong>().foo();
+}
diff --git a/tests/lib_2/html/mirrors_js_typed_interop_test.dart b/tests/lib_2/html/mirrors_js_typed_interop_test.dart
index e877295..e4358a7 100644
--- a/tests/lib_2/html/mirrors_js_typed_interop_test.dart
+++ b/tests/lib_2/html/mirrors_js_typed_interop_test.dart
@@ -1,6 +1,10 @@
 // Copyright (c) 2015, 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.
+// dartdevcOptions=--emit-metadata
+
+// TODO(jmesserly): delete this test file once `dart:mirrors` is fully diabled
+// in dart4web compilers.
 
 @JS()
 library tests.html.mirrors_js_typed_interop_test;
diff --git a/tests/lib_2/lib_2.status b/tests/lib_2/lib_2.status
index 879596b..570bc93 100644
--- a/tests/lib_2/lib_2.status
+++ b/tests/lib_2/lib_2.status
@@ -250,6 +250,7 @@
 isolate/message3_test/fun: Pass, Fail # Closure identity
 isolate/spawn_uri_nested_vm_test: Pass, Crash # Issue 28192
 mirrors/closurization_equivalence_test: SkipByDesign # Method equality
+mirrors/deferred_constraints_constants_test: Crash # Requires deferred libraries
 mirrors/deferred_mirrors_metadata_test: Crash # Deferred loading
 mirrors/deferred_mirrors_metatarget_test: Crash # Deferred loading
 mirrors/deferred_mirrors_update_test: Crash # Deferred loading
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index db296c2..e9c9f60 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -17,6 +17,7 @@
 
 [ $fasta ]
 isolate/compile_time_error_test/01: MissingCompileTimeError
+mirrors/deferred_constraints_constants_test/default_argument2: MissingCompileTimeError
 mirrors/generic_bounded_by_type_parameter_test/02: MissingCompileTimeError
 mirrors/generic_bounded_test/01: MissingCompileTimeError
 mirrors/generic_bounded_test/02: MissingCompileTimeError
@@ -95,6 +96,7 @@
 isolate/spawn_uri_nested_vm_test: Pass, Timeout
 isolate/static_function_test: Skip # Times out. Issue 31855. CompileTimeError. Issue 31402
 mirrors/abstract_class_test: RuntimeError
+mirrors/apply3_test: RuntimeError
 mirrors/class_declarations_test/01: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/class_declarations_test/none: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/class_mirror_location_test: RuntimeError
@@ -118,14 +120,11 @@
 mirrors/generic_interface_test/none: RuntimeError
 mirrors/generic_mixin_applications_test: RuntimeError
 mirrors/generic_mixin_test: RuntimeError
-mirrors/generics_double_substitution_test/01: RuntimeError
-mirrors/generics_double_substitution_test/none: RuntimeError
 mirrors/generics_dynamic_test: RuntimeError
-mirrors/generics_substitution_test: RuntimeError
-mirrors/generics_test/none: RuntimeError
 mirrors/hot_get_field_test: RuntimeError
 mirrors/hot_set_field_test: RuntimeError
 mirrors/intercepted_object_test: RuntimeError # Issue 31402 (Invocation arguments)
+mirrors/invocation_fuzz_test: RuntimeError, Crash
 mirrors/invoke_private_test: RuntimeError
 mirrors/invoke_private_wrong_library_test: RuntimeError
 mirrors/library_declarations_test/none: RuntimeError # Issue 31402 (Invocation arguments)
@@ -165,10 +164,7 @@
 mirrors/other_declarations_location_test: RuntimeError
 mirrors/parameter_annotation_mirror_test: RuntimeError
 mirrors/parameter_metadata_test: RuntimeError
-mirrors/parameter_metadata_test: Crash
 mirrors/parameter_of_mixin_app_constructor_test: RuntimeError # Issue 31402 (Invocation arguments)
-mirrors/parameter_test/01: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/parameter_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/private_class_field_test: RuntimeError
 mirrors/private_field_test: RuntimeError
 mirrors/private_symbol_test: RuntimeError
@@ -194,7 +190,6 @@
 mirrors/symbol_validation_test/none: RuntimeError # Issue 31537
 mirrors/type_variable_is_static_test: RuntimeError
 mirrors/type_variable_owner_test/01: RuntimeError
-mirrors/typearguments_mirror_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/typedef_deferred_library_test: CompileTimeError # Deferred loading kernel issue 28335.
 mirrors/typedef_deferred_library_test: RuntimeError
 mirrors/typedef_in_signature_test: RuntimeError
@@ -223,44 +218,29 @@
 isolate/ping_pause_test: RuntimeError
 isolate/request_reply_test: Pass, Timeout
 isolate/stacktrace_message_test: RuntimeError
-mirrors/class_mirror_type_variables_test: RuntimeError
 mirrors/constructor_optional_args_test: RuntimeError
 mirrors/constructors_test: RuntimeError
+mirrors/deferred_constraints_constants_test/default_argument2: Pass
 mirrors/fake_function_with_call_test: RuntimeError
-mirrors/generic_bounded_by_type_parameter_test/none: RuntimeError
-mirrors/generic_bounded_test/none: RuntimeError
-mirrors/generic_f_bounded_test/01: RuntimeError
-mirrors/generic_f_bounded_test/none: RuntimeError
-mirrors/generic_local_function_test: RuntimeError
 mirrors/generic_superclass_test/01: RuntimeError
 mirrors/generic_superclass_test/none: RuntimeError
-mirrors/generic_type_mirror_test: RuntimeError
 mirrors/hierarchy_invariants_test: RuntimeError
 mirrors/immutable_collections_test: RuntimeError
-mirrors/initializing_formals_test/01: RuntimeError
-mirrors/initializing_formals_test/03: RuntimeError
-mirrors/initializing_formals_test/none: RuntimeError
 mirrors/instance_members_easier_test: RuntimeError
 mirrors/instance_members_test: RuntimeError
 mirrors/instance_members_unimplemented_interface_test: RuntimeError
 mirrors/instance_members_with_override_test: RuntimeError
-mirrors/instantiate_abstract_class_test: RuntimeError
 mirrors/invoke_closurization2_test: RuntimeError
 mirrors/invoke_throws_test: RuntimeError
-mirrors/library_imports_bad_metadata_test/none: RuntimeError, Crash # Issue 32879
 mirrors/metadata_const_map_test: Crash
 mirrors/mixin_members_test: RuntimeError
 mirrors/null_test: RuntimeError
 mirrors/operator_test: RuntimeError
-mirrors/parameter_is_const_test/none: RuntimeError
-mirrors/parameter_test/01: RuntimeError
-mirrors/parameter_test/none: RuntimeError
 mirrors/redirecting_factory_different_type_test/02: MissingCompileTimeError
 mirrors/redirecting_factory_different_type_test/none: RuntimeError
+mirrors/redirecting_factory_reflection_test: RuntimeError
 mirrors/regress_16321_test/none: Crash
 mirrors/top_level_accessors_test/01: MissingCompileTimeError
-mirrors/type_argument_is_type_variable_test: RuntimeError
-mirrors/typearguments_mirror_test: RuntimeError
 
 # Enabling of dartk for sim{arm,arm64,dbc64} revealed these test failures, which
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
diff --git a/tests/lib_2/mirrors/apply3_test.dart b/tests/lib_2/mirrors/apply3_test.dart
new file mode 100644
index 0000000..d96fa0d
--- /dev/null
+++ b/tests/lib_2/mirrors/apply3_test.dart
@@ -0,0 +1,69 @@
+// 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.
+
+// Test [Function.apply] on user-defined classes that implement [noSuchMethod].
+
+import "package:expect/expect.dart";
+import 'dart:mirrors';
+
+class F {
+  call([p1]) => "call";
+  noSuchMethod(Invocation invocation) => "NSM";
+}
+
+class G {
+  call() => '42';
+  noSuchMethod(Invocation invocation) => invocation;
+}
+
+class H {
+  call(required, {a}) => required + a;
+}
+
+main() {
+  Expect.equals('call', Function.apply(new F(), []));
+  Expect.equals('call', Function.apply(new F(), [1]));
+  Expect.equals('NSM', Function.apply(new F(), [1, 2]));
+  Expect.equals('NSM', Function.apply(new F(), [1, 2, 3]));
+
+  var symbol = const Symbol('a');
+  var requiredParameters = [1];
+  var optionalParameters = new Map<Symbol, int>()..[symbol] = 42;
+  Invocation i =
+      Function.apply(new G(), requiredParameters, optionalParameters);
+
+  Expect.equals(const Symbol('call'), i.memberName);
+  Expect.listEquals(requiredParameters, i.positionalArguments);
+  Expect.mapEquals(optionalParameters, i.namedArguments);
+  Expect.isTrue(i.isMethod);
+  Expect.isFalse(i.isGetter);
+  Expect.isFalse(i.isSetter);
+  Expect.isFalse(i.isAccessor);
+
+  // Check that changing the passed list and map for parameters does
+  // not affect [i].
+  requiredParameters[0] = 42;
+  optionalParameters[symbol] = 12;
+  Expect.listEquals([1], i.positionalArguments);
+  Expect.mapEquals(new Map()..[symbol] = 42, i.namedArguments);
+
+  // Check that using [i] for invocation yields the same [Invocation]
+  // object.
+  var mirror = reflect(new G());
+  Invocation other = mirror.delegate(i);
+  Expect.equals(i.memberName, other.memberName);
+  Expect.listEquals(i.positionalArguments, other.positionalArguments);
+  Expect.mapEquals(i.namedArguments, other.namedArguments);
+  Expect.equals(i.isMethod, other.isMethod);
+  Expect.equals(i.isGetter, other.isGetter);
+  Expect.equals(i.isSetter, other.isSetter);
+  Expect.equals(i.isAccessor, other.isAccessor);
+
+  // Test that [i] can be used to hit an existing method.
+  Expect.equals(43, new H().call(1, a: 42));
+  Expect.equals(43, Function.apply(new H(), [1], new Map()..[symbol] = 42));
+  mirror = reflect(new H());
+  Expect.equals(43, mirror.delegate(i));
+  Expect.equals(43, mirror.delegate(other));
+}
diff --git a/tests/lib_2/mirrors/const_evaluation_test.dart b/tests/lib_2/mirrors/const_evaluation_test.dart
new file mode 100644
index 0000000..be27133
--- /dev/null
+++ b/tests/lib_2/mirrors/const_evaluation_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Check that compile-time evaluation of constants is consistent with runtime
+// evaluation.
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+const top_const = identical(-0.0, 0);
+
+@top_const
+class C {}
+
+void main() {
+  var local_var = identical(-0.0, 0);
+  var metadata = reflectClass(C).metadata[0].reflectee;
+  Expect.equals(top_const, metadata);
+  Expect.equals(local_var, metadata);
+}
diff --git a/tests/language_2/deferred_constraints_constants_lib.dart b/tests/lib_2/mirrors/deferred_constraints_constants_lib.dart
similarity index 100%
rename from tests/language_2/deferred_constraints_constants_lib.dart
rename to tests/lib_2/mirrors/deferred_constraints_constants_lib.dart
diff --git a/tests/language_2/deferred_constraints_constants_test.dart b/tests/lib_2/mirrors/deferred_constraints_constants_test.dart
similarity index 91%
rename from tests/language_2/deferred_constraints_constants_test.dart
rename to tests/lib_2/mirrors/deferred_constraints_constants_test.dart
index c975f51..053bb81 100644
--- a/tests/language_2/deferred_constraints_constants_test.dart
+++ b/tests/lib_2/mirrors/deferred_constraints_constants_test.dart
@@ -61,9 +61,9 @@
     var h3 = new H3();
 
     // Need to access the metadata to trigger the expected compilation error.
-    reflectClass(H1).metadata; // metadata1: continued
-    reflectClass(H2).metadata; // metadata2: continued
-    reflectClass(H3).metadata; // metadata3: continued
+    reflectClass(H1).metadata; //# metadata1: continued
+    reflectClass(H2).metadata; //# metadata2: continued
+    reflectClass(H3).metadata; //# metadata3: continued
 
     asyncEnd();
   });
diff --git a/tests/language_2/enum_mirror_test.dart b/tests/lib_2/mirrors/enum_mirror_test.dart
similarity index 100%
rename from tests/language_2/enum_mirror_test.dart
rename to tests/lib_2/mirrors/enum_mirror_test.dart
diff --git a/tests/language_2/instance_creation_in_function_annotation_test.dart b/tests/lib_2/mirrors/instance_creation_in_function_annotation_test.dart
similarity index 100%
rename from tests/language_2/instance_creation_in_function_annotation_test.dart
rename to tests/lib_2/mirrors/instance_creation_in_function_annotation_test.dart
diff --git a/tests/language_2/invocation_mirror_invoke_on2_test.dart b/tests/lib_2/mirrors/invocation_mirror_invoke_on2_test.dart
similarity index 100%
rename from tests/language_2/invocation_mirror_invoke_on2_test.dart
rename to tests/lib_2/mirrors/invocation_mirror_invoke_on2_test.dart
diff --git a/tests/language_2/invocation_mirror_invoke_on_test.dart b/tests/lib_2/mirrors/invocation_mirror_invoke_on_test.dart
similarity index 100%
rename from tests/language_2/invocation_mirror_invoke_on_test.dart
rename to tests/lib_2/mirrors/invocation_mirror_invoke_on_test.dart
diff --git a/tests/language_2/issue21079_test.dart b/tests/lib_2/mirrors/issue21079_test.dart
similarity index 100%
rename from tests/language_2/issue21079_test.dart
rename to tests/lib_2/mirrors/issue21079_test.dart
diff --git a/tests/lib_2/mirrors/null_test.dart b/tests/lib_2/mirrors/null_test.dart
index a194656..de6b459 100644
--- a/tests/lib_2/mirrors/null_test.dart
+++ b/tests/lib_2/mirrors/null_test.dart
@@ -2,13 +2,31 @@
 // 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 test.null_test;
+// VMOptions=--optimization-counter-threshold=5
 
-import 'dart:mirrors';
+import "dart:mirrors";
+import "package:expect/expect.dart";
 
-import 'package:expect/expect.dart';
+void main() {
+  for (int i = 0; i < 10; i++) {
+    test();
+  }
+}
 
-main() {
+void test() {
+  ClassMirror cm = reflectClass(Null);
+
+  InstanceMirror im1 = reflect(null);
+  Expect.equals(cm, im1.type);
+  Expect.isTrue(im1.invoke(const Symbol("=="), [null]).reflectee);
+  Expect.isFalse(im1.invoke(const Symbol("=="), [42]).reflectee);
+
+  var obj = confuse(null); // Null value that isn't known at compile-time.
+  InstanceMirror im2 = reflect(obj);
+  Expect.equals(cm, im2.type);
+  Expect.isTrue(im2.invoke(const Symbol("=="), [null]).reflectee);
+  Expect.isFalse(im2.invoke(const Symbol("=="), [42]).reflectee);
+
   InstanceMirror nullMirror = reflect(null);
   Expect.isTrue(nullMirror.getField(#hashCode).reflectee is int);
   Expect.equals(null.hashCode, nullMirror.getField(#hashCode).reflectee);
@@ -16,8 +34,8 @@
   Expect.isTrue(nullMirror.invoke(#==, [null]).reflectee);
   Expect.isFalse(nullMirror.invoke(#==, [new Object()]).reflectee);
   Expect.equals('null', nullMirror.invoke(#toString, []).reflectee);
-  Expect.throwsNoSuchMethodError(() => nullMirror.invoke(#notDefined, []),
-      'noSuchMethod');
+  Expect.throwsNoSuchMethodError(
+      () => nullMirror.invoke(#notDefined, []), 'noSuchMethod');
 
   ClassMirror NullMirror = nullMirror.type;
   Expect.equals(reflectClass(Null), NullMirror);
@@ -38,3 +56,16 @@
   }
   Expect.equals(coreLibrary, NullMirror.owner);
 }
+
+// Magic incantation to avoid the compiler recognizing the constant values
+// at compile time. If the result is computed at compile time, the dynamic code
+// will not be tested.
+confuse(x) {
+  try {
+    if (new DateTime.now().millisecondsSinceEpoch == 42) x = 42;
+    throw [x];
+  } on dynamic catch (e) {
+    return e[0];
+  }
+  return 42;
+}
diff --git a/tests/language_2/redirecting_factory_reflection_test.dart b/tests/lib_2/mirrors/redirecting_factory_reflection_test.dart
similarity index 100%
rename from tests/language_2/redirecting_factory_reflection_test.dart
rename to tests/lib_2/mirrors/redirecting_factory_reflection_test.dart
diff --git a/tests/language_2/regress_13462_0_test.dart b/tests/lib_2/mirrors/regress_13462_0_test.dart
similarity index 100%
rename from tests/language_2/regress_13462_0_test.dart
rename to tests/lib_2/mirrors/regress_13462_0_test.dart
diff --git a/tests/language_2/regress_13462_1_test.dart b/tests/lib_2/mirrors/regress_13462_1_test.dart
similarity index 100%
rename from tests/language_2/regress_13462_1_test.dart
rename to tests/lib_2/mirrors/regress_13462_1_test.dart
diff --git a/tests/language_2/regress_18535_test.dart b/tests/lib_2/mirrors/regress_18535_test.dart
similarity index 100%
rename from tests/language_2/regress_18535_test.dart
rename to tests/lib_2/mirrors/regress_18535_test.dart
diff --git a/tests/language_2/regress_28255_test.dart b/tests/lib_2/mirrors/regress_28255_test.dart
similarity index 100%
rename from tests/language_2/regress_28255_test.dart
rename to tests/lib_2/mirrors/regress_28255_test.dart
diff --git a/tests/standalone/io/file_invalid_arguments_test.dart b/tests/standalone/io/file_invalid_arguments_test.dart
index 1c467f0..94e3a22 100644
--- a/tests/standalone/io/file_invalid_arguments_test.dart
+++ b/tests/standalone/io/file_invalid_arguments_test.dart
@@ -32,7 +32,7 @@
 
 void testWriteByteInvalidArgs(value) {
   String filename = getFilename("fixed_length_file_invalid_arguments");
-  var file = (new File("${filename}_out")).openSync(mode: FileMode.WRITE);
+  var file = (new File("${filename}_out")).openSync(mode: FileMode.write);
   Expect.throws(() => file.writeByteSync(value), (e) => e is ArgumentError);
 
   Expect.throws(() => file.writeByte(value), (e) => e is ArgumentError);
@@ -41,7 +41,7 @@
 
 void testWriteFromInvalidArgs(buffer, start, end) {
   String filename = getFilename("fixed_length_file_invalid_arguments");
-  var file = (new File("${filename}_out")).openSync(mode: FileMode.WRITE);
+  var file = (new File("${filename}_out")).openSync(mode: FileMode.write);
   Expect.throws(
       () => file.writeFromSync(buffer, start, end), (e) => e is ArgumentError);
 
@@ -52,7 +52,7 @@
 
 void testWriteStringInvalidArgs(string, encoding) {
   String filename = getFilename("fixed_length_file_invalid_arguments");
-  var file = new File("${filename}_out").openSync(mode: FileMode.WRITE);
+  var file = new File("${filename}_out").openSync(mode: FileMode.write);
   Expect.throws(() => file.writeStringSync(string, encoding: encoding),
       (e) => e is ArgumentError);
 
diff --git a/tests/standalone/io/io_override_test.dart b/tests/standalone/io/io_override_test.dart
index 1d6abb2..012e7ff 100644
--- a/tests/standalone/io/io_override_test.dart
+++ b/tests/standalone/io/io_override_test.dart
@@ -64,30 +64,30 @@
   DateTime lastModifiedSync() => null;
   Future setLastModified(DateTime time) => null;
   void setLastModifiedSync(DateTime time) {}
-  Future<RandomAccessFile> open({FileMode mode: FileMode.READ}) => null;
-  RandomAccessFile openSync({FileMode mode: FileMode.READ}) => null;
+  Future<RandomAccessFile> open({FileMode mode: FileMode.read}) => null;
+  RandomAccessFile openSync({FileMode mode: FileMode.read}) => null;
   Stream<List<int>> openRead([int start, int end]) => null;
-  IOSink openWrite({FileMode mode: FileMode.WRITE, Encoding encoding: UTF8}) =>
+  IOSink openWrite({FileMode mode: FileMode.write, Encoding encoding: utf8}) =>
       null;
   Future<List<int>> readAsBytes() => null;
   List<int> readAsBytesSync() => null;
-  Future<String> readAsString({Encoding encoding: UTF8}) => null;
-  String readAsStringSync({Encoding encoding: UTF8}) => null;
-  Future<List<String>> readAsLines({Encoding encoding: UTF8}) => null;
-  List<String> readAsLinesSync({Encoding encoding: UTF8}) => null;
+  Future<String> readAsString({Encoding encoding: utf8}) => null;
+  String readAsStringSync({Encoding encoding: utf8}) => null;
+  Future<List<String>> readAsLines({Encoding encoding: utf8}) => null;
+  List<String> readAsLinesSync({Encoding encoding: utf8}) => null;
   Future<File> writeAsBytes(List<int> bytes,
-          {FileMode mode: FileMode.WRITE, bool flush: false}) =>
+          {FileMode mode: FileMode.write, bool flush: false}) =>
       null;
   void writeAsBytesSync(List<int> bytes,
-      {FileMode mode: FileMode.WRITE, bool flush: false}) {}
+      {FileMode mode: FileMode.write, bool flush: false}) {}
   Future<File> writeAsString(String contents,
-          {FileMode mode: FileMode.WRITE,
-          Encoding encoding: UTF8,
+          {FileMode mode: FileMode.write,
+          Encoding encoding: utf8,
           bool flush: false}) =>
       null;
   void writeAsStringSync(String contents,
-      {FileMode mode: FileMode.WRITE,
-      Encoding encoding: UTF8,
+      {FileMode mode: FileMode.write,
+      Encoding encoding: utf8,
       bool flush: false}) {}
 }
 
@@ -118,11 +118,11 @@
   static bool identicalSync(String path1, String path2) => false;
 
   static Future<FileSystemEntityType> getType(String path, bool followLinks) {
-    return new Future.value(FileSystemEntityType.FILE);
+    return new Future.value(FileSystemEntityType.file);
   }
 
   static FileSystemEntityType getTypeSync(String path, bool followLinks) {
-    return FileSystemEntityType.FILE;
+    return FileSystemEntityType.file;
   }
 }
 
@@ -174,9 +174,9 @@
       Expect.isFalse(await FileSystemEntity.identical("file", "file"));
       Expect.isFalse(FileSystemEntity.identicalSync("file", "file"));
       Expect.equals(
-          await FileSystemEntity.type("file"), FileSystemEntityType.FILE);
+          await FileSystemEntity.type("file"), FileSystemEntityType.file);
       Expect.equals(
-          FileSystemEntity.typeSync("file"), FileSystemEntityType.FILE);
+          FileSystemEntity.typeSync("file"), FileSystemEntityType.file);
       Expect.isFalse(FileSystemEntity.isWatchSupported);
       Expect.isNull(new Directory("directory").watch());
       Expect.isTrue(new Link("link") is LinkMock);
diff --git a/tests/standalone/io/raw_datagram_socket_test.dart b/tests/standalone/io/raw_datagram_socket_test.dart
index 2a08b0c..5fe68e4 100644
--- a/tests/standalone/io/raw_datagram_socket_test.dart
+++ b/tests/standalone/io/raw_datagram_socket_test.dart
@@ -33,8 +33,8 @@
     });
   }
 
-  test(InternetAddress.LOOPBACK_IP_V4);
-  test(InternetAddress.ANY_IP_V4);
+  test(InternetAddress.loopbackIPv4);
+  test(InternetAddress.anyIPv4);
 }
 
 testDatagramMulticastOptions() {
@@ -61,10 +61,10 @@
     });
   }
 
-  test(InternetAddress.LOOPBACK_IP_V4);
-  test(InternetAddress.ANY_IP_V4);
-  test(InternetAddress.LOOPBACK_IP_V6);
-  test(InternetAddress.ANY_IP_V6);
+  test(InternetAddress.loopbackIPv4);
+  test(InternetAddress.anyIPv4);
+  test(InternetAddress.loopbackIPv6);
+  test(InternetAddress.anyIPv6);
 }
 
 testDatagramSocketReuseAddress() {
@@ -86,10 +86,10 @@
     });
   }
 
-  test(InternetAddress.LOOPBACK_IP_V4, true);
-  test(InternetAddress.LOOPBACK_IP_V4, false);
-  test(InternetAddress.LOOPBACK_IP_V6, true);
-  test(InternetAddress.LOOPBACK_IP_V6, false);
+  test(InternetAddress.loopbackIPv4, true);
+  test(InternetAddress.loopbackIPv4, false);
+  test(InternetAddress.loopbackIPv6, true);
+  test(InternetAddress.loopbackIPv6, false);
 }
 
 testBroadcast() {
@@ -107,7 +107,7 @@
       receiver.broadcastEnabled = enabled;
       sender.broadcastEnabled = enabled;
       receiver.listen((event) {
-        if (event == RawSocketEvent.READ) {
+        if (event == RawSocketEvent.read) {
           Expect.isTrue(enabled);
           sender.close();
           receiver.close();
@@ -135,8 +135,8 @@
   }
 
   var broadcast = new InternetAddress("255.255.255.255");
-  test(InternetAddress.ANY_IP_V4, broadcast, false);
-  test(InternetAddress.ANY_IP_V4, broadcast, true);
+  test(InternetAddress.anyIPv4, broadcast, false);
+  test(InternetAddress.anyIPv4, broadcast, true);
 }
 
 testLoopbackMulticast() {
@@ -158,7 +158,7 @@
       sender.multicastLoopback = enabled;
 
       receiver.listen((event) {
-        if (event == RawSocketEvent.READ) {
+        if (event == RawSocketEvent.read) {
           if (!enabled) {
             var data = receiver.receive();
             print(data.port);
@@ -190,17 +190,17 @@
     });
   }
 
-  test(InternetAddress.ANY_IP_V4, new InternetAddress("228.0.0.4"), true);
-  test(InternetAddress.ANY_IP_V4, new InternetAddress("224.0.0.0"), false);
+  test(InternetAddress.anyIPv4, new InternetAddress("228.0.0.4"), true);
+  test(InternetAddress.anyIPv4, new InternetAddress("224.0.0.0"), false);
   // TODO(30306): Reenable for Linux
   if (!Platform.isMacOS && !Platform.isLinux) {
-    test(InternetAddress.ANY_IP_V6, new InternetAddress("ff11::0"), true);
-    test(InternetAddress.ANY_IP_V6, new InternetAddress("ff11::0"), false);
+    test(InternetAddress.anyIPv6, new InternetAddress("ff11::0"), true);
+    test(InternetAddress.anyIPv6, new InternetAddress("ff11::0"), false);
   }
 }
 
 testLoopbackMulticastError() {
-  var bindAddress = InternetAddress.ANY_IP_V4;
+  var bindAddress = InternetAddress.anyIPv4;
   var multicastAddress = new InternetAddress("228.0.0.4");
   asyncStart();
   Future.wait([
@@ -275,7 +275,7 @@
 
     sender.listen((event) {
       switch (event) {
-        case RawSocketEvent.READ:
+        case RawSocketEvent.read:
           var datagram = sender.receive();
           if (datagram != null) {
             Expect.equals(datagram.port, receiver.port);
@@ -293,11 +293,11 @@
             }
           }
           break;
-        case RawSocketEvent.WRITE:
+        case RawSocketEvent.write:
           // Send the next package.
           sendData(ackSeq + 1);
           break;
-        case RawSocketEvent.CLOSED:
+        case RawSocketEvent.closed:
           break;
         default:
           throw "Unexpected event $event";
@@ -307,7 +307,7 @@
     receiver.writeEventsEnabled = false;
     receiver.listen((event) {
       switch (event) {
-        case RawSocketEvent.READ:
+        case RawSocketEvent.read:
           var datagram = receiver.receive();
           if (datagram != null) {
             Expect.equals(datagram.port, sender.port);
@@ -322,10 +322,10 @@
             }
           }
           break;
-        case RawSocketEvent.WRITE:
-          throw "Unexpected WRITE";
+        case RawSocketEvent.write:
+          throw "Unexpected.write";
           break;
-        case RawSocketEvent.CLOSED:
+        case RawSocketEvent.closed:
           break;
         default:
           throw "Unexpected event $event";
@@ -343,12 +343,12 @@
   testBroadcast();
   testLoopbackMulticast();
   testLoopbackMulticastError();
-  testSendReceive(InternetAddress.LOOPBACK_IP_V4, 1000);
-  testSendReceive(InternetAddress.LOOPBACK_IP_V6, 1000);
+  testSendReceive(InternetAddress.loopbackIPv4, 1000);
+  testSendReceive(InternetAddress.loopbackIPv6, 1000);
   if (!Platform.isMacOS) {
-    testSendReceive(InternetAddress.LOOPBACK_IP_V4, 32 * 1024);
-    testSendReceive(InternetAddress.LOOPBACK_IP_V6, 32 * 1024);
-    testSendReceive(InternetAddress.LOOPBACK_IP_V4, 64 * 1024 - 32);
-    testSendReceive(InternetAddress.LOOPBACK_IP_V6, 64 * 1024 - 32);
+    testSendReceive(InternetAddress.loopbackIPv4, 32 * 1024);
+    testSendReceive(InternetAddress.loopbackIPv6, 32 * 1024);
+    testSendReceive(InternetAddress.loopbackIPv4, 64 * 1024 - 32);
+    testSendReceive(InternetAddress.loopbackIPv6, 64 * 1024 - 32);
   }
 }
diff --git a/tests/standalone/io/raw_secure_server_socket_test.dart b/tests/standalone/io/raw_secure_server_socket_test.dart
index fb1b333..a2a1d05 100644
--- a/tests/standalone/io/raw_secure_server_socket_test.dart
+++ b/tests/standalone/io/raw_secure_server_socket_test.dart
@@ -91,8 +91,8 @@
     server.listen((serverEnd) {
       clientEndFuture.then((clientEnd) {
         // TODO(whesse): Shutdown(SEND) not supported on secure sockets.
-        clientEnd.shutdown(SocketDirection.SEND);
-        serverEnd.shutdown(SocketDirection.SEND);
+        clientEnd.shutdown(SocketDirection.send);
+        serverEnd.shutdown(SocketDirection.send);
         server.close();
         print("asyncEnd testSimpleConnect");
         asyncEnd();
@@ -137,8 +137,8 @@
     new Timer(const Duration(milliseconds: 500), () {
       server.listen((serverEnd) {
         clientEndFuture.then((clientEnd) {
-          clientEnd.shutdown(SocketDirection.SEND);
-          serverEnd.shutdown(SocketDirection.SEND);
+          clientEnd.shutdown(SocketDirection.send);
+          serverEnd.shutdown(SocketDirection.send);
           server.close();
           print("asyncEnd testServerListenAfterConnect");
           asyncEnd();
@@ -239,7 +239,7 @@
     var subscription;
     subscription = client.listen((event) {
       switch (event) {
-        case RawSocketEvent.READ:
+        case RawSocketEvent.read:
           if (dropReads) {
             if (serverReads != 10) {
               ++serverReads;
@@ -264,7 +264,7 @@
             client.writeEventsEnabled = true;
           }
           break;
-        case RawSocketEvent.WRITE:
+        case RawSocketEvent.write:
           Expect.isFalse(client.writeEventsEnabled);
           Expect.equals(bytesRead, data.length);
           for (int i = bytesWritten; i < data.length; ++i) {
@@ -280,7 +280,7 @@
             client.shutdown(SocketDirection.SEND);
           }
           break;
-        case RawSocketEvent.READ_CLOSED:
+        case RawSocketEvent.readClosed:
           completer.complete(null);
           break;
         default:
@@ -298,7 +298,7 @@
     List<int> dataReceived = new List<int>(dataSent.length);
     socket.listen((event) {
       switch (event) {
-        case RawSocketEvent.READ:
+        case RawSocketEvent.read:
           Expect.isTrue(socket.available() > 0);
           if (dropReads) {
             if (clientReads != 10) {
@@ -314,7 +314,7 @@
             bytesRead += buffer.length;
           }
           break;
-        case RawSocketEvent.WRITE:
+        case RawSocketEvent.write:
           Expect.isTrue(bytesRead == 0);
           Expect.isFalse(socket.writeEventsEnabled);
           bytesWritten += socket.write(
@@ -323,7 +323,7 @@
             socket.writeEventsEnabled = true;
           }
           break;
-        case RawSocketEvent.READ_CLOSED:
+        case RawSocketEvent.readClosed:
           verifyTestData(dataReceived);
           completer.complete(socket);
           break;
@@ -343,7 +343,7 @@
     var subscription;
     subscription = client.listen((event) {
       switch (event) {
-        case RawSocketEvent.READ:
+        case RawSocketEvent.read:
           if (bytesRead < data.length) {
             Expect.isTrue(bytesWritten == 0);
           }
@@ -377,7 +377,7 @@
             client.writeEventsEnabled = true;
           }
           break;
-        case RawSocketEvent.WRITE:
+        case RawSocketEvent.write:
           Expect.isFalse(client.writeEventsEnabled);
           Expect.equals(bytesRead, data.length);
           for (int i = bytesWritten; i < data.length; ++i) {
@@ -395,7 +395,7 @@
             }
           }
           break;
-        case RawSocketEvent.READ_CLOSED:
+        case RawSocketEvent.readClosed:
           Expect.fail("Unexpected close");
           break;
         default:
@@ -414,7 +414,7 @@
     var subscription;
     subscription = socket.listen((event) {
       switch (event) {
-        case RawSocketEvent.READ:
+        case RawSocketEvent.read:
           if (dropReads) {
             if (clientReads != 10) {
               ++clientReads;
@@ -434,7 +434,7 @@
             }
           }
           break;
-        case RawSocketEvent.WRITE:
+        case RawSocketEvent.write:
           Expect.isTrue(bytesRead == 0);
           Expect.isFalse(socket.writeEventsEnabled);
           bytesWritten += socket.write(
@@ -443,7 +443,7 @@
             socket.writeEventsEnabled = true;
           }
           break;
-        case RawSocketEvent.READ_CLOSED:
+        case RawSocketEvent.readClosed:
           Expect.fail("Unexpected close");
           break;
         default:
diff --git a/tests/standalone/io/secure_socket_bad_data_test.dart b/tests/standalone/io/secure_socket_bad_data_test.dart
index 1b8d386..2cf5777 100644
--- a/tests/standalone/io/secure_socket_bad_data_test.dart
+++ b/tests/standalone/io/secure_socket_bad_data_test.dart
@@ -55,7 +55,7 @@
   client.writeEventsEnabled = false;
   client.listen((event) {
     switch (event) {
-      case RawSocketEvent.READ:
+      case RawSocketEvent.read:
         Expect.isTrue(client.available() > 0);
         var buffer = client.read(200);
         dataReceived.setRange(bytesRead, bytesRead + buffer.length, buffer);
@@ -64,12 +64,12 @@
           verifyTestData(dataReceived);
         }
         break;
-      case RawSocketEvent.WRITE:
+      case RawSocketEvent.write:
         Expect.fail('WRITE event received');
         break;
-      case RawSocketEvent.READ_CLOSED:
+      case RawSocketEvent.readClosed:
         Expect.fail('READ_CLOSED event received');
-        client.shutdown(SocketDirection.SEND);
+        client.shutdown(SocketDirection.send);
         completer.complete(null);
         break;
     }
@@ -97,10 +97,10 @@
   int bytesWritten = 0;
   socket.listen((event) {
     switch (event) {
-      case RawSocketEvent.READ:
+      case RawSocketEvent.read:
         Expect.fail('READ event received');
         break;
-      case RawSocketEvent.WRITE:
+      case RawSocketEvent.write:
         if (bytesWritten < data.length) {
           bytesWritten += socket.write(data, bytesWritten);
         }
@@ -109,10 +109,10 @@
         }
         if (bytesWritten == data.length) {
           baseSocket.write(data, 0, 300);
-          socket.shutdown(SocketDirection.SEND);
+          socket.shutdown(SocketDirection.send);
         }
         break;
-      case RawSocketEvent.READ_CLOSED:
+      case RawSocketEvent.readClosed:
         tryComplete();
         break;
     }
diff --git a/tests/standalone_2/io/file_blocking_lock_script.dart b/tests/standalone_2/io/file_blocking_lock_script.dart
index 9ba2feb..00f8bb5 100644
--- a/tests/standalone_2/io/file_blocking_lock_script.dart
+++ b/tests/standalone_2/io/file_blocking_lock_script.dart
@@ -8,10 +8,10 @@
 import "dart:io";
 
 Future<int> testLockWholeFile(File file, int len) async {
-  var raf = await file.open(mode: APPEND);
+  var raf = await file.open(mode: FileMode.append);
   await raf.setPosition(0);
   int nextToWrite = 1;
-  await raf.lock(FileLock.BLOCKING_EXCLUSIVE, 0, len);
+  await raf.lock(FileLock.blockingExclusive, 0, len);
 
   // Make sure the peer fails a non-blocking lock at some point.
   await new Future.delayed(const Duration(seconds: 1));
diff --git a/tests/standalone_2/io/file_blocking_lock_test.dart b/tests/standalone_2/io/file_blocking_lock_test.dart
index 923710c..8896fb3 100644
--- a/tests/standalone_2/io/file_blocking_lock_test.dart
+++ b/tests/standalone_2/io/file_blocking_lock_test.dart
@@ -51,9 +51,9 @@
       return false;
     }
     try {
-      await raf.lock(FileLock.EXCLUSIVE, 0, length);
+      await raf.lock(FileLock.exclusive, 0, length);
     } on dynamic {
-      await raf.lock(FileLock.BLOCKING_EXCLUSIVE, 0, length);
+      await raf.lock(FileLock.blockingExclusive, 0, length);
       break;
     }
   }
@@ -66,9 +66,9 @@
   Directory directory = await Directory.systemTemp.createTemp('dart_file_lock');
   File file = new File(join(directory.path, "file"));
   await file.writeAsBytes(new List.filled(length, 0));
-  var raf = await file.open(mode: APPEND);
-  await raf.lock(FileLock.BLOCKING_EXCLUSIVE, 0, length);
-  Process peer = await runPeer(file.path, length, FileLock.BLOCKING_EXCLUSIVE);
+  var raf = await file.open(mode: FileMode.append);
+  await raf.lock(FileLock.blockingExclusive, 0, length);
+  Process peer = await runPeer(file.path, length, FileLock.blockingExclusive);
 
   // If the peer doesn't come up within the timeout, then give up on the test
   // to avoid the test being flaky.
diff --git a/tests/standalone_2/io/file_error_test.dart b/tests/standalone_2/io/file_error_test.dart
index 5a3d381..27733f7 100644
--- a/tests/standalone_2/io/file_error_test.dart
+++ b/tests/standalone_2/io/file_error_test.dart
@@ -45,7 +45,7 @@
   Expect.throws(
       () => file.openSync(), (e) => checkOpenNonExistentFileSystemException(e));
 
-  var openFuture = file.open(mode: FileMode.READ);
+  var openFuture = file.open(mode: FileMode.read);
   openFuture.then((raf) => Expect.fail("Unreachable code")).catchError((error) {
     checkOpenNonExistentFileSystemException(error);
     temp.deleteSync(recursive: true);
@@ -228,7 +228,7 @@
 
 testWriteByteToReadOnlyFile() {
   createTestFile((file, done) {
-    var openedFile = file.openSync(mode: FileMode.READ);
+    var openedFile = file.openSync(mode: FileMode.read);
 
     // Writing to read only file should throw an exception.
     Expect.throws(() => openedFile.writeByteSync(0),
@@ -244,7 +244,7 @@
 
 testWriteFromToReadOnlyFile() {
   createTestFile((file, done) {
-    var openedFile = file.openSync(mode: FileMode.READ);
+    var openedFile = file.openSync(mode: FileMode.read);
 
     List data = [0, 1, 2, 3];
     // Writing to read only file should throw an exception.
@@ -261,10 +261,10 @@
 
 testTruncateReadOnlyFile() {
   createTestFile((file, done) {
-    var openedFile = file.openSync(mode: FileMode.WRITE);
+    var openedFile = file.openSync(mode: FileMode.write);
     openedFile.writeByteSync(0);
     openedFile.closeSync();
-    openedFile = file.openSync(mode: FileMode.READ);
+    openedFile = file.openSync(mode: FileMode.read);
 
     // Truncating read only file should throw an exception.
     Expect.throws(() => openedFile.truncateSync(0),
@@ -289,7 +289,7 @@
 
 testOperateOnClosedFile() {
   createTestFile((file, done) {
-    var openedFile = file.openSync(mode: FileMode.READ);
+    var openedFile = file.openSync(mode: FileMode.read);
     openedFile.closeSync();
 
     List data = [0, 1, 2, 3];
diff --git a/tests/standalone_2/io/file_fuzz_test.dart b/tests/standalone_2/io/file_fuzz_test.dart
index 4a3637a..21c09c4 100644
--- a/tests/standalone_2/io/file_fuzz_test.dart
+++ b/tests/standalone_2/io/file_fuzz_test.dart
@@ -66,7 +66,7 @@
   var temp = Directory.systemTemp.createTempSync('dart_file_fuzz');
   var file = new File('${temp.path}/x');
   file.createSync();
-  var modes = [FileMode.READ, FileMode.WRITE, FileMode.APPEND];
+  var modes = [FileMode.read, FileMode.write, FileMode.append];
   for (var m in modes) {
     var opened = file.openSync(mode: m);
     typeMapping.forEach((k, v) {
@@ -90,7 +90,7 @@
   var temp = Directory.systemTemp.createTempSync('dart_file_fuzz');
   var file = new File('${temp.path}/x');
   file.createSync();
-  var modes = [FileMode.READ, FileMode.WRITE, FileMode.APPEND];
+  var modes = [FileMode.read, FileMode.write, FileMode.append];
   var futures = <Future>[];
   var openedFiles = [];
   for (var m in modes) {
diff --git a/tests/standalone_2/io/file_input_stream_test.dart b/tests/standalone_2/io/file_input_stream_test.dart
index e4087e8..4d48549 100644
--- a/tests/standalone_2/io/file_input_stream_test.dart
+++ b/tests/standalone_2/io/file_input_stream_test.dart
@@ -77,7 +77,7 @@
     if (streamedBytes == 0) {
       subscription.pause();
       // Truncate the file by opening it for writing.
-      file.open(mode: FileMode.WRITE).then((opened) {
+      file.open(mode: FileMode.write).then((opened) {
         opened.close().then((_) {
           Expect.equals(0, file.lengthSync());
           subscription.resume();
@@ -141,7 +141,7 @@
       subscription.pause();
       // Double the length of the underlying file.
       file.readAsBytes().then((bytes) {
-        file.writeAsBytes(bytes, mode: FileMode.APPEND).then((_) {
+        file.writeAsBytes(bytes, mode: FileMode.append).then((_) {
           Expect.equals(2 * originalLength, file.lengthSync());
           subscription.resume();
         });
diff --git a/tests/standalone_2/io/file_lock_script.dart b/tests/standalone_2/io/file_lock_script.dart
index 6c66c59..071f594 100644
--- a/tests/standalone_2/io/file_lock_script.dart
+++ b/tests/standalone_2/io/file_lock_script.dart
@@ -10,9 +10,9 @@
   File file = new File(args[0]);
   int start = null;
   int end = null;
-  var mode = FileLock.EXCLUSIVE;
+  var mode = FileLock.exclusive;
   if (args[1] == 'SHARED') {
-    mode = FileLock.SHARED;
+    mode = FileLock.shared;
   }
   if (args[2] != 'null') {
     start = int.parse(args[2]);
@@ -20,7 +20,7 @@
   if (args[3] != 'null') {
     end = int.parse(args[3]);
   }
-  var raf = file.openSync(mode: WRITE);
+  var raf = file.openSync(mode: FileMode.write);
   try {
     raf.lockSync(mode, start, end);
     print('LOCK SUCCEEDED');
diff --git a/tests/standalone_2/io/file_lock_test.dart b/tests/standalone_2/io/file_lock_test.dart
index f2f39fa..413288c 100644
--- a/tests/standalone_2/io/file_lock_test.dart
+++ b/tests/standalone_2/io/file_lock_test.dart
@@ -19,7 +19,7 @@
     ..addAll(Platform.executableArguments)
     ..add(Platform.script.resolve('file_lock_script.dart').toFilePath())
     ..add(path)
-    ..add(mode == FileLock.EXCLUSIVE ? 'EXCLUSIVE' : 'SHARED')
+    ..add(mode == FileLock.exclusive ? 'EXCLUSIVE' : 'SHARED')
     ..add('$start')
     ..add('$end');
   return Process
@@ -39,18 +39,18 @@
 }
 
 checkLocked(String path,
-        [int start = 0, int end = -1, FileLock mode = FileLock.EXCLUSIVE]) =>
+        [int start = 0, int end = -1, FileLock mode = FileLock.exclusive]) =>
     check(path, start, end, mode, locked: true);
 
 checkNotLocked(String path,
-        [int start = 0, int end = -1, FileLock mode = FileLock.EXCLUSIVE]) =>
+        [int start = 0, int end = -1, FileLock mode = FileLock.exclusive]) =>
     check(path, start, end, mode, locked: false);
 
 void testLockWholeFile() {
   Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
   File file = new File(join(directory.path, "file"));
   file.writeAsBytesSync(new List.filled(10, 0));
-  var raf = file.openSync(mode: WRITE);
+  var raf = file.openSync(mode: FileMode.write);
   raf.lockSync();
   asyncStart();
   checkLocked(file.path).then((_) {
@@ -69,7 +69,7 @@
   Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
   File file = new File(join(directory.path, "file"));
   file.writeAsBytesSync(new List.filled(10, 0));
-  var raf = file.openSync(mode: WRITE);
+  var raf = file.openSync(mode: FileMode.write);
   asyncStart();
   Future.forEach([
     () => raf.lock(),
@@ -88,12 +88,12 @@
   Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
   File file = new File(join(directory.path, "file"));
   file.writeAsBytesSync(new List.filled(10, 0));
-  var raf1 = file.openSync(mode: WRITE);
-  var raf2 = file.openSync(mode: WRITE);
+  var raf1 = file.openSync(mode: FileMode.write);
+  var raf2 = file.openSync(mode: FileMode.write);
   asyncStart();
   var tests = [
-    () => raf1.lockSync(FileLock.EXCLUSIVE, 2, 3),
-    () => raf2.lockSync(FileLock.EXCLUSIVE, 5, 7),
+    () => raf1.lockSync(FileLock.exclusive, 2, 3),
+    () => raf2.lockSync(FileLock.exclusive, 5, 7),
     () => checkNotLocked(file.path, 0, 2),
     () => checkLocked(file.path, 0, 3),
     () => checkNotLocked(file.path, 4, 5),
@@ -132,12 +132,12 @@
   Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
   File file = new File(join(directory.path, "file"));
   file.writeAsBytesSync(new List.filled(10, 0));
-  var raf1 = file.openSync(mode: WRITE);
-  var raf2 = file.openSync(mode: WRITE);
+  var raf1 = file.openSync(mode: FileMode.write);
+  var raf2 = file.openSync(mode: FileMode.write);
   asyncStart();
   var tests = [
-    () => raf1.lock(FileLock.EXCLUSIVE, 2, 3),
-    () => raf2.lock(FileLock.EXCLUSIVE, 5, 7),
+    () => raf1.lock(FileLock.exclusive, 2, 3),
+    () => raf2.lock(FileLock.exclusive, 5, 7),
     () => checkNotLocked(file.path, 0, 2),
     () => checkLocked(file.path, 0, 3),
     () => checkNotLocked(file.path, 4, 5),
@@ -175,10 +175,10 @@
   Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
   File file = new File(join(directory.path, "file"));
   file.writeAsBytesSync(new List.filled(10, 0));
-  var raf = file.openSync(mode: APPEND);
+  var raf = file.openSync(mode: FileMode.append);
   asyncStart();
   Future.forEach([
-    () => raf.lockSync(FileLock.EXCLUSIVE, 2),
+    () => raf.lockSync(FileLock.exclusive, 2),
     () => checkNotLocked(file.path, 0, 2),
     () => checkLocked(file.path, 0, 3),
     () => checkLocked(file.path, 9),
@@ -198,10 +198,10 @@
   Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
   File file = new File(join(directory.path, "file"));
   file.writeAsBytesSync(new List.filled(10, 0));
-  var raf = file.openSync(mode: APPEND);
+  var raf = file.openSync(mode: FileMode.append);
   asyncStart();
   Future.forEach([
-    () => raf.lock(FileLock.EXCLUSIVE, 2),
+    () => raf.lock(FileLock.exclusive, 2),
     () => checkNotLocked(file.path, 0, 2),
     () => checkLocked(file.path, 0, 3),
     () => checkLocked(file.path, 9),
@@ -224,10 +224,10 @@
   var raf = file.openSync();
   asyncStart();
   Future.forEach([
-    () => raf.lock(FileLock.SHARED),
+    () => raf.lock(FileLock.shared),
     () => checkLocked(file.path),
     () => checkLocked(file.path, 0, 2),
-    () => checkNotLocked(file.path, 0, 2, FileLock.SHARED)
+    () => checkNotLocked(file.path, 0, 2, FileLock.shared)
   ], (f) => f()).then((_) {
     raf.closeSync();
     directory.deleteSync(recursive: true);
@@ -242,10 +242,10 @@
   var raf = file.openSync();
   asyncStart();
   Future.forEach([
-    () => raf.lock(FileLock.SHARED),
+    () => raf.lock(FileLock.shared),
     () => checkLocked(file.path),
     () => checkLocked(file.path, 0, 2),
-    () => checkNotLocked(file.path, 0, 2, FileLock.SHARED)
+    () => checkNotLocked(file.path, 0, 2, FileLock.shared)
   ], (f) => f()).whenComplete(() {
     raf.closeSync();
     directory.deleteSync(recursive: true);
@@ -257,10 +257,10 @@
   Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
   File file = new File(join(directory.path, "file"));
   file.writeAsBytesSync(new List.filled(10, 0));
-  var raf = file.openSync(mode: APPEND);
+  var raf = file.openSync(mode: FileMode.append);
   asyncStart();
   Future.forEach([
-    () => raf.lockSync(FileLock.EXCLUSIVE, 2, 15),
+    () => raf.lockSync(FileLock.exclusive, 2, 15),
     () => checkNotLocked(file.path, 0, 2),
     () => checkLocked(file.path, 0, 3),
     () => checkLocked(file.path, 9),
@@ -281,10 +281,10 @@
   Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
   File file = new File(join(directory.path, "file"));
   file.writeAsBytesSync(new List.filled(10, 0));
-  var raf = file.openSync(mode: APPEND);
+  var raf = file.openSync(mode: FileMode.append);
   asyncStart();
   Future.forEach([
-    () => raf.lock(FileLock.EXCLUSIVE, 2, 15),
+    () => raf.lock(FileLock.exclusive, 2, 15),
     () => checkNotLocked(file.path, 0, 2),
     () => checkLocked(file.path, 0, 3),
     () => checkLocked(file.path, 9),
diff --git a/tests/standalone_2/io/file_stat_test.dart b/tests/standalone_2/io/file_stat_test.dart
index d7e134d..d7f6839 100644
--- a/tests/standalone_2/io/file_stat_test.dart
+++ b/tests/standalone_2/io/file_stat_test.dart
@@ -16,17 +16,17 @@
   File file = new File(join(directory.path, "file"));
   FileStat fileStat = FileStat.statSync(file.path);
   FileStat fileStatDirect = file.statSync();
-  Expect.equals(FileSystemEntityType.NOT_FOUND, fileStat.type);
-  Expect.equals(FileSystemEntityType.NOT_FOUND, fileStatDirect.type);
+  Expect.equals(FileSystemEntityType.notFound, fileStat.type);
+  Expect.equals(FileSystemEntityType.notFound, fileStatDirect.type);
   file.writeAsStringSync("Dart IO library test of FileStat");
   new Timer(const Duration(seconds: 2), () {
     file.readAsStringSync();
     directory.listSync();
     FileStat fileStat = FileStat.statSync(file.path);
     FileStat fileStatDirect = file.statSync();
-    Expect.equals(FileSystemEntityType.FILE, fileStat.type);
+    Expect.equals(FileSystemEntityType.file, fileStat.type);
     Expect.equals(32, fileStat.size);
-    Expect.equals(FileSystemEntityType.FILE, fileStatDirect.type);
+    Expect.equals(FileSystemEntityType.file, fileStatDirect.type);
     Expect.equals(32, fileStatDirect.size);
     if (Platform.operatingSystem != 'windows') {
       Expect.isTrue(fileStat.modified.compareTo(fileStat.accessed) < 0);
@@ -35,8 +35,8 @@
     Expect.equals(6 << 6, fileStat.mode & (6 << 6)); // Mode includes +urw.
     FileStat directoryStat = FileStat.statSync(directory.path);
     FileStat directoryStatDirect = directory.statSync();
-    Expect.equals(FileSystemEntityType.DIRECTORY, directoryStat.type);
-    Expect.equals(FileSystemEntityType.DIRECTORY, directoryStatDirect.type);
+    Expect.equals(FileSystemEntityType.directory, directoryStat.type);
+    Expect.equals(FileSystemEntityType.directory, directoryStatDirect.type);
     if (Platform.operatingSystem != 'windows') {
       Expect
           .isTrue(directoryStat.modified.compareTo(directoryStat.accessed) < 0);
@@ -54,17 +54,17 @@
     return FileStat
         .stat(file.path)
         .then((fileStat) =>
-            Expect.equals(FileSystemEntityType.NOT_FOUND, fileStat.type))
+            Expect.equals(FileSystemEntityType.notFound, fileStat.type))
         .then((_) => file.stat())
         .then((fileStat) =>
-            Expect.equals(FileSystemEntityType.NOT_FOUND, fileStat.type))
+            Expect.equals(FileSystemEntityType.notFound, fileStat.type))
         .then((_) => file.writeAsString("Dart IO library test of FileStat"))
         .then((_) => new Future.delayed(const Duration(seconds: 2)))
         .then((_) => file.readAsString())
         .then((_) => directory.list().last)
         .then((_) => FileStat.stat(file.path))
         .then((FileStat fileStat) {
-      Expect.equals(FileSystemEntityType.FILE, fileStat.type);
+      Expect.equals(FileSystemEntityType.file, fileStat.type);
       Expect.equals(32, fileStat.size);
       if (Platform.operatingSystem != 'windows') {
         Expect.isTrue(fileStat.modified.compareTo(fileStat.accessed) < 0);
@@ -73,7 +73,7 @@
       Expect.equals(6 << 6, fileStat.mode & (6 << 6)); // Mode includes +urw.
       return file.stat();
     }).then((FileStat fileStat) {
-      Expect.equals(FileSystemEntityType.FILE, fileStat.type);
+      Expect.equals(FileSystemEntityType.file, fileStat.type);
       Expect.equals(32, fileStat.size);
       if (Platform.operatingSystem != 'windows') {
         Expect.isTrue(fileStat.modified.compareTo(fileStat.accessed) < 0);
@@ -82,7 +82,7 @@
       Expect.equals(6 << 6, fileStat.mode & (6 << 6)); // Mode includes +urw.
       return FileStat.stat(directory.path);
     }).then((FileStat directoryStat) {
-      Expect.equals(FileSystemEntityType.DIRECTORY, directoryStat.type);
+      Expect.equals(FileSystemEntityType.directory, directoryStat.type);
       if (Platform.operatingSystem != 'windows') {
         Expect.isTrue(
             directoryStat.modified.compareTo(directoryStat.accessed) < 0);
@@ -92,7 +92,7 @@
       Expect.equals(7 << 6, directoryStat.mode & (7 << 6)); // Includes +urwx.
       return directory.stat();
     }).then((FileStat directoryStat) {
-      Expect.equals(FileSystemEntityType.DIRECTORY, directoryStat.type);
+      Expect.equals(FileSystemEntityType.directory, directoryStat.type);
       if (Platform.operatingSystem != 'windows') {
         Expect.isTrue(
             directoryStat.modified.compareTo(directoryStat.accessed) < 0);
@@ -102,7 +102,7 @@
       Expect.equals(7 << 6, directoryStat.mode & (7 << 6)); // Includes +urwx.
       return new Link(directory.path).stat();
     }).then((FileStat linkStat) {
-      Expect.equals(FileSystemEntityType.DIRECTORY, linkStat.type);
+      Expect.equals(FileSystemEntityType.directory, linkStat.type);
       if (Platform.operatingSystem != 'windows') {
         Expect.isTrue(linkStat.modified.compareTo(linkStat.accessed) < 0);
         Expect.isTrue(linkStat.changed.compareTo(linkStat.accessed) < 0);
diff --git a/tests/standalone_2/io/file_system_async_links_test.dart b/tests/standalone_2/io/file_system_async_links_test.dart
index c7e42c1..af62ca8 100644
--- a/tests/standalone_2/io/file_system_async_links_test.dart
+++ b/tests/standalone_2/io/file_system_async_links_test.dart
@@ -35,12 +35,12 @@
         .then((_) => FutureExpect.isTrue(FileSystemEntity.isLink(y)))
         .then((_) => FutureExpect.isFalse(FileSystemEntity.isLink(x)))
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.NOT_FOUND, FileSystemEntity.type(y)))
+            FileSystemEntityType.notFound, FileSystemEntity.type(y)))
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.NOT_FOUND, FileSystemEntity.type(x)))
-        .then((_) => FutureExpect.equals(FileSystemEntityType.LINK,
+            FileSystemEntityType.notFound, FileSystemEntity.type(x)))
+        .then((_) => FutureExpect.equals(FileSystemEntityType.link,
             FileSystemEntity.type(y, followLinks: false)))
-        .then((_) => FutureExpect.equals(FileSystemEntityType.NOT_FOUND,
+        .then((_) => FutureExpect.equals(FileSystemEntityType.notFound,
             FileSystemEntity.type(x, followLinks: false)))
         .then((_) => FutureExpect.equals(x, new Link(y).target()))
         .then((_) => new File(y).create())
@@ -52,12 +52,12 @@
         .then((_) => FutureExpect.isTrue(FileSystemEntity.isFile(y)))
         .then((_) => FutureExpect.isTrue(FileSystemEntity.isFile(x)))
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.FILE, FileSystemEntity.type(y)))
+            FileSystemEntityType.file, FileSystemEntity.type(y)))
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.FILE, FileSystemEntity.type(x)))
-        .then((_) => FutureExpect.equals(FileSystemEntityType.LINK,
+            FileSystemEntityType.file, FileSystemEntity.type(x)))
+        .then((_) => FutureExpect.equals(FileSystemEntityType.link,
             FileSystemEntity.type(y, followLinks: false)))
-        .then((_) => FutureExpect.equals(FileSystemEntityType.FILE,
+        .then((_) => FutureExpect.equals(FileSystemEntityType.file,
             FileSystemEntity.type(x, followLinks: false)))
         .then((_) => FutureExpect.equals(x, new Link(y).target()))
         .then((_) => new File(x).delete())
@@ -69,21 +69,21 @@
         .then((_) => FutureExpect.isTrue(FileSystemEntity.isDirectory(y)))
         .then((_) => FutureExpect.isTrue(FileSystemEntity.isDirectory(x)))
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.DIRECTORY, FileSystemEntity.type(y)))
+            FileSystemEntityType.directory, FileSystemEntity.type(y)))
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.DIRECTORY, FileSystemEntity.type(x)))
-        .then((_) => FutureExpect.equals(FileSystemEntityType.LINK,
+            FileSystemEntityType.directory, FileSystemEntity.type(x)))
+        .then((_) => FutureExpect.equals(FileSystemEntityType.link,
             FileSystemEntity.type(y, followLinks: false)))
-        .then((_) => FutureExpect.equals(FileSystemEntityType.DIRECTORY,
+        .then((_) => FutureExpect.equals(FileSystemEntityType.directory,
             FileSystemEntity.type(x, followLinks: false)))
         .then((_) => FutureExpect.equals(x, new Link(y).target()))
         .then((_) => new Link(y).delete())
         .then((_) => FutureExpect.isFalse(FileSystemEntity.isLink(y)))
         .then((_) => FutureExpect.isFalse(FileSystemEntity.isLink(x)))
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.NOT_FOUND, FileSystemEntity.type(y)))
+            FileSystemEntityType.notFound, FileSystemEntity.type(y)))
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.DIRECTORY, FileSystemEntity.type(x)))
+            FileSystemEntityType.directory, FileSystemEntity.type(x)))
         .then((_) => FutureExpect.throws(new Link(y).target()))
         .then((_) => temp.delete(recursive: true));
   });
@@ -120,7 +120,7 @@
         .create()
         .then((_) => new Link(y).create(x))
         .then((_) =>
-            (new File(y).openWrite(mode: FileMode.WRITE)..add(data)).close())
+            (new File(y).openWrite(mode: FileMode.write)..add(data)).close())
         .then((_) => FutureExpect.listEquals(data, new File(y).readAsBytes()))
         .then((_) => FutureExpect.listEquals(data, new File(x).readAsBytes()))
         .then((_) => temp.delete(recursive: true));
diff --git a/tests/standalone_2/io/file_system_links_test.dart b/tests/standalone_2/io/file_system_links_test.dart
index 231401c..9af7296 100644
--- a/tests/standalone_2/io/file_system_links_test.dart
+++ b/tests/standalone_2/io/file_system_links_test.dart
@@ -20,11 +20,11 @@
     Expect.isFalse(new File(x).existsSync());
     Expect.isTrue(FileSystemEntity.isLinkSync(y));
     Expect.isFalse(FileSystemEntity.isLinkSync(x));
-    Expect.equals(FileSystemEntityType.NOT_FOUND, FileSystemEntity.typeSync(y));
-    Expect.equals(FileSystemEntityType.NOT_FOUND, FileSystemEntity.typeSync(x));
-    Expect.equals(FileSystemEntityType.LINK,
+    Expect.equals(FileSystemEntityType.notFound, FileSystemEntity.typeSync(y));
+    Expect.equals(FileSystemEntityType.notFound, FileSystemEntity.typeSync(x));
+    Expect.equals(FileSystemEntityType.link,
         FileSystemEntity.typeSync(y, followLinks: false));
-    Expect.equals(FileSystemEntityType.NOT_FOUND,
+    Expect.equals(FileSystemEntityType.notFound,
         FileSystemEntity.typeSync(x, followLinks: false));
     Expect.equals(x, new Link(y).targetSync());
 
@@ -35,11 +35,11 @@
     Expect.isFalse(FileSystemEntity.isLinkSync(x));
     Expect.isTrue(FileSystemEntity.isFileSync(y));
     Expect.isTrue(FileSystemEntity.isFileSync(x));
-    Expect.equals(FileSystemEntityType.FILE, FileSystemEntity.typeSync(y));
-    Expect.equals(FileSystemEntityType.FILE, FileSystemEntity.typeSync(x));
-    Expect.equals(FileSystemEntityType.LINK,
+    Expect.equals(FileSystemEntityType.file, FileSystemEntity.typeSync(y));
+    Expect.equals(FileSystemEntityType.file, FileSystemEntity.typeSync(x));
+    Expect.equals(FileSystemEntityType.link,
         FileSystemEntity.typeSync(y, followLinks: false));
-    Expect.equals(FileSystemEntityType.FILE,
+    Expect.equals(FileSystemEntityType.file,
         FileSystemEntity.typeSync(x, followLinks: false));
     Expect.equals(x, new Link(y).targetSync());
 
@@ -49,19 +49,19 @@
     Expect.isFalse(FileSystemEntity.isLinkSync(x));
     Expect.isTrue(FileSystemEntity.isDirectorySync(y));
     Expect.isTrue(FileSystemEntity.isDirectorySync(x));
-    Expect.equals(FileSystemEntityType.DIRECTORY, FileSystemEntity.typeSync(y));
-    Expect.equals(FileSystemEntityType.DIRECTORY, FileSystemEntity.typeSync(x));
-    Expect.equals(FileSystemEntityType.LINK,
+    Expect.equals(FileSystemEntityType.directory, FileSystemEntity.typeSync(y));
+    Expect.equals(FileSystemEntityType.directory, FileSystemEntity.typeSync(x));
+    Expect.equals(FileSystemEntityType.link,
         FileSystemEntity.typeSync(y, followLinks: false));
-    Expect.equals(FileSystemEntityType.DIRECTORY,
+    Expect.equals(FileSystemEntityType.directory,
         FileSystemEntity.typeSync(x, followLinks: false));
     Expect.equals(x, new Link(y).targetSync());
 
     new Link(y).deleteSync();
     Expect.isFalse(FileSystemEntity.isLinkSync(y));
     Expect.isFalse(FileSystemEntity.isLinkSync(x));
-    Expect.equals(FileSystemEntityType.NOT_FOUND, FileSystemEntity.typeSync(y));
-    Expect.equals(FileSystemEntityType.DIRECTORY, FileSystemEntity.typeSync(x));
+    Expect.equals(FileSystemEntityType.notFound, FileSystemEntity.typeSync(y));
+    Expect.equals(FileSystemEntityType.directory, FileSystemEntity.typeSync(x));
     Expect.throws(() => new Link(y).targetSync());
 
     temp.deleteSync(recursive: true);
@@ -97,7 +97,7 @@
   new File(x).createSync();
   createLink(x, y, () {
     var data = "asdf".codeUnits;
-    var output = new File(y).openWrite(mode: FileMode.WRITE);
+    var output = new File(y).openWrite(mode: FileMode.write);
     output.add(data);
     output.close();
     output.done.then((_) {
diff --git a/tests/standalone_2/io/file_system_watcher_test.dart b/tests/standalone_2/io/file_system_watcher_test.dart
index 2a71f05..00b6a60 100644
--- a/tests/standalone_2/io/file_system_watcher_test.dart
+++ b/tests/standalone_2/io/file_system_watcher_test.dart
@@ -156,7 +156,7 @@
   var dir = Directory.systemTemp.createTempSync('dart_file_system_watcher');
   var file = new File(join(dir.path, 'file'));
 
-  var watcher = dir.watch(events: FileSystemEvent.MODIFY);
+  var watcher = dir.watch(events: FileSystemEvent.modify);
 
   asyncStart();
   var sub;
@@ -188,19 +188,19 @@
   sub = watcher.listen((event) {
     int newState = 0;
     switch (event.type) {
-      case FileSystemEvent.CREATE:
+      case FileSystemEvent.create:
         newState = 1;
         break;
 
-      case FileSystemEvent.MODIFY:
+      case FileSystemEvent.modify:
         newState = 2;
         break;
 
-      case FileSystemEvent.MOVE:
+      case FileSystemEvent.move:
         newState = 3;
         break;
 
-      case FileSystemEvent.DELETE:
+      case FileSystemEvent.delete:
         newState = 4;
         sub.cancel();
         asyncEnd();
diff --git a/tests/standalone_2/io/file_test.dart b/tests/standalone_2/io/file_test.dart
index da550d8..3715504 100644
--- a/tests/standalone_2/io/file_test.dart
+++ b/tests/standalone_2/io/file_test.dart
@@ -232,7 +232,7 @@
     // Read a file and check part of it's contents.
     String filename = getFilename("file_test.txt");
     File file = new File(filename);
-    file.open(mode: READ).then((RandomAccessFile file) {
+    file.open(mode: FileMode.read).then((RandomAccessFile file) {
       List<int> buffer = new List<int>(10);
       file.readInto(buffer, 0, 5).then((bytes_read) {
         Expect.equals(5, bytes_read);
@@ -303,7 +303,7 @@
     // Read a file.
     String inFilename = getFilename("fixed_length_file");
     final File file = new File(inFilename);
-    file.open(mode: READ).then((openedFile) {
+    file.open(mode: FileMode.read).then((openedFile) {
       List<int> buffer1 = new List<int>(42);
       openedFile.readInto(buffer1, 0, 42).then((bytes_read) {
         Expect.equals(42, bytes_read);
@@ -317,12 +317,12 @@
               if (s[0] != '/' && s[0] != '\\' && s[1] != ':') {
                 Expect.fail("Not a full path");
               }
-              file2.open(mode: WRITE).then((openedFile2) {
+              file2.open(mode: FileMode.write).then((openedFile2) {
                 openedFile2.writeFrom(buffer1, 0, bytes_read).then((ignore) {
                   openedFile2.close().then((ignore) {
                     List<int> buffer2 = new List<int>(bytes_read);
                     final File file3 = new File(outFilename);
-                    file3.open(mode: READ).then((openedFile3) {
+                    file3.open(mode: FileMode.read).then((openedFile3) {
                       openedFile3.readInto(buffer2, 0, 42).then((bytes_read) {
                         Expect.equals(42, bytes_read);
                         openedFile3.close().then((ignore) {
@@ -360,17 +360,17 @@
     file.createSync();
     Expect.isTrue(new File(filename).existsSync());
     List<int> buffer = content.codeUnits;
-    RandomAccessFile openedFile = file.openSync(mode: WRITE);
+    RandomAccessFile openedFile = file.openSync(mode: FileMode.write);
     openedFile.writeFromSync(buffer, 0, buffer.length);
     openedFile.closeSync();
     // Reopen the file in write mode to ensure that we overwrite the content.
-    openedFile = (new File(filename)).openSync(mode: WRITE);
+    openedFile = (new File(filename)).openSync(mode: FileMode.write);
     openedFile.writeFromSync(buffer, 0, buffer.length);
     Expect.equals(content.length, openedFile.lengthSync());
     openedFile.closeSync();
     // Open the file in append mode and ensure that we do not overwrite
     // the existing content.
-    openedFile = (new File(filename)).openSync(mode: APPEND);
+    openedFile = (new File(filename)).openSync(mode: FileMode.append);
     openedFile.writeFromSync(buffer, 2, buffer.length - 2);
     Expect.equals(content.length + content.length - 4, openedFile.lengthSync());
     Expect.equals(content + content.substring(2, content.length - 2),
@@ -391,12 +391,12 @@
     output.close();
     output.done.then((_) {
       File file2 = new File(filename);
-      var appendingOutput = file2.openWrite(mode: APPEND);
+      var appendingOutput = file2.openWrite(mode: FileMode.append);
       appendingOutput.add(buffer);
       appendingOutput.close();
       appendingOutput.done.then((_) {
         File file3 = new File(filename);
-        file3.open(mode: READ).then((RandomAccessFile openedFile) {
+        file3.open(mode: FileMode.read).then((RandomAccessFile openedFile) {
           openedFile.length().then((int length) {
             Expect.equals(content.length * 2, length);
             openedFile.close().then((ignore) {
@@ -457,7 +457,7 @@
       Expect.fail("Not a full path");
     }
     Expect.isTrue(new File(path).existsSync());
-    RandomAccessFile openedFile = outFile.openSync(mode: WRITE);
+    RandomAccessFile openedFile = outFile.openSync(mode: FileMode.write);
     openedFile.writeFromSync(buffer1, 0, bytes_read);
     openedFile.closeSync();
     // Now read the contents of the file just written.
@@ -495,7 +495,7 @@
       Expect.fail("Not a full path");
     }
     Expect.isTrue(new File(path).existsSync());
-    RandomAccessFile openedFile = outFile.openSync(mode: WRITE);
+    RandomAccessFile openedFile = outFile.openSync(mode: FileMode.write);
     openedFile.writeFromSync(buffer1);
     openedFile.closeSync();
     // Now read the contents of the file just written.
@@ -529,7 +529,7 @@
     File file = new File(fileName);
     asyncTestStarted();
     file.create().then((ignore) {
-      file.open(mode: READ).then((RandomAccessFile openedFile) {
+      file.open(mode: FileMode.read).then((RandomAccessFile openedFile) {
         var readByteFuture = openedFile.readByte();
         readByteFuture.then((int byte) {
           Expect.equals(-1, byte);
@@ -547,7 +547,7 @@
     final String fileName = "${tempDirectory.path}/testWriteVariousLists";
     final File file = new File(fileName);
     file.create().then((ignore) {
-      file.open(mode: WRITE).then((RandomAccessFile openedFile) {
+      file.open(mode: FileMode.write).then((RandomAccessFile openedFile) {
         // Write bytes from 0 to 7.
         openedFile.writeFromSync([0], 0, 1);
         openedFile.writeFromSync(const [1], 0, 1);
@@ -588,7 +588,7 @@
       tmp = tempDirectory.createTempSync('write_from_offset_test_');
       File f = new File('${tmp.path}/file')..createSync();
       f.writeAsStringSync('pre-existing content\n', flush: true);
-      raf = f.openSync(mode: FileMode.APPEND);
+      raf = f.openSync(mode: FileMode.append);
       String truth = "Hello world";
       raf.writeFromSync(utf8.encode('Hello world'), 2, 5);
       raf.flushSync();
@@ -723,7 +723,7 @@
     asyncTestStarted();
     File file = new File(tempDirectory.path + "/out_truncate");
     List<int> buffer = const [65, 65, 65, 65, 65, 65, 65, 65, 65, 65];
-    file.open(mode: WRITE).then((RandomAccessFile openedFile) {
+    file.open(mode: FileMode.write).then((RandomAccessFile openedFile) {
       openedFile.writeFrom(buffer, 0, 10).then((ignore) {
         openedFile.length().then((length) {
           Expect.equals(10, length);
@@ -748,7 +748,7 @@
   static void testTruncateSync() {
     File file = new File(tempDirectory.path + "/out_truncate_sync");
     List<int> buffer = const [65, 65, 65, 65, 65, 65, 65, 65, 65, 65];
-    RandomAccessFile openedFile = file.openSync(mode: WRITE);
+    RandomAccessFile openedFile = file.openSync(mode: FileMode.write);
     openedFile.writeFromSync(buffer, 0, 10);
     Expect.equals(10, openedFile.lengthSync());
     openedFile.truncateSync(5);
@@ -773,7 +773,7 @@
     asyncTestStarted();
     File file = new File(tempDirectory.path + "/out_read_into");
 
-    var openedFile = await file.open(mode: WRITE);
+    var openedFile = await file.open(mode: FileMode.write);
     await openedFile.writeFrom(const [1, 2, 3]);
 
     await openedFile.setPosition(0);
@@ -804,7 +804,7 @@
   static void testReadIntoSync() {
     File file = new File(tempDirectory.path + "/out_read_into_sync");
 
-    var openedFile = file.openSync(mode: WRITE);
+    var openedFile = file.openSync(mode: FileMode.write);
     openedFile.writeFromSync(const [1, 2, 3]);
 
     openedFile.setPositionSync(0);
@@ -835,7 +835,7 @@
     File file = new File(tempDirectory.path + "/out_write_from");
 
     var buffer = const [1, 2, 3];
-    var openedFile = await file.open(mode: WRITE);
+    var openedFile = await file.open(mode: FileMode.write);
 
     await openedFile.writeFrom(buffer);
     var result = []..addAll(buffer);
@@ -866,7 +866,7 @@
     File file = new File(tempDirectory.path + "/out_write_from_sync");
 
     var buffer = const [1, 2, 3];
-    var openedFile = file.openSync(mode: WRITE);
+    var openedFile = file.openSync(mode: FileMode.write);
 
     openedFile.writeFromSync(buffer);
     var result = []..addAll(buffer);
@@ -894,7 +894,7 @@
     bool exceptionCaught = false;
     bool wrongExceptionCaught = false;
     File input = new File(tempDirectory.path + "/out_close_exception");
-    RandomAccessFile openedFile = input.openSync(mode: WRITE);
+    RandomAccessFile openedFile = input.openSync(mode: FileMode.write);
     openedFile.closeSync();
     try {
       openedFile.readByteSync();
@@ -1000,7 +1000,7 @@
     bool exceptionCaught = false;
     bool wrongExceptionCaught = false;
     File file = new File(tempDirectory.path + "/out_buffer_out_of_bounds");
-    RandomAccessFile openedFile = file.openSync(mode: WRITE);
+    RandomAccessFile openedFile = file.openSync(mode: FileMode.write);
     try {
       List<int> buffer = new List<int>(10);
       openedFile.readIntoSync(buffer, 0, 12);
@@ -1094,7 +1094,7 @@
 
   static void testOpenDirectoryAsFile() {
     var f = new File('.');
-    var future = f.open(mode: READ);
+    var future = f.open(mode: FileMode.read);
     future
         .then((r) => Expect.fail('Directory opened as file'))
         .catchError((e) {});
@@ -1452,10 +1452,10 @@
   static void testAppend() {
     asyncTestStarted();
     var file = new File('${tempDirectory.path}/out_append');
-    file.open(mode: WRITE).then((openedFile) {
+    file.open(mode: FileMode.write).then((openedFile) {
       openedFile.writeString("asdf").then((ignore) {
         openedFile.close().then((ignore) {
-          file.open(mode: APPEND).then((openedFile) {
+          file.open(mode: FileMode.append).then((openedFile) {
             openedFile.length().then((length) {
               Expect.equals(4, length);
               openedFile.writeString("asdf").then((ignore) {
@@ -1480,11 +1480,11 @@
 
   static void testAppendSync() {
     var file = new File('${tempDirectory.path}/out_append_sync');
-    var openedFile = file.openSync(mode: WRITE);
+    var openedFile = file.openSync(mode: FileMode.write);
     openedFile.writeStringSync("asdf");
     Expect.equals(4, openedFile.lengthSync());
     openedFile.closeSync();
-    openedFile = file.openSync(mode: WRITE);
+    openedFile = file.openSync(mode: FileMode.write);
     openedFile.setPositionSync(4);
     openedFile.writeStringSync("asdf");
     Expect.equals(8, openedFile.lengthSync());
@@ -1497,12 +1497,12 @@
     asyncTestStarted();
     var file = new File('${tempDirectory.path}/out_write_string');
     var string = new String.fromCharCodes([0x192]);
-    file.open(mode: WRITE).then((openedFile) {
+    file.open(mode: FileMode.write).then((openedFile) {
       openedFile.writeString(string).then((_) {
         openedFile.length().then((l) {
           Expect.equals(2, l);
           openedFile.close().then((_) {
-            file.open(mode: APPEND).then((openedFile) {
+            file.open(mode: FileMode.append).then((openedFile) {
               openedFile.setPosition(2).then((_) {
                 openedFile.writeString(string).then((_) {
                   openedFile.length().then((l) {
@@ -1531,11 +1531,11 @@
   static void testWriteStringUtf8Sync() {
     var file = new File('${tempDirectory.path}/out_write_string_sync');
     var string = new String.fromCharCodes([0x192]);
-    var openedFile = file.openSync(mode: WRITE);
+    var openedFile = file.openSync(mode: FileMode.write);
     openedFile.writeStringSync(string);
     Expect.equals(2, openedFile.lengthSync());
     openedFile.closeSync();
-    openedFile = file.openSync(mode: APPEND);
+    openedFile = file.openSync(mode: FileMode.append);
     openedFile.setPositionSync(2);
     openedFile.writeStringSync(string);
     Expect.equals(4, openedFile.lengthSync());
diff --git a/tests/standalone_2/io/file_typed_data_test.dart b/tests/standalone_2/io/file_typed_data_test.dart
index 4ef1612..d10307d 100644
--- a/tests/standalone_2/io/file_typed_data_test.dart
+++ b/tests/standalone_2/io/file_typed_data_test.dart
@@ -23,7 +23,7 @@
 
   Directory.systemTemp.createTemp('dart_file_typed_data').then((temp) {
     var file = new File("${temp.path}/test");
-    file.open(mode: FileMode.WRITE).then((raf) {
+    file.open(mode: FileMode.write).then((raf) {
       return raf.writeFrom(list, 0, LIST_LENGTH);
     }).then((raf) {
       return raf.writeFrom(view, 0, VIEW_LENGTH);
@@ -53,7 +53,7 @@
 
   Directory.systemTemp.createTemp('dart_file_typed_data').then((temp) {
     var file = new File("${temp.path}/test");
-    file.open(mode: FileMode.WRITE).then((raf) {
+    file.open(mode: FileMode.write).then((raf) {
       return raf.writeFrom(list, 0, LIST_LENGTH);
     }).then((raf) {
       return raf.writeFrom(view, 0, VIEW_LENGTH);
@@ -83,7 +83,7 @@
 
   Directory.systemTemp.createTemp('dart_file_typed_data').then((temp) {
     var file = new File("${temp.path}/test");
-    file.open(mode: FileMode.WRITE).then((raf) {
+    file.open(mode: FileMode.write).then((raf) {
       return raf.writeFrom(list, 0, LIST_LENGTH);
     }).then((raf) {
       return raf.writeFrom(view, 0, VIEW_LENGTH);
@@ -115,7 +115,7 @@
 
   Directory.systemTemp.createTemp('dart_file_typed_data').then((temp) {
     var file = new File("${temp.path}/test");
-    file.open(mode: FileMode.WRITE).then((raf) {
+    file.open(mode: FileMode.write).then((raf) {
       return raf.writeFrom(
           new Uint8List.view(list.buffer), 0, LIST_LENGTH_IN_BYTES);
     }).then((raf) {
@@ -157,7 +157,7 @@
 
   Directory.systemTemp.createTemp('dart_file_typed_data').then((temp) {
     var file = new File("${temp.path}/test");
-    file.open(mode: FileMode.WRITE).then((raf) {
+    file.open(mode: FileMode.write).then((raf) {
       return raf.writeFrom(
           new Uint8List.view(list.buffer), 0, LIST_LENGTH_IN_BYTES);
     }).then((raf) {
@@ -199,7 +199,7 @@
 
   Directory.systemTemp.createTemp('dart_file_typed_data').then((temp) {
     var file = new File("${temp.path}/test");
-    file.open(mode: FileMode.WRITE).then((raf) {
+    file.open(mode: FileMode.write).then((raf) {
       return raf.writeFrom(
           new Uint8List.view(list.buffer), 0, LIST_LENGTH_IN_BYTES);
     }).then((raf) {
@@ -241,7 +241,7 @@
 
   Directory.systemTemp.createTemp('dart_file_typed_data').then((temp) {
     var file = new File("${temp.path}/test");
-    file.open(mode: FileMode.WRITE).then((raf) {
+    file.open(mode: FileMode.write).then((raf) {
       return raf.writeFrom(
           new Uint8List.view(list.buffer), 0, LIST_LENGTH_IN_BYTES);
     }).then((raf) {
@@ -283,7 +283,7 @@
 
   Directory.systemTemp.createTemp('dart_file_typed_data').then((temp) {
     var file = new File("${temp.path}/test");
-    file.open(mode: FileMode.WRITE).then((raf) {
+    file.open(mode: FileMode.write).then((raf) {
       return raf.writeFrom(
           new Uint8List.view(list.buffer), 0, LIST_LENGTH_IN_BYTES);
     }).then((raf) {
@@ -325,7 +325,7 @@
 
   Directory.systemTemp.createTemp('dart_file_typed_data').then((temp) {
     var file = new File("${temp.path}/test");
-    file.open(mode: FileMode.WRITE).then((raf) {
+    file.open(mode: FileMode.write).then((raf) {
       return raf.writeFrom(
           new Uint8List.view(list.buffer), 0, LIST_LENGTH_IN_BYTES);
     }).then((raf) {
diff --git a/tests/standalone_2/io/file_write_as_test.dart b/tests/standalone_2/io/file_write_as_test.dart
index efbe0a7..ce13ebd 100644
--- a/tests/standalone_2/io/file_write_as_test.dart
+++ b/tests/standalone_2/io/file_write_as_test.dart
@@ -13,7 +13,7 @@
   var data = [50, 50, 50];
   f.writeAsBytesSync(data);
   Expect.listEquals(data, f.readAsBytesSync());
-  f.writeAsBytesSync(data, mode: FileMode.APPEND, flush: true);
+  f.writeAsBytesSync(data, mode: FileMode.append, flush: true);
   var expected = [50, 50, 50, 50, 50, 50];
   Expect.listEquals(expected, f.readAsBytesSync());
 }
@@ -23,7 +23,7 @@
   var data = 'asdf';
   f.writeAsStringSync(data);
   Expect.equals(data, f.readAsStringSync());
-  f.writeAsStringSync(data, mode: FileMode.APPEND, flush: true);
+  f.writeAsStringSync(data, mode: FileMode.append, flush: true);
   Expect.equals('$data$data', f.readAsStringSync());
 }
 
@@ -35,7 +35,7 @@
     Expect.equals(f, file);
     f.readAsBytes().then((bytes) {
       Expect.listEquals(data, bytes);
-      f.writeAsBytes(data, mode: FileMode.APPEND, flush: true).then((file) {
+      f.writeAsBytes(data, mode: FileMode.append, flush: true).then((file) {
         Expect.equals(f, file);
         f.readAsBytes().then((bytes) {
           var expected = [50, 50, 50, 50, 50, 50];
@@ -56,7 +56,7 @@
     Expect.equals(f, file);
     f.readAsString().then((str) {
       Expect.equals(data, str);
-      f.writeAsString(data, mode: FileMode.APPEND, flush: true).then((file) {
+      f.writeAsString(data, mode: FileMode.append, flush: true).then((file) {
         Expect.equals(f, file);
         f.readAsString().then((str) {
           Expect.equals('$data$data', str);
diff --git a/tests/standalone_2/io/file_write_only_test.dart b/tests/standalone_2/io/file_write_only_test.dart
index 6cb5842..a4e571e 100644
--- a/tests/standalone_2/io/file_write_only_test.dart
+++ b/tests/standalone_2/io/file_write_only_test.dart
@@ -34,7 +34,7 @@
 
 Future write(Directory dir) async {
   var f = new File("${dir.path}${Platform.pathSeparator}write");
-  var raf = await f.open(mode: WRITE_ONLY);
+  var raf = await f.open(mode: FileMode.writeOnly);
   await raf.writeString('Hello');
   await raf.setPosition(0);
   await raf.writeString('Hello');
@@ -42,7 +42,7 @@
   await expectThrowsAsync(
       raf.readByte(), 'Read from write only file succeeded');
   await raf.close();
-  raf = await f.open(mode: WRITE_ONLY_APPEND);
+  raf = await f.open(mode: FileMode.writeOnlyAppend);
   await raf.writeString('Hello');
   await expectThrowsAsync(
       raf.readByte(), 'Read from write only file succeeded');
@@ -54,7 +54,7 @@
 
 void writeSync(Directory dir) {
   var f = new File("${dir.path}${Platform.pathSeparator}write_sync");
-  var raf = f.openSync(mode: WRITE_ONLY);
+  var raf = f.openSync(mode: FileMode.writeOnly);
   raf.writeStringSync('Hello');
   raf.setPositionSync(0);
   raf.writeStringSync('Hello');
@@ -65,10 +65,10 @@
 
 Future openWrite(Directory dir) async {
   var f = new File("${dir.path}${Platform.pathSeparator}open_write");
-  var sink = f.openWrite(mode: WRITE_ONLY);
+  var sink = f.openWrite(mode: FileMode.writeOnly);
   sink.write('Hello');
   await sink.close();
-  sink = await f.openWrite(mode: WRITE_ONLY_APPEND);
+  sink = await f.openWrite(mode: FileMode.writeOnlyAppend);
   sink.write('Hello');
   await sink.close();
   Expect.equals(f.lengthSync(), 10);
diff --git a/tests/standalone_2/io/fuzz_support.dart b/tests/standalone_2/io/fuzz_support.dart
index 7d0e4aa..4b9d59d 100644
--- a/tests/standalone_2/io/fuzz_support.dart
+++ b/tests/standalone_2/io/fuzz_support.dart
@@ -13,7 +13,7 @@
   'int': 0,
   'int64': -9000000000000000000,
   'String': 'a',
-  'FileMode': FileMode.READ,
+  'FileMode': FileMode.read,
   'num': 0.50,
   'List<int>': const [1, 2, 3],
   'Map<String, int>': const {"a": 23}
diff --git a/tests/standalone_2/io/internet_address_test.dart b/tests/standalone_2/io/internet_address_test.dart
index a7ffa18..1832207 100644
--- a/tests/standalone_2/io/internet_address_test.dart
+++ b/tests/standalone_2/io/internet_address_test.dart
@@ -7,65 +7,65 @@
 import "package:expect/expect.dart";
 
 void testDefaultAddresses() {
-  var loopback4 = InternetAddress.LOOPBACK_IP_V4;
+  var loopback4 = InternetAddress.loopbackIPv4;
   Expect.isNotNull(loopback4);
-  Expect.equals(InternetAddressType.IP_V4, loopback4.type);
+  Expect.equals(InternetAddressType.IPv4, loopback4.type);
   Expect.equals("127.0.0.1", loopback4.host);
   Expect.equals("127.0.0.1", loopback4.address);
   Expect.listEquals([127, 0, 0, 1], loopback4.rawAddress);
 
-  var loopback6 = InternetAddress.LOOPBACK_IP_V6;
+  var loopback6 = InternetAddress.loopbackIPv6;
   Expect.isNotNull(loopback6);
-  Expect.equals(InternetAddressType.IP_V6, loopback6.type);
+  Expect.equals(InternetAddressType.IPv6, loopback6.type);
   Expect.equals("::1", loopback6.host);
   Expect.equals("::1", loopback6.address);
   Expect.listEquals(
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], loopback6.rawAddress);
 
-  var any4 = InternetAddress.ANY_IP_V4;
+  var any4 = InternetAddress.anyIPv4;
   Expect.isNotNull(any4);
-  Expect.equals(InternetAddressType.IP_V4, any4.type);
+  Expect.equals(InternetAddressType.IPv4, any4.type);
   Expect.equals("0.0.0.0", any4.host);
   Expect.equals("0.0.0.0", any4.address);
 
-  var any6 = InternetAddress.ANY_IP_V6;
+  var any6 = InternetAddress.anyIPv6;
   Expect.isNotNull(any6);
-  Expect.equals(InternetAddressType.IP_V6, any6.type);
+  Expect.equals(InternetAddressType.IPv6, any6.type);
   Expect.equals("::", any6.host);
   Expect.equals("::", any6.address);
 }
 
 void testConstructor() {
   var loopback4 = new InternetAddress("127.0.0.1");
-  Expect.equals(InternetAddressType.IP_V4, loopback4.type);
+  Expect.equals(InternetAddressType.IPv4, loopback4.type);
   Expect.equals("127.0.0.1", loopback4.host);
   Expect.equals("127.0.0.1", loopback4.address);
   Expect.isFalse(loopback4.isMulticast);
 
   var loopback6 = new InternetAddress("::1");
-  Expect.equals(InternetAddressType.IP_V6, loopback6.type);
+  Expect.equals(InternetAddressType.IPv6, loopback6.type);
   Expect.equals("::1", loopback6.host);
   Expect.equals("::1", loopback6.address);
   Expect.isFalse(loopback6.isMulticast);
 
   var ip4 = new InternetAddress("10.20.30.40");
-  Expect.equals(InternetAddressType.IP_V4, ip4.type);
+  Expect.equals(InternetAddressType.IPv4, ip4.type);
   Expect.equals("10.20.30.40", ip4.host);
   Expect.equals("10.20.30.40", ip4.address);
   Expect.isFalse(ip4.isMulticast);
 
   var ip6 = new InternetAddress("10:20::30:40");
-  Expect.equals(InternetAddressType.IP_V6, ip6.type);
+  Expect.equals(InternetAddressType.IPv6, ip6.type);
   Expect.equals("10:20::30:40", ip6.host);
   Expect.equals("10:20::30:40", ip6.address);
   Expect.isFalse(ip6.isMulticast);
 
   var multicast4 = new InternetAddress("224.1.2.3");
-  Expect.equals(InternetAddressType.IP_V4, multicast4.type);
+  Expect.equals(InternetAddressType.IPv4, multicast4.type);
   Expect.isTrue(multicast4.isMulticast);
 
   var multicast6 = new InternetAddress("FF00::1:2:3");
-  Expect.equals(InternetAddressType.IP_V6, multicast6.type);
+  Expect.equals(InternetAddressType.IPv6, multicast6.type);
   Expect.isTrue(multicast6.isMulticast);
 
   Expect.throwsArgumentError(() => new InternetAddress("1.2.3"));
@@ -75,10 +75,9 @@
 void testEquality() {
   Expect.equals(
       new InternetAddress("127.0.0.1"), new InternetAddress("127.0.0.1"));
-  Expect.equals(
-      new InternetAddress("127.0.0.1"), InternetAddress.LOOPBACK_IP_V4);
+  Expect.equals(new InternetAddress("127.0.0.1"), InternetAddress.loopbackIPv4);
   Expect.equals(new InternetAddress("::1"), new InternetAddress("::1"));
-  Expect.equals(new InternetAddress("::1"), InternetAddress.LOOPBACK_IP_V6);
+  Expect.equals(new InternetAddress("::1"), InternetAddress.loopbackIPv6);
   Expect.equals(new InternetAddress("1:2:3:4:5:6:7:8"),
       new InternetAddress("1:2:3:4:5:6:7:8"));
   Expect.equals(
@@ -91,10 +90,10 @@
   set.add(new InternetAddress("::1"));
   set.add(new InternetAddress("1:2:3:4:5:6:7:8"));
   Expect.isTrue(set.contains(new InternetAddress("127.0.0.1")));
-  Expect.isTrue(set.contains(InternetAddress.LOOPBACK_IP_V4));
+  Expect.isTrue(set.contains(InternetAddress.loopbackIPv4));
   Expect.isFalse(set.contains(new InternetAddress("127.0.0.2")));
   Expect.isTrue(set.contains(new InternetAddress("::1")));
-  Expect.isTrue(set.contains(InternetAddress.LOOPBACK_IP_V6));
+  Expect.isTrue(set.contains(InternetAddress.loopbackIPv6));
   Expect.isFalse(set.contains(new InternetAddress("::2")));
   Expect.isTrue(set.contains(new InternetAddress("1:2:3:4:5:6:7:8")));
   Expect.isFalse(set.contains(new InternetAddress("1:2:3:4:5:6:7:9")));
diff --git a/tests/standalone_2/io/issue_22636_test.dart b/tests/standalone_2/io/issue_22636_test.dart
index 3289d49..4bfa9dc 100644
--- a/tests/standalone_2/io/issue_22636_test.dart
+++ b/tests/standalone_2/io/issue_22636_test.dart
@@ -20,7 +20,7 @@
 void serverListen(RawSocket serverSide) {
   void serveData(RawSocketEvent event) {
     switch (event) {
-      case RawSocketEvent.WRITE:
+      case RawSocketEvent.write:
         serverSide.write(data);
         if (serverFirstWrite) {
           serverFirstWrite = false;
@@ -30,12 +30,12 @@
         } else {
           new Future.delayed(delay, () {
             Expect.isTrue(serverReadClosedReceived);
-            serverSide.shutdown(SocketDirection.SEND);
+            serverSide.shutdown(SocketDirection.send);
             server.close();
           });
         }
         break;
-      case RawSocketEvent.READ_CLOSED:
+      case RawSocketEvent.readClosed:
         Expect.isFalse(serverReadClosedReceived);
         serverReadClosedReceived = true;
         break;
@@ -46,12 +46,12 @@
 }
 
 test() async {
-  server = await RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0);
+  server = await RawServerSocket.bind(InternetAddress.loopbackIPv4, 0);
   server.listen(serverListen);
-  client = await RawSocket.connect(InternetAddress.LOOPBACK_IP_V4, server.port);
-  client.shutdown(SocketDirection.SEND);
+  client = await RawSocket.connect(InternetAddress.loopbackIPv4, server.port);
+  client.shutdown(SocketDirection.send);
   client.listen((RawSocketEvent event) {
-    if (event == RawSocketEvent.READ) {
+    if (event == RawSocketEvent.read) {
       client.read();
     }
   });
diff --git a/tests/standalone_2/io/issue_22637_test.dart b/tests/standalone_2/io/issue_22637_test.dart
index 2eba30b..c464e56 100644
--- a/tests/standalone_2/io/issue_22637_test.dart
+++ b/tests/standalone_2/io/issue_22637_test.dart
@@ -18,7 +18,7 @@
   var data = new List.generate(200, (i) => i % 20 + 65);
   var offset = 0;
   void serveData(RawSocketEvent event) {
-    if (event == RawSocketEvent.WRITE) {
+    if (event == RawSocketEvent.write) {
       while (offset < data.length) {
         var written = serverSide.write(data, offset);
         offset += written;
@@ -36,7 +36,7 @@
 }
 
 void clientListen(RawSocketEvent event) {
-  if (event == RawSocketEvent.READ) {
+  if (event == RawSocketEvent.read) {
     client.readEventsEnabled = false;
     new Future.delayed(delay, () {
       var data = client.read(100);
@@ -46,7 +46,7 @@
         client.readEventsEnabled = true;
         return;
       }
-      client.shutdown(SocketDirection.SEND);
+      client.shutdown(SocketDirection.send);
       data = client.read(100);
       Expect.isNotNull(data);
       client.close();
@@ -55,9 +55,9 @@
 }
 
 test() async {
-  server = await RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0);
+  server = await RawServerSocket.bind(InternetAddress.loopbackIPv4, 0);
   server.listen(serverListen);
-  client = await RawSocket.connect(InternetAddress.LOOPBACK_IP_V4, server.port);
+  client = await RawSocket.connect(InternetAddress.loopbackIPv4, server.port);
   client.listen(clientListen);
 }
 
diff --git a/tests/standalone_2/io/link_async_test.dart b/tests/standalone_2/io/link_async_test.dart
index 21118e7..1884abc 100644
--- a/tests/standalone_2/io/link_async_test.dart
+++ b/tests/standalone_2/io/link_async_test.dart
@@ -40,12 +40,12 @@
         .create()
         .then((_) => new Link(link).create(target))
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.DIRECTORY, FileSystemEntity.type(link)))
+            FileSystemEntityType.directory, FileSystemEntity.type(link)))
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.DIRECTORY, FileSystemEntity.type(target)))
-        .then((_) => FutureExpect.equals(FileSystemEntityType.LINK,
+            FileSystemEntityType.directory, FileSystemEntity.type(target)))
+        .then((_) => FutureExpect.equals(FileSystemEntityType.link,
             FileSystemEntity.type(link, followLinks: false)))
-        .then((_) => FutureExpect.equals(FileSystemEntityType.DIRECTORY,
+        .then((_) => FutureExpect.equals(FileSystemEntityType.directory,
             FileSystemEntity.type(target, followLinks: false)))
         .then((_) => FutureExpect.isTrue(FileSystemEntity.isLink(link)))
         .then((_) => FutureExpect.isFalse(FileSystemEntity.isLink(target)))
@@ -72,9 +72,9 @@
           .then((_) => FutureExpect.isTrue(
               new Directory(join(base, 'target', 'createdThroughLink'))
                   .exists()))
-          .then((_) => FutureExpect.equals(FileSystemEntityType.DIRECTORY,
+          .then((_) => FutureExpect.equals(FileSystemEntityType.directory,
               FileSystemEntity.type(createdThroughLink, followLinks: false)))
-          .then((_) => FutureExpect.equals(FileSystemEntityType.DIRECTORY,
+          .then((_) => FutureExpect.equals(FileSystemEntityType.directory,
               FileSystemEntity.type(createdDirectly, followLinks: false)))
 
           // Test FileSystemEntity.identical on files, directories, and links,
diff --git a/tests/standalone_2/io/link_test.dart b/tests/standalone_2/io/link_test.dart
index 8292632..afc0f73 100644
--- a/tests/standalone_2/io/link_test.dart
+++ b/tests/standalone_2/io/link_test.dart
@@ -24,12 +24,12 @@
   new Directory(target).createSync();
   new Link(link).createSync(target);
   Expect.equals(
-      FileSystemEntityType.DIRECTORY, FileSystemEntity.typeSync(link));
+      FileSystemEntityType.directory, FileSystemEntity.typeSync(link));
   Expect.equals(
-      FileSystemEntityType.DIRECTORY, FileSystemEntity.typeSync(target));
-  Expect.equals(FileSystemEntityType.LINK,
+      FileSystemEntityType.directory, FileSystemEntity.typeSync(target));
+  Expect.equals(FileSystemEntityType.link,
       FileSystemEntity.typeSync(link, followLinks: false));
-  Expect.equals(FileSystemEntityType.DIRECTORY,
+  Expect.equals(FileSystemEntityType.directory,
       FileSystemEntity.typeSync(target, followLinks: false));
   Expect.isTrue(FileSystemEntity.isLinkSync(link));
   Expect.isFalse(FileSystemEntity.isLinkSync(target));
@@ -50,9 +50,9 @@
       new Directory(join(base, 'link', 'createdDirectly')).existsSync());
   Expect.isTrue(
       new Directory(join(base, 'target', 'createdThroughLink')).existsSync());
-  Expect.equals(FileSystemEntityType.DIRECTORY,
+  Expect.equals(FileSystemEntityType.directory,
       FileSystemEntity.typeSync(createdThroughLink, followLinks: false));
-  Expect.equals(FileSystemEntityType.DIRECTORY,
+  Expect.equals(FileSystemEntityType.directory,
       FileSystemEntity.typeSync(createdDirectly, followLinks: false));
 
   // Test FileSystemEntity.identical on files, directories, and links,
diff --git a/tests/standalone_2/io/process_detached_test.dart b/tests/standalone_2/io/process_detached_test.dart
index 66d1b19..55aeb06 100644
--- a/tests/standalone_2/io/process_detached_test.dart
+++ b/tests/standalone_2/io/process_detached_test.dart
@@ -19,7 +19,7 @@
   var script =
       Platform.script.resolve('process_detached_script.dart').toFilePath();
   var future = Process.start(Platform.executable, [script],
-      mode: ProcessStartMode.DETACHED);
+      mode: ProcessStartMode.detached);
   future.then((process) {
     Expect.isNotNull(process.pid);
     Expect.isTrue(process.pid is int);
@@ -38,7 +38,7 @@
   var script =
       Platform.script.resolve('process_detached_script.dart').toFilePath();
   var future = Process.start(Platform.executable, [script, 'echo'],
-      mode: ProcessStartMode.DETACHED_WITH_STDIO);
+      mode: ProcessStartMode.detachedWithStdio);
   future.then((process) {
     Expect.isNotNull(process.pid);
     Expect.isTrue(process.pid is int);
@@ -63,7 +63,7 @@
   asyncStart();
   Directory.systemTemp.createTemp('dart_detached_process').then((temp) {
     var future =
-        Process.start(temp.path, ['a', 'b'], mode: ProcessStartMode.DETACHED);
+        Process.start(temp.path, ['a', 'b'], mode: ProcessStartMode.detached);
     future.then((process) {
       Expect.fail('Starting process from invalid executable succeeded');
     }, onError: (e) {
diff --git a/tests/standalone_2/io/process_inherit_stdio_script.dart b/tests/standalone_2/io/process_inherit_stdio_script.dart
index 7c8b648..0fa1e0b 100644
--- a/tests/standalone_2/io/process_inherit_stdio_script.dart
+++ b/tests/standalone_2/io/process_inherit_stdio_script.dart
@@ -18,7 +18,7 @@
   var script =
       Platform.script.resolve('process_inherit_stdio_script.dart').toFilePath();
   var future = Process.start(Platform.executable, [script, "--child", "foo"],
-      mode: ProcessStartMode.INHERIT_STDIO);
+      mode: ProcessStartMode.inheritStdio);
   future.then((process) {
     process.exitCode.then((c) {
       asyncEnd();
diff --git a/tests/standalone_2/io/process_inherit_stdio_test.dart b/tests/standalone_2/io/process_inherit_stdio_test.dart
index 375f87e..090132a 100644
--- a/tests/standalone_2/io/process_inherit_stdio_test.dart
+++ b/tests/standalone_2/io/process_inherit_stdio_test.dart
@@ -17,7 +17,7 @@
 
 main() {
   asyncStart();
-  // process_inherit_stdio_script.dart spawns a process in INHERIT_STDIO mode
+  // process_inherit_stdio_script.dart spawns a process in inheritStdio mode
   // that prints to its stdout. Since that child process inherits the stdout
   // of the process spawned here, we should see it.
   var script =
diff --git a/tests/standalone_2/io/raw_datagram_read_all_test.dart b/tests/standalone_2/io/raw_datagram_read_all_test.dart
index 41bae16..9d3b8ef 100644
--- a/tests/standalone_2/io/raw_datagram_read_all_test.dart
+++ b/tests/standalone_2/io/raw_datagram_read_all_test.dart
@@ -11,7 +11,7 @@
 
 main() {
   asyncStart();
-  var address = InternetAddress.LOOPBACK_IP_V4;
+  var address = InternetAddress.loopbackIPv4;
   RawDatagramSocket.bind(address, 0).then((producer) {
     RawDatagramSocket.bind(address, 0).then((receiver) {
       int sent = 0;
@@ -25,7 +25,7 @@
       });
       var timer;
       receiver.listen((event) {
-        if (event != RawSocketEvent.READ) return;
+        if (event != RawSocketEvent.read) return;
         var datagram = receiver.receive();
         Expect.listEquals([0], datagram.data);
         if (timer != null) timer.cancel();
diff --git a/tests/standalone_2/io/raw_secure_server_closing_test.dart b/tests/standalone_2/io/raw_secure_server_closing_test.dart
index 9bae586..8ad7c10 100644
--- a/tests/standalone_2/io/raw_secure_server_closing_test.dart
+++ b/tests/standalone_2/io/raw_secure_server_closing_test.dart
@@ -42,8 +42,8 @@
   RawSecureServerSocket.bind(HOST, 0, serverContext).then((server) {
     server.listen((serverConnection) {
       serverConnection.listen((event) {
-        if (toClose == "server" || event == RawSocketEvent.READ_CLOSED) {
-          serverConnection.shutdown(SocketDirection.SEND);
+        if (toClose == "server" || event == RawSocketEvent.readClosed) {
+          serverConnection.shutdown(SocketDirection.send);
         }
       }, onDone: () {
         serverEndDone.complete(null);
@@ -55,8 +55,8 @@
         .connect(HOST, server.port, context: clientContext)
         .then((clientConnection) {
       clientConnection.listen((event) {
-        if (toClose == "client" || event == RawSocketEvent.READ_CLOSED) {
-          clientConnection.shutdown(SocketDirection.SEND);
+        if (toClose == "client" || event == RawSocketEvent.readClosed) {
+          clientConnection.shutdown(SocketDirection.send);
         }
       }, onDone: () {
         clientEndDone.complete(null);
@@ -96,7 +96,7 @@
     var subscription;
     subscription = server.listen((connection) {
       Expect.isTrue(resumed);
-      connection.shutdown(SocketDirection.SEND);
+      connection.shutdown(SocketDirection.send);
       if (++acceptCount == 2 * socketCount) {
         server.close();
         asyncEnd();
@@ -112,7 +112,7 @@
       RawSecureSocket
           .connect(HOST, server.port, context: clientContext)
           .then((connection) {
-        connection.shutdown(SocketDirection.SEND);
+        connection.shutdown(SocketDirection.send);
       });
     }
     new Timer(const Duration(milliseconds: 500), () {
@@ -122,7 +122,7 @@
         RawSecureSocket
             .connect(HOST, server.port, context: clientContext)
             .then((connection) {
-          connection.shutdown(SocketDirection.SEND);
+          connection.shutdown(SocketDirection.send);
         });
       }
     });
diff --git a/tests/standalone_2/io/raw_secure_socket_pause_test.dart b/tests/standalone_2/io/raw_secure_socket_pause_test.dart
index 9bcf421..34cbfe4 100644
--- a/tests/standalone_2/io/raw_secure_socket_pause_test.dart
+++ b/tests/standalone_2/io/raw_secure_socket_pause_test.dart
@@ -78,21 +78,21 @@
   void handleRawEvent(RawSocketEvent event) {
     Expect.isFalse(paused);
     switch (event) {
-      case RawSocketEvent.READ:
+      case RawSocketEvent.read:
         Expect.isFalse(readEventsPaused);
         runReadEventTest();
         body.addAll(socket.read());
         break;
-      case RawSocketEvent.WRITE:
+      case RawSocketEvent.write:
         written += socket.write(message, written, message.length - written);
         if (written < message.length) {
           socket.writeEventsEnabled = true;
         } else {
-          socket.shutdown(SocketDirection.SEND);
+          socket.shutdown(SocketDirection.send);
           runPauseTest();
         }
         break;
-      case RawSocketEvent.READ_CLOSED:
+      case RawSocketEvent.readClosed:
         Expect.isTrue(body.length > 100);
         Expect.equals(72, body.first);
         Expect.equals(9, body.last);
diff --git a/tests/standalone_2/io/raw_secure_socket_test.dart b/tests/standalone_2/io/raw_secure_socket_test.dart
index 4689a50..c2ab9fc 100644
--- a/tests/standalone_2/io/raw_secure_socket_test.dart
+++ b/tests/standalone_2/io/raw_secure_socket_test.dart
@@ -44,18 +44,18 @@
       context: clientContext);
   socket.listen((RawSocketEvent event) {
     switch (event) {
-      case RawSocketEvent.READ:
+      case RawSocketEvent.read:
         body.addAll(socket.read());
         break;
-      case RawSocketEvent.WRITE:
+      case RawSocketEvent.write:
         written += socket.write(message, written, message.length - written);
         if (written < message.length) {
           socket.writeEventsEnabled = true;
         } else {
-          socket.shutdown(SocketDirection.SEND);
+          socket.shutdown(SocketDirection.send);
         }
         break;
-      case RawSocketEvent.READ_CLOSED:
+      case RawSocketEvent.readClosed:
         Expect.isTrue(body.length > 100, "$body\n${body.length}");
         Expect.equals(72, body[0]);
         Expect.equals(9, body[body.length - 1]);
diff --git a/tests/standalone_2/io/raw_server_socket_cancel_test.dart b/tests/standalone_2/io/raw_server_socket_cancel_test.dart
index 0c74a16..ccdb93b 100644
--- a/tests/standalone_2/io/raw_server_socket_cancel_test.dart
+++ b/tests/standalone_2/io/raw_server_socket_cancel_test.dart
@@ -38,13 +38,13 @@
       client.writeEventsEnabled = false;
       client.listen((event) {
         switch (event) {
-          case RawSocketEvent.READ:
+          case RawSocketEvent.read:
             client.read();
             break;
-          case RawSocketEvent.READ_CLOSED:
-            client.shutdown(SocketDirection.SEND);
+          case RawSocketEvent.readClosed:
+            client.shutdown(SocketDirection.send);
             break;
-          case RawSocketEvent.WRITE:
+          case RawSocketEvent.write:
             Expect.fail("No write event expected");
             break;
         }
@@ -71,19 +71,19 @@
         var subscription;
         subscription = socket.listen((event) {
           switch (event) {
-            case RawSocketEvent.READ:
+            case RawSocketEvent.read:
               Expect.fail("No read event expected");
               break;
-            case RawSocketEvent.READ_CLOSED:
+            case RawSocketEvent.readClosed:
               done = true;
               doneCount++;
               checkDone();
               break;
-            case RawSocketEvent.WRITE:
+            case RawSocketEvent.write:
               // We don't care if this write succeeds, so we don't check
               // the return value (number of bytes written).
               socket.write([1, 2, 3]);
-              socket.shutdown(SocketDirection.SEND);
+              socket.shutdown(SocketDirection.send);
               break;
           }
         }, onDone: () {
diff --git a/tests/standalone_2/io/raw_socket_cross_process_test.dart b/tests/standalone_2/io/raw_socket_cross_process_test.dart
index 86c7b3c..4ad4d04 100644
--- a/tests/standalone_2/io/raw_socket_cross_process_test.dart
+++ b/tests/standalone_2/io/raw_socket_cross_process_test.dart
@@ -7,11 +7,11 @@
 import 'dart:io';
 import "package:expect/expect.dart";
 
-const int NUM_SERVERS = 10;
+const int serversCount = 10;
 
 void main(List<String> args) {
   if (args.isEmpty) {
-    for (int i = 0; i < NUM_SERVERS; ++i) {
+    for (int i = 0; i < serversCount; ++i) {
       makeServer().then((server) {
         runClientProcess(server.port).then((_) => server.close());
       });
@@ -25,18 +25,18 @@
 }
 
 Future makeServer() {
-  return RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  return RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((connection) {
       connection.writeEventsEnabled = false;
       connection.listen((event) {
         switch (event) {
-          case RawSocketEvent.READ:
+          case RawSocketEvent.read:
             Expect.fail("No read event expected");
             break;
-          case RawSocketEvent.READ_CLOSED:
-            connection.shutdown(SocketDirection.SEND);
+          case RawSocketEvent.readClosed:
+            connection.shutdown(SocketDirection.send);
             break;
-          case RawSocketEvent.WRITE:
+          case RawSocketEvent.write:
             Expect.fail("No write event expected");
             break;
         }
@@ -68,8 +68,8 @@
 }
 
 runClient(int port) {
-  RawSocket.connect(InternetAddress.LOOPBACK_IP_V4, port).then((connection) {
+  RawSocket.connect(InternetAddress.loopbackIPv4, port).then((connection) {
     connection.listen((_) {}, onDone: () => print('SUCCESS'));
-    connection.shutdown(SocketDirection.SEND);
+    connection.shutdown(SocketDirection.send);
   });
 }
diff --git a/tests/standalone_2/io/raw_socket_test.dart b/tests/standalone_2/io/raw_socket_test.dart
index 4f3eb57..27ad20c 100644
--- a/tests/standalone_2/io/raw_socket_test.dart
+++ b/tests/standalone_2/io/raw_socket_test.dart
@@ -21,7 +21,7 @@
 
 void testSimpleBind() {
   asyncStart();
-  RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((s) {
+  RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((s) {
     Expect.isTrue(s.port > 0);
     s.close();
     asyncEnd();
@@ -49,8 +49,8 @@
 
   // Bind to a port already in use.
   asyncStart();
-  RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((s) {
-    RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, s.port).then((t) {
+  RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((s) {
+    RawServerSocket.bind(InternetAddress.loopbackIPv4, s.port).then((t) {
       Expect.fail("Multiple listens on same port");
     }).catchError((error) {
       Expect.isTrue(error is SocketException);
@@ -62,7 +62,7 @@
 
 void testSimpleConnect() {
   asyncStart();
-  RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((socket) {
       socket.close();
     });
@@ -86,10 +86,10 @@
   ]).then((_) {
     asyncEnd();
   });
-  RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((serverConnection) {
       serverConnection.listen((event) {
-        if (toClose == "server" || event == RawSocketEvent.READ_CLOSED) {
+        if (toClose == "server" || event == RawSocketEvent.readClosed) {
           serverConnection.shutdown(SocketDirection.SEND);
         }
       }, onDone: () {
@@ -100,7 +100,7 @@
     });
     RawSocket.connect("127.0.0.1", server.port).then((clientConnection) {
       clientConnection.listen((event) {
-        if (toClose == "client" || event == RawSocketEvent.READ_CLOSED) {
+        if (toClose == "client" || event == RawSocketEvent.readClosed) {
           clientConnection.shutdown(SocketDirection.SEND);
         }
       }, onDone: () {
@@ -113,7 +113,7 @@
 
 void testServerListenAfterConnect() {
   asyncStart();
-  RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     Expect.isTrue(server.port > 0);
     RawSocket.connect("127.0.0.1", server.port).then((client) {
       server.listen((socket) {
@@ -149,7 +149,7 @@
     }
   }
 
-  RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((client) {
       int bytesRead = 0;
       int bytesWritten = 0;
@@ -159,7 +159,7 @@
       client.writeEventsEnabled = false;
       client.listen((event) {
         switch (event) {
-          case RawSocketEvent.READ:
+          case RawSocketEvent.read:
             if (dropReads) {
               if (serverReadCount != 10) {
                 serverReadCount++;
@@ -178,7 +178,7 @@
               client.writeEventsEnabled = true;
             }
             break;
-          case RawSocketEvent.WRITE:
+          case RawSocketEvent.write:
             Expect.isFalse(client.writeEventsEnabled);
             bytesWritten +=
                 client.write(data, bytesWritten, data.length - bytesWritten);
@@ -189,10 +189,10 @@
               client.shutdown(SocketDirection.SEND);
             }
             break;
-          case RawSocketEvent.READ_CLOSED:
+          case RawSocketEvent.readClosed:
             server.close();
             break;
-          case RawSocketEvent.CLOSED:
+          case RawSocketEvent.closed:
             Expect.isFalse(closedEventReceived);
             closedEventReceived = true;
             break;
@@ -210,7 +210,7 @@
 
       socket.listen((event) {
         switch (event) {
-          case RawSocketEvent.READ:
+          case RawSocketEvent.read:
             Expect.isTrue(socket.available() > 0);
             if (dropReads) {
               if (clientReadCount != 10) {
@@ -224,7 +224,7 @@
             data.setRange(bytesRead, bytesRead + buffer.length, buffer);
             bytesRead += buffer.length;
             break;
-          case RawSocketEvent.WRITE:
+          case RawSocketEvent.write:
             Expect.isTrue(bytesRead == 0);
             Expect.isFalse(socket.writeEventsEnabled);
             bytesWritten +=
@@ -235,11 +235,11 @@
               data = new List<int>(messageSize);
             }
             break;
-          case RawSocketEvent.READ_CLOSED:
+          case RawSocketEvent.readClosed:
             verifyTestData(data);
             socket.close();
             break;
-          case RawSocketEvent.CLOSED:
+          case RawSocketEvent.closed:
             Expect.isFalse(closedEventReceived);
             closedEventReceived = true;
             break;
@@ -260,7 +260,7 @@
   var resumed = false;
 
   asyncStart();
-  RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     Expect.isTrue(server.port > 0);
     var subscription = server.listen((socket) {
       socket.close();
@@ -304,16 +304,16 @@
   var readSubscription;
 
   asyncStart();
-  RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     Expect.isTrue(server.port > 0);
     server.listen((client) {
       bool closedEventReceived = false;
       List<int> data = new List<int>.filled(messageSize, 0);
       writeSubscription = client.listen((event) {
         switch (event) {
-          case RawSocketEvent.READ:
+          case RawSocketEvent.read:
             throw "Unexpected read event";
-          case RawSocketEvent.WRITE:
+          case RawSocketEvent.write:
             if (pauseResumeCount == loopCount) return;
             Expect.isFalse(client.writeEventsEnabled);
             Expect.equals(0, bytesRead); // Checks that reader is paused.
@@ -330,11 +330,11 @@
             }
             client.writeEventsEnabled = true;
             break;
-          case RawSocketEvent.READ_CLOSED:
+          case RawSocketEvent.readClosed:
             client.close();
             server.close();
             break;
-          case RawSocketEvent.CLOSED:
+          case RawSocketEvent.closed:
             Expect.isFalse(closedEventReceived);
             closedEventReceived = true;
             break;
@@ -349,7 +349,7 @@
       socket.writeEventsEnabled = false;
       readSubscription = socket.listen((event) {
         switch (event) {
-          case RawSocketEvent.READ:
+          case RawSocketEvent.read:
             Expect.equals(0, bytesWritten); // Checks that writer is paused.
             Expect.isTrue(socket.available() > 0);
             var buffer = socket.read();
@@ -368,11 +368,11 @@
               writeSubscription.resume();
             }
             break;
-          case RawSocketEvent.WRITE:
+          case RawSocketEvent.write:
             throw "Unexpected write event";
-          case RawSocketEvent.READ_CLOSED:
+          case RawSocketEvent.readClosed:
             throw "Unexpected read closed event";
-          case RawSocketEvent.CLOSED:
+          case RawSocketEvent.closed:
             Expect.isFalse(closedEventReceived);
             closedEventReceived = true;
             break;
@@ -388,19 +388,19 @@
 
 void testSocketZone() {
   asyncStart();
-  Expect.equals(Zone.ROOT, Zone.current);
+  Expect.equals(Zone.root, Zone.current);
   runZoned(() {
-    Expect.notEquals(Zone.ROOT, Zone.current);
-    RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
-      Expect.notEquals(Zone.ROOT, Zone.current);
+    Expect.notEquals(Zone.root, Zone.current);
+    RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
+      Expect.notEquals(Zone.root, Zone.current);
       server.listen((socket) {
-        Expect.notEquals(Zone.ROOT, Zone.current);
+        Expect.notEquals(Zone.root, Zone.current);
         socket.close();
         server.close();
       });
       RawSocket.connect("127.0.0.1", server.port).then((socket) {
         socket.listen((event) {
-          if (event == RawSocketEvent.READ_CLOSED) {
+          if (event == RawSocketEvent.readClosed) {
             socket.close();
             asyncEnd();
           }
@@ -412,13 +412,13 @@
 
 void testSocketZoneError() {
   asyncStart();
-  Expect.equals(Zone.ROOT, Zone.current);
+  Expect.equals(Zone.root, Zone.current);
   runZoned(() {
-    Expect.notEquals(Zone.ROOT, Zone.current);
-    RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
-      Expect.notEquals(Zone.ROOT, Zone.current);
+    Expect.notEquals(Zone.root, Zone.current);
+    RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
+      Expect.notEquals(Zone.root, Zone.current);
       server.listen((socket) {
-        Expect.notEquals(Zone.ROOT, Zone.current);
+        Expect.notEquals(Zone.root, Zone.current);
         var timer;
         void write() {
           socket.write(const [0]);
@@ -428,7 +428,7 @@
         write();
         socket.listen((_) {}, onError: (error) {
           timer.cancel();
-          Expect.notEquals(Zone.ROOT, Zone.current);
+          Expect.notEquals(Zone.root, Zone.current);
           socket.close();
           server.close();
           throw error;
@@ -445,7 +445,7 @@
 
 void testClosedError() {
   asyncStart();
-  RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((socket) {
       socket.close();
     });
diff --git a/tests/standalone_2/io/raw_socket_typed_data_test.dart b/tests/standalone_2/io/raw_socket_typed_data_test.dart
index 74ffd73..df31f73 100644
--- a/tests/standalone_2/io/raw_socket_typed_data_test.dart
+++ b/tests/standalone_2/io/raw_socket_typed_data_test.dart
@@ -16,21 +16,21 @@
 
 testOutOfRange() {
   asyncStart();
-  RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((client) {
       client.writeEventsEnabled = false;
       client.listen((event) {
         switch (event) {
-          case RawSocketEvent.READ:
+          case RawSocketEvent.read:
             Expect.fail("No data expected");
             break;
-          case RawSocketEvent.WRITE:
+          case RawSocketEvent.write:
             break;
-          case RawSocketEvent.READ_CLOSED:
+          case RawSocketEvent.readClosed:
             client.close();
             server.close();
             break;
-          case RawSocketEvent.CLOSED:
+          case RawSocketEvent.closed:
             break;
           default:
             throw "Unexpected event $event";
@@ -41,9 +41,9 @@
     RawSocket.connect("127.0.0.1", server.port).then((socket) {
       socket.listen((event) {
         switch (event) {
-          case RawSocketEvent.READ:
+          case RawSocketEvent.read:
             break;
-          case RawSocketEvent.WRITE:
+          case RawSocketEvent.write:
             Expect.isFalse(socket.writeEventsEnabled);
             var data;
             data = new Uint16List(1);
@@ -74,9 +74,9 @@
             Expect.throws(() => socket.write([256]));
             socket.close();
             break;
-          case RawSocketEvent.READ_CLOSED:
+          case RawSocketEvent.readClosed:
             break;
-          case RawSocketEvent.CLOSED:
+          case RawSocketEvent.closed:
             break;
           default:
             throw "Unexpected event $event";
@@ -120,7 +120,7 @@
     Expect.listEquals(expected, data);
   }
 
-  RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((client) {
       int bytesRead = 0;
       int bytesWritten = 0;
@@ -131,7 +131,7 @@
       client.writeEventsEnabled = false;
       client.listen((event) {
         switch (event) {
-          case RawSocketEvent.READ:
+          case RawSocketEvent.read:
             Expect.isTrue(bytesWritten == 0);
             Expect.isTrue(client.available() > 0);
             var buffer = client.read();
@@ -142,7 +142,7 @@
               client.writeEventsEnabled = true;
             }
             break;
-          case RawSocketEvent.WRITE:
+          case RawSocketEvent.write:
             Expect.isTrue(bytesRead == messageSize);
             Expect.isFalse(client.writeEventsEnabled);
             bytesWritten += client.write(
@@ -155,14 +155,14 @@
               if (index < data.length) {
                 client.writeEventsEnabled = true;
               } else {
-                client.shutdown(SocketDirection.SEND);
+                client.shutdown(SocketDirection.send);
               }
             }
             break;
-          case RawSocketEvent.READ_CLOSED:
+          case RawSocketEvent.readClosed:
             server.close();
             break;
-          case RawSocketEvent.CLOSED:
+          case RawSocketEvent.closed:
             break;
           default:
             throw "Unexpected event $event";
@@ -179,13 +179,13 @@
 
       socket.listen((event) {
         switch (event) {
-          case RawSocketEvent.READ:
+          case RawSocketEvent.read:
             Expect.isTrue(socket.available() > 0);
             var buffer = socket.read();
             received.setRange(bytesRead, bytesRead + buffer.length, buffer);
             bytesRead += buffer.length;
             break;
-          case RawSocketEvent.WRITE:
+          case RawSocketEvent.write:
             Expect.isTrue(bytesRead == 0);
             Expect.isFalse(socket.writeEventsEnabled);
             bytesWritten += socket.write(
@@ -200,11 +200,11 @@
               }
             }
             break;
-          case RawSocketEvent.READ_CLOSED:
+          case RawSocketEvent.readClosed:
             verifyTestData(received);
             socket.close();
             break;
-          case RawSocketEvent.CLOSED:
+          case RawSocketEvent.closed:
             break;
           default:
             throw "Unexpected event $event";
diff --git a/tests/standalone_2/io/raw_socket_write_destroy_test.dart b/tests/standalone_2/io/raw_socket_write_destroy_test.dart
index 1ef85a2..557163e 100644
--- a/tests/standalone_2/io/raw_socket_write_destroy_test.dart
+++ b/tests/standalone_2/io/raw_socket_write_destroy_test.dart
@@ -29,7 +29,7 @@
       }
 
       socket.listen((e) {
-        if (e == RawSocketEvent.WRITE) {
+        if (e == RawSocketEvent.write) {
           if (offset == buffer.length) {
             socket.close();
           } else {
@@ -42,9 +42,9 @@
     RawSocket.connect(SERVER_ADDRESS, server.port).then((socket) {
       var bytes = 0;
       socket.listen((e) {
-        if (e == RawSocketEvent.READ) {
+        if (e == RawSocketEvent.read) {
           bytes += socket.read().length;
-        } else if (e == RawSocketEvent.READ_CLOSED) {
+        } else if (e == RawSocketEvent.readClosed) {
           Expect.equals(WROTE, bytes);
           socket.close();
           server.close();
@@ -60,9 +60,9 @@
     server.listen((socket) {
       var bytes = 0;
       socket.listen((e) {
-        if (e == RawSocketEvent.READ) {
+        if (e == RawSocketEvent.read) {
           bytes += socket.read().length;
-        } else if (e == RawSocketEvent.READ_CLOSED) {
+        } else if (e == RawSocketEvent.readClosed) {
           Expect.equals(WROTE, bytes);
           socket.close();
           server.close();
@@ -81,7 +81,7 @@
       }
 
       socket.listen((e) {
-        if (e == RawSocketEvent.WRITE) {
+        if (e == RawSocketEvent.write) {
           if (offset == buffer.length) {
             socket.close();
           } else {
diff --git a/tests/standalone_2/io/raw_synchronous_socket_test.dart b/tests/standalone_2/io/raw_synchronous_socket_test.dart
index 5492b69..ba89758 100644
--- a/tests/standalone_2/io/raw_synchronous_socket_test.dart
+++ b/tests/standalone_2/io/raw_synchronous_socket_test.dart
@@ -10,16 +10,15 @@
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
 
-const String LOOPBACK_IP_V4_STRING = "127.0.0.1";
+const String loopbackIPv4String = "127.0.0.1";
 
 void testArguments() {
   Expect.throws(() => RawSynchronousSocket.connectSync(null, 0));
+  Expect
+      .throws(() => RawSynchronousSocket.connectSync(loopbackIPv4String, null));
   Expect.throws(
-      () => RawSynchronousSocket.connectSync(LOOPBACK_IP_V4_STRING, null));
-  Expect.throws(
-      () => RawSynchronousSocket.connectSync(LOOPBACK_IP_V4_STRING, 65536));
-  Expect.throws(
-      () => RawSynchronousSocket.connectSync(LOOPBACK_IP_V4_STRING, -1));
+      () => RawSynchronousSocket.connectSync(loopbackIPv4String, 65536));
+  Expect.throws(() => RawSynchronousSocket.connectSync(loopbackIPv4String, -1));
 }
 
 // The connection attempt happens on the main Dart thread and the OS timeout can
@@ -48,9 +47,9 @@
 
 void testSimpleConnect() {
   asyncStart();
-  RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     var socket =
-        RawSynchronousSocket.connectSync(LOOPBACK_IP_V4_STRING, server.port);
+        RawSynchronousSocket.connectSync(loopbackIPv4String, server.port);
     server.listen((serverSocket) {
       Expect.equals(socket.address, serverSocket.remoteAddress);
       Expect.equals(socket.port, serverSocket.remotePort);
@@ -65,10 +64,10 @@
 
 void testServerListenAfterConnect() {
   asyncStart();
-  RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     Expect.isTrue(server.port > 0);
     var client =
-        RawSynchronousSocket.connectSync(LOOPBACK_IP_V4_STRING, server.port);
+        RawSynchronousSocket.connectSync(loopbackIPv4String, server.port);
     server.listen((socket) {
       client.closeSync();
       server.close();
@@ -119,7 +118,7 @@
 // sender. The server should shutdown automatically after a specified number of
 // socket disconnections (default: 1).
 Future echoServer(var sendPort) async {
-  RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) async {
+  RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) async {
     ReceivePort receivePort = new ReceivePort();
     Map response = {
       EchoServerTypes.ISOLATE_SEND_PORT: receivePort.sendPort,
@@ -141,7 +140,7 @@
       client.writeEventsEnabled = false;
       client.listen((event) {
         switch (event) {
-          case RawSocketEvent.READ:
+          case RawSocketEvent.read:
             Expect.isTrue(bytesWritten == 0);
             Expect.isTrue(client.available() > 0);
             var buffer = client.read(client.available());
@@ -154,7 +153,7 @@
               client.writeEventsEnabled = true;
             }
             break;
-          case RawSocketEvent.WRITE:
+          case RawSocketEvent.write:
             Expect.isFalse(client.writeEventsEnabled);
             bytesWritten +=
                 client.write(data, bytesWritten, data.length - bytesWritten);
@@ -164,13 +163,13 @@
               // Close the socket for writing from the server since we're done
               // writing to this socket. The connection is closed completely
               // after the client closes the socket for reading from the server.
-              client.shutdown(SocketDirection.SEND);
+              client.shutdown(SocketDirection.send);
             }
             break;
-          case RawSocketEvent.READ_CLOSED:
+          case RawSocketEvent.readClosed:
             client.close();
             break;
-          case RawSocketEvent.CLOSED:
+          case RawSocketEvent.closed:
             Expect.isFalse(closedEventReceived);
             closedEventReceived = true;
             break;
@@ -221,12 +220,12 @@
 
   try {
     var socket = RawSynchronousSocket.connectSync(
-        LOOPBACK_IP_V4_STRING, serverInternetPort);
+        loopbackIPv4String, serverInternetPort);
     List<int> data = createTestData();
     socket.writeFromSync(data);
     List<int> result = socket.readSync(data.length);
     verifyTestData(result);
-    socket.shutdown(SocketDirection.SEND);
+    socket.shutdown(SocketDirection.send);
     socket.closeSync();
   } catch (e, stack) {
     print("Echo test failed in the client");
@@ -265,7 +264,7 @@
 
   try {
     var socket = RawSynchronousSocket.connectSync(
-        LOOPBACK_IP_V4_STRING, serverInternetPort);
+        loopbackIPv4String, serverInternetPort);
     int half_length = (data.length / 2).toInt();
 
     // Send the full data list to the server.
@@ -322,7 +321,7 @@
   sendPort.send(limits);
   try {
     var socket = RawSynchronousSocket.connectSync(
-        LOOPBACK_IP_V4_STRING, serverInternetPort);
+        loopbackIPv4String, serverInternetPort);
     List<int> data = createTestData();
 
     // Write a subset of data to the server.
@@ -377,11 +376,11 @@
 
   try {
     var socket = RawSynchronousSocket.connectSync(
-        LOOPBACK_IP_V4_STRING, serverInternetPort);
+        loopbackIPv4String, serverInternetPort);
 
     // Close from both directions. Shouldn't be able to read/write to the
     // socket.
-    socket.shutdown(SocketDirection.BOTH);
+    socket.shutdown(SocketDirection.both);
     Expect.throws(
         () => socket.writeFromSync(data), (e) => e is SocketException);
     Expect.throws(
@@ -391,8 +390,8 @@
     // Close the socket for reading then try and perform a read. This should
     // cause a SocketException.
     socket = RawSynchronousSocket.connectSync(
-        LOOPBACK_IP_V4_STRING, serverInternetPort);
-    socket.shutdown(SocketDirection.RECEIVE);
+        loopbackIPv4String, serverInternetPort);
+    socket.shutdown(SocketDirection.receive);
     // Throws exception when the socket is closed for RECEIVE.
     Expect.throws(
         () => socket.readSync(data.length), (e) => e is SocketException);
@@ -401,8 +400,8 @@
     // Close the socket for writing and try to do a write. This should cause an
     // OSError to be throw as the pipe is closed for writing.
     socket = RawSynchronousSocket.connectSync(
-        LOOPBACK_IP_V4_STRING, serverInternetPort);
-    socket.shutdown(SocketDirection.SEND);
+        loopbackIPv4String, serverInternetPort);
+    socket.shutdown(SocketDirection.send);
     Expect.throws(
         () => socket.writeFromSync(data), (e) => e is SocketException);
     socket.closeSync();
@@ -421,11 +420,11 @@
 
 Future testInvalidReadWriteOperations() {
   asyncStart();
-  RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((socket) {});
     List<int> data = createTestData();
     var socket =
-        RawSynchronousSocket.connectSync(LOOPBACK_IP_V4_STRING, server.port);
+        RawSynchronousSocket.connectSync(loopbackIPv4String, server.port);
 
     // Invalid writeFromSync invocations
     Expect.throwsRangeError(() => socket.writeFromSync(data, data.length + 1));
@@ -454,12 +453,12 @@
 
 void testClosedError() {
   asyncStart();
-  RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((socket) {
       socket.close();
     });
     var socket =
-        RawSynchronousSocket.connectSync(LOOPBACK_IP_V4_STRING, server.port);
+        RawSynchronousSocket.connectSync(loopbackIPv4String, server.port);
     server.close();
     socket.closeSync();
     Expect.throws(() => socket.remotePort, (e) => e is SocketException);
diff --git a/tests/standalone_2/io/regress_10026_test.dart b/tests/standalone_2/io/regress_10026_test.dart
index ff7c2e4..3a527a3 100644
--- a/tests/standalone_2/io/regress_10026_test.dart
+++ b/tests/standalone_2/io/regress_10026_test.dart
@@ -14,7 +14,7 @@
     asyncStart();
     var controller = new StreamController(sync: true);
     controller.stream
-        .transform(ZLIB.decoder)
+        .transform(zlib.decoder)
         .transform(utf8.decoder)
         .fold(new StringBuffer(), (buffer, s) {
       buffer.write(s);
diff --git a/tests/standalone_2/io/regress_21160_test.dart b/tests/standalone_2/io/regress_21160_test.dart
index 762e860..94d5f6c 100644
--- a/tests/standalone_2/io/regress_21160_test.dart
+++ b/tests/standalone_2/io/regress_21160_test.dart
@@ -54,11 +54,11 @@
       context: clientContext);
   List<int> body = <int>[];
   // Close our end, since we're not sending data.
-  socket.shutdown(SocketDirection.SEND);
+  socket.shutdown(SocketDirection.send);
 
   socket.listen((RawSocketEvent event) {
     switch (event) {
-      case RawSocketEvent.READ:
+      case RawSocketEvent.read:
         // NOTE: We have a very low prime number here. The internal
         // ring buffers will not have a size of 3. This means that
         // we'll reach the point where we would like to read 1/2 bytes
@@ -66,9 +66,9 @@
         // [This will ensure we trigger the bug.]
         body.addAll(socket.read(3));
         break;
-      case RawSocketEvent.WRITE:
+      case RawSocketEvent.write:
         break;
-      case RawSocketEvent.READ_CLOSED:
+      case RawSocketEvent.readClosed:
         break;
       default:
         throw "Unexpected event $event";
diff --git a/tests/standalone_2/io/regress_7191_script.dart b/tests/standalone_2/io/regress_7191_script.dart
index acdd143..4387bb8 100644
--- a/tests/standalone_2/io/regress_7191_script.dart
+++ b/tests/standalone_2/io/regress_7191_script.dart
@@ -20,7 +20,7 @@
         // If a SIGTERM is sent before the child-process's main is invoked,
         // there is a change that the SIGTERM is ignore on Mac OS X. Use
         // SIGKILL to get around the issue.
-        p.kill(ProcessSignal.SIGKILL);
+        p.kill(ProcessSignal.sigkill);
         p.exitCode.then((_) => exit(0));
       });
       // Close stdout. If handles are incorrectly inherited this will
diff --git a/tests/standalone_2/io/secure_client_raw_server_test.dart b/tests/standalone_2/io/secure_client_raw_server_test.dart
index 0f13169..6f3a6bf 100644
--- a/tests/standalone_2/io/secure_client_raw_server_test.dart
+++ b/tests/standalone_2/io/secure_client_raw_server_test.dart
@@ -36,12 +36,12 @@
       client.writeEventsEnabled = false;
       client.listen((event) {
         switch (event) {
-          case RawSocketEvent.READ:
+          case RawSocketEvent.read:
             Expect.isTrue(bytesWritten == 0);
             Expect.isTrue(client.available() > 0);
             readChunks.add(client.read());
             break;
-          case RawSocketEvent.WRITE:
+          case RawSocketEvent.write:
             Expect.isFalse(client.writeEventsEnabled);
             Expect.isNotNull(dataToWrite);
             bytesWritten += client.write(
@@ -50,10 +50,10 @@
               client.writeEventsEnabled = true;
             }
             if (bytesWritten == dataToWrite.length) {
-              client.shutdown(SocketDirection.SEND);
+              client.shutdown(SocketDirection.send);
             }
             break;
-          case RawSocketEvent.READ_CLOSED:
+          case RawSocketEvent.readClosed:
             dataToWrite = readChunks.fold(<int>[], (list, x) {
               list.addAll(x);
               return list;
diff --git a/tests/standalone_2/io/signal_test_script.dart b/tests/standalone_2/io/signal_test_script.dart
index 31e17de..772c2af 100644
--- a/tests/standalone_2/io/signal_test_script.dart
+++ b/tests/standalone_2/io/signal_test_script.dart
@@ -12,22 +12,22 @@
     var signal;
     switch (arg) {
       case 'SIGHUP':
-        signal = ProcessSignal.SIGHUP;
+        signal = ProcessSignal.sighup;
         break;
       case 'SIGINT':
-        signal = ProcessSignal.SIGINT;
+        signal = ProcessSignal.sigint;
         break;
       case 'SIGTERM':
-        signal = ProcessSignal.SIGTERM;
+        signal = ProcessSignal.sigterm;
         break;
       case 'SIGUSR1':
-        signal = ProcessSignal.SIGUSR1;
+        signal = ProcessSignal.sigusr1;
         break;
       case 'SIGUSR2':
-        signal = ProcessSignal.SIGUSR2;
+        signal = ProcessSignal.sigusr2;
         break;
       case 'SIGWINCH':
-        signal = ProcessSignal.SIGWINCH;
+        signal = ProcessSignal.sigwinch;
         break;
     }
     signal.watch().first.then((s) {
diff --git a/tests/standalone_2/io/signals_exception_test.dart b/tests/standalone_2/io/signals_exception_test.dart
index 5c3b926..28f552e 100644
--- a/tests/standalone_2/io/signals_exception_test.dart
+++ b/tests/standalone_2/io/signals_exception_test.dart
@@ -7,7 +7,7 @@
 import "package:expect/expect.dart";
 
 main() {
-  var ps = ProcessSignal.SIGINT.watch().listen((signal) {
+  var ps = ProcessSignal.sigint.watch().listen((signal) {
     Expect.fail("Unreachable");
   });
   throw "Death"; //# 01: runtime error
diff --git a/tests/standalone_2/io/signals_test.dart b/tests/standalone_2/io/signals_test.dart
index 7649f1f..79e0ddf 100644
--- a/tests/standalone_2/io/signals_test.dart
+++ b/tests/standalone_2/io/signals_test.dart
@@ -29,9 +29,9 @@
       int count = out.where((c) => c == '\n'.codeUnitAt(0)).length;
       for (int i = 0; i < count; i++) {
         if (v < usr1Send) {
-          process.kill(ProcessSignal.SIGUSR1);
+          process.kill(ProcessSignal.sigusr1);
         } else if (v < usr1Send + usr2Send) {
-          process.kill(ProcessSignal.SIGUSR2);
+          process.kill(ProcessSignal.sigusr2);
         }
         v++;
       }
@@ -99,7 +99,7 @@
 
 void testListenCancel() {
   for (int i = 0; i < 10; i++) {
-    ProcessSignal.SIGINT.watch().listen(null).cancel();
+    ProcessSignal.sigint.watch().listen(null).cancel();
   }
 }
 
@@ -116,19 +116,19 @@
   testSignals(1, 0, 0, 1, true);
   testSignals(0, 1, 1, 0, true);
 
-  testSignal(ProcessSignal.SIGHUP);
-  testSignal(ProcessSignal.SIGINT);
-  testSignal(ProcessSignal.SIGTERM);
-  testSignal(ProcessSignal.SIGUSR1);
-  testSignal(ProcessSignal.SIGUSR2);
-  testSignal(ProcessSignal.SIGWINCH);
+  testSignal(ProcessSignal.sighup);
+  testSignal(ProcessSignal.sigint);
+  testSignal(ProcessSignal.sigterm);
+  testSignal(ProcessSignal.sigusr1);
+  testSignal(ProcessSignal.sigusr2);
+  testSignal(ProcessSignal.sigwinch);
 
   testMultipleSignals([
-    ProcessSignal.SIGHUP,
-    ProcessSignal.SIGINT,
-    ProcessSignal.SIGTERM,
-    ProcessSignal.SIGUSR1,
-    ProcessSignal.SIGUSR2,
-    ProcessSignal.SIGWINCH
+    ProcessSignal.sighup,
+    ProcessSignal.sigint,
+    ProcessSignal.sigterm,
+    ProcessSignal.sigusr1,
+    ProcessSignal.sigusr2,
+    ProcessSignal.sigwinch,
   ]);
 }
diff --git a/tests/standalone_2/io/signals_test_script.dart b/tests/standalone_2/io/signals_test_script.dart
index 2cb9c5b..b5b5210 100644
--- a/tests/standalone_2/io/signals_test_script.dart
+++ b/tests/standalone_2/io/signals_test_script.dart
@@ -18,13 +18,13 @@
     print("ready");
   }
 
-  sub1 = ProcessSignal.SIGUSR1.watch().listen((signal) {
-    if (signal != ProcessSignal.SIGUSR1) exit(1);
+  sub1 = ProcessSignal.sigusr1.watch().listen((signal) {
+    if (signal != ProcessSignal.sigusr1) exit(1);
     usr1Count--;
     check();
   });
-  sub2 = ProcessSignal.SIGUSR2.watch().listen((signal) {
-    if (signal != ProcessSignal.SIGUSR2) exit(1);
+  sub2 = ProcessSignal.sigusr2.watch().listen((signal) {
+    if (signal != ProcessSignal.sigusr2) exit(1);
     usr2Count--;
     check();
   });
diff --git a/tests/standalone_2/io/skipping_dart2js_compilations_test.dart b/tests/standalone_2/io/skipping_dart2js_compilations_test.dart
index 66d97cb..96649d1 100644
--- a/tests/standalone_2/io/skipping_dart2js_compilations_test.dart
+++ b/tests/standalone_2/io/skipping_dart2js_compilations_test.dart
@@ -106,7 +106,7 @@
   void _writeToFile(File file, String content) {
     if (content != null) {
       var fd = new File(file.resolveSymbolicLinksSync())
-          .openSync(mode: FileMode.WRITE);
+          .openSync(mode: FileMode.write);
       fd.writeStringSync(content);
       fd.closeSync();
     }
diff --git a/tests/standalone_2/io/socket_bind_test.dart b/tests/standalone_2/io/socket_bind_test.dart
index 1345eba..6e6db8c 100644
--- a/tests/standalone_2/io/socket_bind_test.dart
+++ b/tests/standalone_2/io/socket_bind_test.dart
@@ -121,11 +121,11 @@
 
   await retry(() async {
     await testBindDifferentAddresses(
-        InternetAddress.ANY_IP_V6, InternetAddress.ANY_IP_V4, true, false);
+        InternetAddress.anyIPv6, InternetAddress.anyIPv4, true, false);
   });
   await retry(() async {
     await testBindDifferentAddresses(
-        InternetAddress.ANY_IP_V4, InternetAddress.ANY_IP_V6, false, true);
+        InternetAddress.anyIPv4, InternetAddress.anyIPv6, false, true);
   });
 
   for (var host in ['127.0.0.1', '::1']) {
diff --git a/tests/standalone_2/io/socket_connect_consume_close_test.dart b/tests/standalone_2/io/socket_connect_consume_close_test.dart
index 0eeb410..20a078e 100644
--- a/tests/standalone_2/io/socket_connect_consume_close_test.dart
+++ b/tests/standalone_2/io/socket_connect_consume_close_test.dart
@@ -17,7 +17,7 @@
   // Connect socket then immediate close the consumer without
   // listening on the stream.
   asyncStart();
-  ServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  ServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((_) {});
     Socket.connect("127.0.0.1", server.port).then((socket) {
       socket.close();
diff --git a/tests/standalone_2/io/socket_connect_consume_write_close_test.dart b/tests/standalone_2/io/socket_connect_consume_write_close_test.dart
index de2d958..8b021abd 100644
--- a/tests/standalone_2/io/socket_connect_consume_write_close_test.dart
+++ b/tests/standalone_2/io/socket_connect_consume_write_close_test.dart
@@ -17,7 +17,7 @@
   // Connect socket write some data immediate close the consumer
   // without listening on the stream.
   asyncStart();
-  ServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  ServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((_) {});
     Socket.connect("127.0.0.1", server.port).then((socket) {
       socket.add([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
diff --git a/tests/standalone_2/io/socket_connect_immediate_destory_test.dart b/tests/standalone_2/io/socket_connect_immediate_destory_test.dart
index 8a9a379..955f373 100644
--- a/tests/standalone_2/io/socket_connect_immediate_destory_test.dart
+++ b/tests/standalone_2/io/socket_connect_immediate_destory_test.dart
@@ -15,7 +15,7 @@
 
 void main() {
   asyncStart();
-  ServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  ServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((_) {});
     Socket.connect("127.0.0.1", server.port).then((socket) {
       socket.destroy();
diff --git a/tests/standalone_2/io/socket_connect_stream_close_test.dart b/tests/standalone_2/io/socket_connect_stream_close_test.dart
index b5899ae..6c9fcc2 100644
--- a/tests/standalone_2/io/socket_connect_stream_close_test.dart
+++ b/tests/standalone_2/io/socket_connect_stream_close_test.dart
@@ -17,7 +17,7 @@
   // Connect socket and listen on the stream. The server closes
   // immediately so only a done event is received.
   asyncStart();
-  ServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  ServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((client) {
       client.close();
       client.done.then((_) => client.destroy());
diff --git a/tests/standalone_2/io/socket_connect_stream_data_close_cancel_test.dart b/tests/standalone_2/io/socket_connect_stream_data_close_cancel_test.dart
index 7c2c833..fa921d7 100644
--- a/tests/standalone_2/io/socket_connect_stream_data_close_cancel_test.dart
+++ b/tests/standalone_2/io/socket_connect_stream_data_close_cancel_test.dart
@@ -16,7 +16,7 @@
 void testConnectStreamDataCloseCancel(bool useDestroy) {
   List<int> sendData = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
   asyncStart();
-  ServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  ServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((client) {
       client.add(sendData);
       if (useDestroy) {
diff --git a/tests/standalone_2/io/socket_connect_stream_data_close_test.dart b/tests/standalone_2/io/socket_connect_stream_data_close_test.dart
index fbfb7e7..ddce584 100644
--- a/tests/standalone_2/io/socket_connect_stream_data_close_test.dart
+++ b/tests/standalone_2/io/socket_connect_stream_data_close_test.dart
@@ -18,7 +18,7 @@
   // and then closes so both data and a done event is received.
   List<int> sendData = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
   asyncStart();
-  ServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  ServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((client) {
       client.add(sendData);
       if (useDestroy) {
diff --git a/tests/standalone_2/io/socket_cross_process_test.dart b/tests/standalone_2/io/socket_cross_process_test.dart
index 66798ad..bdf8e2d 100644
--- a/tests/standalone_2/io/socket_cross_process_test.dart
+++ b/tests/standalone_2/io/socket_cross_process_test.dart
@@ -7,11 +7,11 @@
 import 'dart:async';
 import 'dart:io';
 
-const int NUM_SERVERS = 10;
+const int serversCount = 10;
 
 void main(List<String> args) {
   if (args.isEmpty) {
-    for (int i = 0; i < NUM_SERVERS; ++i) {
+    for (int i = 0; i < serversCount; ++i) {
       makeServer().then((server) {
         runClientProcess(server.port).then((_) => server.close());
       });
@@ -25,7 +25,7 @@
 }
 
 Future makeServer() {
-  return ServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  return ServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((request) {
       request.pipe(request);
     });
@@ -55,7 +55,7 @@
 }
 
 runClient(int port) {
-  Socket.connect(InternetAddress.LOOPBACK_IP_V4, port).then((connection) {
+  Socket.connect(InternetAddress.loopbackIPv4, port).then((connection) {
     connection.listen((_) {}, onDone: () => print('SUCCESS'));
     connection.close();
   });
diff --git a/tests/standalone_2/io/socket_info_ipv4_test.dart b/tests/standalone_2/io/socket_info_ipv4_test.dart
index 9d869f0..bce4f78 100644
--- a/tests/standalone_2/io/socket_info_ipv4_test.dart
+++ b/tests/standalone_2/io/socket_info_ipv4_test.dart
@@ -17,7 +17,7 @@
         Expect.listEquals(socket.remoteAddress.rawAddress, [127, 0, 0, 1]);
         Expect.equals(clientSocket.remoteAddress.address, "127.0.0.1");
         Expect.equals(
-            clientSocket.remoteAddress.type, InternetAddressType.IP_V4);
+            clientSocket.remoteAddress.type, InternetAddressType.IPv4);
         Expect
             .listEquals(clientSocket.remoteAddress.rawAddress, [127, 0, 0, 1]);
         socket.destroy();
diff --git a/tests/standalone_2/io/socket_info_ipv6_test.dart b/tests/standalone_2/io/socket_info_ipv6_test.dart
index 016c582..11920fb 100644
--- a/tests/standalone_2/io/socket_info_ipv6_test.dart
+++ b/tests/standalone_2/io/socket_info_ipv6_test.dart
@@ -13,12 +13,12 @@
         Expect.equals(clientSocket.port, socket.remotePort);
         Expect.equals(clientSocket.remotePort, socket.port);
         Expect.equals(socket.remoteAddress.address, "::1");
-        Expect.equals(socket.remoteAddress.type, InternetAddressType.IP_V6);
+        Expect.equals(socket.remoteAddress.type, InternetAddressType.IPv6);
         Expect.listEquals(socket.remoteAddress.rawAddress,
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
         Expect.equals(clientSocket.remoteAddress.address, "::1");
         Expect.equals(
-            clientSocket.remoteAddress.type, InternetAddressType.IP_V6);
+            clientSocket.remoteAddress.type, InternetAddressType.IPv6);
         Expect.listEquals(clientSocket.remoteAddress.rawAddress,
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
         socket.destroy();
diff --git a/tests/standalone_2/io/socket_ipv6_test.dart b/tests/standalone_2/io/socket_ipv6_test.dart
index f7176a5..769506f 100644
--- a/tests/standalone_2/io/socket_ipv6_test.dart
+++ b/tests/standalone_2/io/socket_ipv6_test.dart
@@ -9,7 +9,7 @@
 import "package:expect/expect.dart";
 import "test_utils.dart" show retry;
 
-const ANY = InternetAddressType.ANY;
+const ANY = InternetAddressType.any;
 
 Future testIPv6toIPv6() {
   asyncStart();
@@ -90,7 +90,7 @@
   return InternetAddress.lookup("::0", type: ANY).then((list) {
     if (list.length < 0) throw "no address";
     for (var entry in list) {
-      if (entry.type != InternetAddressType.IP_V6) {
+      if (entry.type != InternetAddressType.IPv6) {
         throw "Wrong IP type";
       }
     }
@@ -103,7 +103,7 @@
   return InternetAddress.lookup("127.0.0.1").then((list) {
     if (list.length < 0) throw "no address";
     for (var entry in list) {
-      if (entry.type != InternetAddressType.IP_V4) {
+      if (entry.type != InternetAddressType.IPv4) {
         throw "Wrong IP type";
       }
     }
diff --git a/tests/standalone_2/io/socket_many_connections_test.dart b/tests/standalone_2/io/socket_many_connections_test.dart
index 70d4e66..9166168 100644
--- a/tests/standalone_2/io/socket_many_connections_test.dart
+++ b/tests/standalone_2/io/socket_many_connections_test.dart
@@ -12,27 +12,27 @@
 import "dart:isolate";
 part "testing_server.dart";
 
-const CONNECTIONS = 200;
+const connectionsCount = 200;
 
 class SocketManyConnectionsTest {
   SocketManyConnectionsTest.start()
       : _connections = 0,
-        _sockets = new List<Socket>(CONNECTIONS) {
+        _sockets = new List<Socket>(connectionsCount) {
     initialize();
   }
 
   void run() {
     void connectHandler() {
       _connections++;
-      if (_connections == CONNECTIONS) {
-        for (int i = 0; i < CONNECTIONS; i++) {
+      if (_connections == connectionsCount) {
+        for (int i = 0; i < connectionsCount; i++) {
           _sockets[i].destroy();
         }
         close();
       }
     }
 
-    for (int i = 0; i < CONNECTIONS; i++) {
+    for (int i = 0; i < connectionsCount; i++) {
       Socket.connect(TestingServer.HOST, _port).then((socket) {
         Expect.isNotNull(socket);
         _sockets[i] = socket;
diff --git a/tests/standalone_2/io/socket_simple_bind_test.dart b/tests/standalone_2/io/socket_simple_bind_test.dart
index fad63df..661815d 100644
--- a/tests/standalone_2/io/socket_simple_bind_test.dart
+++ b/tests/standalone_2/io/socket_simple_bind_test.dart
@@ -15,7 +15,7 @@
 
 void main() {
   asyncStart();
-  ServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((s) {
+  ServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((s) {
     Expect.isTrue(s.port > 0);
     s.close();
     asyncEnd();
diff --git a/tests/standalone_2/io/socket_source_address_test.dart b/tests/standalone_2/io/socket_source_address_test.dart
index f14d6ae..236733a 100644
--- a/tests/standalone_2/io/socket_source_address_test.dart
+++ b/tests/standalone_2/io/socket_source_address_test.dart
@@ -30,7 +30,7 @@
   var sourceAddress;
   asyncStart();
   var server =
-      await ServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, freePort);
+      await ServerSocket.bind(InternetAddress.loopbackIPv4, freePort);
   server.listen((_) {
     throw 'Unexpected connection from address $sourceAddress';
   }, onDone: () => asyncEnd());
@@ -52,7 +52,7 @@
             e.address == new InternetAddress('8.8.8.8'));
   }
   // Address family mismatch.
-  for (sourceAddress in ['::1', InternetAddress.LOOPBACK_IP_V6]) {
+  for (sourceAddress in ['::1', InternetAddress.loopbackIPv6]) {
     await throws(
         () => connectFunction('127.0.0.1', server.port,
             sourceAddress: sourceAddress),
@@ -64,16 +64,16 @@
 
 // IPv4 addresses to use as source address when connecting locally.
 var ipV4SourceAddresses = [
-  InternetAddress.LOOPBACK_IP_V4,
-  InternetAddress.ANY_IP_V4,
+  InternetAddress.loopbackIPv4,
+  InternetAddress.anyIPv4,
   '127.0.0.1',
   '0.0.0.0'
 ];
 
 // IPv6 addresses to use as source address when connecting locally.
 var ipV6SourceAddresses = [
-  InternetAddress.LOOPBACK_IP_V6,
-  InternetAddress.ANY_IP_V6,
+  InternetAddress.loopbackIPv6,
+  InternetAddress.anyIPv6,
   '::1',
   '::'
 ];
@@ -84,7 +84,7 @@
 
   var successCount = 0;
   if (!v6Only) successCount += ipV4SourceAddresses.length;
-  if (bindAddress.type == InternetAddressType.IP_V6) {
+  if (bindAddress.type == InternetAddressType.IPv6) {
     successCount += ipV6SourceAddresses.length;
   }
   var count = 0;
@@ -104,14 +104,14 @@
   // Connect with IPv4 source addesses.
   for (var sourceAddress in ipV4SourceAddresses) {
     if (!v6Only) {
-      var s = await connectFunction(InternetAddress.LOOPBACK_IP_V4, server.port,
+      var s = await connectFunction(InternetAddress.loopbackIPv4, server.port,
           sourceAddress: sourceAddress);
       closeDestroyFunction(s);
     } else {
       // Cannot use an IPv4 source address to connect to IPv6 if
       // v6Only is specified.
       await throws(
-          () => connectFunction(InternetAddress.LOOPBACK_IP_V6, server.port,
+          () => connectFunction(InternetAddress.loopbackIPv6, server.port,
               sourceAddress: sourceAddress),
           (e) => e is SocketException);
     }
@@ -119,14 +119,14 @@
 
   // Connect with IPv6 source addesses.
   for (var sourceAddress in ipV6SourceAddresses) {
-    if (bindAddress.type == InternetAddressType.IP_V6) {
-      var s = await connectFunction(InternetAddress.LOOPBACK_IP_V6, server.port,
+    if (bindAddress.type == InternetAddressType.IPv6) {
+      var s = await connectFunction(InternetAddress.loopbackIPv6, server.port,
           sourceAddress: sourceAddress);
       closeDestroyFunction(s);
     } else {
       // Cannot use an IPv6 source address to connect to IPv4.
       await throws(
-          () => connectFunction(InternetAddress.LOOPBACK_IP_V4, server.port,
+          () => connectFunction(InternetAddress.loopbackIPv4, server.port,
               sourceAddress: sourceAddress),
           (e) => e is SocketException);
     }
@@ -149,27 +149,27 @@
 
   await retry(() async {
     await testConnect(
-        InternetAddress.ANY_IP_V4, false, RawSocket.connect, (s) => s.close());
+        InternetAddress.anyIPv4, false, RawSocket.connect, (s) => s.close());
   });
   await retry(() async {
     await testConnect(
-        InternetAddress.ANY_IP_V4, false, Socket.connect, (s) => s.destroy());
+        InternetAddress.anyIPv4, false, Socket.connect, (s) => s.destroy());
   });
   await retry(() async {
     await testConnect(
-        InternetAddress.ANY_IP_V6, false, RawSocket.connect, (s) => s.close());
+        InternetAddress.anyIPv6, false, RawSocket.connect, (s) => s.close());
   });
   await retry(() async {
     await testConnect(
-        InternetAddress.ANY_IP_V6, false, Socket.connect, (s) => s.destroy());
+        InternetAddress.anyIPv6, false, Socket.connect, (s) => s.destroy());
   });
   await retry(() async {
     await testConnect(
-        InternetAddress.ANY_IP_V6, true, RawSocket.connect, (s) => s.close());
+        InternetAddress.anyIPv6, true, RawSocket.connect, (s) => s.close());
   });
   await retry(() async {
     await testConnect(
-        InternetAddress.ANY_IP_V6, true, Socket.connect, (s) => s.destroy());
+        InternetAddress.anyIPv6, true, Socket.connect, (s) => s.destroy());
   });
 
   asyncEnd();
diff --git a/tests/standalone_2/io/stdout_close_test.dart b/tests/standalone_2/io/stdout_close_test.dart
index 9a117b5..128c230 100644
--- a/tests/standalone_2/io/stdout_close_test.dart
+++ b/tests/standalone_2/io/stdout_close_test.dart
@@ -9,7 +9,7 @@
   var dir = Directory.systemTemp.createTempSync('dart_stdout_close');
   stdout.close().then((_) {
     var file = new File('${dir.path}/file');
-    var io = file.openSync(mode: FileMode.WRITE);
+    var io = file.openSync(mode: FileMode.write);
     print("to file");
     io.closeSync();
     var content = file.readAsStringSync();
diff --git a/tests/standalone_2/io/system_encoding_test.dart b/tests/standalone_2/io/system_encoding_test.dart
index 4306a68..40a6bf6 100644
--- a/tests/standalone_2/io/system_encoding_test.dart
+++ b/tests/standalone_2/io/system_encoding_test.dart
@@ -10,21 +10,20 @@
 // This only works reliabily for "ASCII" cross platform as that is the only
 // well known part of the default Windows code page.
 void testEncodeDecode(String str) {
-  Expect.equals(SYSTEM_ENCODING.decode(SYSTEM_ENCODING.encode(str)), str);
+  Expect.equals(systemEncoding.decode(systemEncoding.encode(str)), str);
 }
 
 // This only works reliabily for "ASCII" cross platform as that is the only
 // common set of bytes between UTF-8 Windows code pages that convert back
 // and forth.
 void testDecodeEncode(List<int> bytes) {
-  Expect.listEquals(
-      SYSTEM_ENCODING.encode(SYSTEM_ENCODING.decode(bytes)), bytes);
+  Expect.listEquals(systemEncoding.encode(systemEncoding.decode(bytes)), bytes);
 }
 
 void test(List<int> bytes) {
   var str = new String.fromCharCodes(bytes);
-  Expect.equals(SYSTEM_ENCODING.decode(bytes), str);
-  Expect.listEquals(SYSTEM_ENCODING.encode(str), bytes);
+  Expect.equals(systemEncoding.decode(bytes), str);
+  Expect.listEquals(systemEncoding.encode(str), bytes);
   testDecodeEncode(bytes);
   testEncodeDecode(str);
 }
@@ -39,11 +38,11 @@
     // On Windows the default Windows code page cannot encode these
     // Unicode characters and the ? character is used.
     Expect.listEquals(
-        SYSTEM_ENCODING.encode('\u1234\u5678\u9abc'), '???'.codeUnits);
+        systemEncoding.encode('\u1234\u5678\u9abc'), '???'.codeUnits);
   } else {
     // On all systems except for Windows UTF-8 is used as the system
     // encoding.
-    Expect.listEquals(SYSTEM_ENCODING.encode('\u1234\u5678\u9abc'),
+    Expect.listEquals(systemEncoding.encode('\u1234\u5678\u9abc'),
         utf8.encode('\u1234\u5678\u9abc'));
   }
 }
diff --git a/tests/standalone_2/io/test_utils.dart b/tests/standalone_2/io/test_utils.dart
index c9c2940..d92a372 100644
--- a/tests/standalone_2/io/test_utils.dart
+++ b/tests/standalone_2/io/test_utils.dart
@@ -7,7 +7,7 @@
 
 Future<int> freeIPv4AndIPv6Port() async {
   var socket =
-      await ServerSocket.bind(InternetAddress.ANY_IP_V6, 0, v6Only: false);
+      await ServerSocket.bind(InternetAddress.anyIPv6, 0, v6Only: false);
   int port = socket.port;
   await socket.close();
   return port;
diff --git a/tests/standalone_2/io/windows_file_system_async_links_test.dart b/tests/standalone_2/io/windows_file_system_async_links_test.dart
index 71634ae..4810d25 100644
--- a/tests/standalone_2/io/windows_file_system_async_links_test.dart
+++ b/tests/standalone_2/io/windows_file_system_async_links_test.dart
@@ -39,12 +39,12 @@
         .then((_) => FutureExpect.isTrue(FileSystemEntity.isDirectory(y)))
         .then((_) => FutureExpect.isTrue(FileSystemEntity.isDirectory(x)))
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.DIRECTORY, FileSystemEntity.type(y)))
+            FileSystemEntityType.directory, FileSystemEntity.type(y)))
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.DIRECTORY, FileSystemEntity.type(x)))
-        .then((_) => FutureExpect.equals(FileSystemEntityType.LINK,
+            FileSystemEntityType.directory, FileSystemEntity.type(x)))
+        .then((_) => FutureExpect.equals(FileSystemEntityType.link,
             FileSystemEntity.type(y, followLinks: false)))
-        .then((_) => FutureExpect.equals(FileSystemEntityType.DIRECTORY,
+        .then((_) => FutureExpect.equals(FileSystemEntityType.directory,
             FileSystemEntity.type(x, followLinks: false)))
         .then((_) => FutureExpect.equals(x, new Link(y).target()))
 
@@ -57,12 +57,12 @@
         .then((_) => FutureExpect.isFalse(FileSystemEntity.isDirectory(y)))
         .then((_) => FutureExpect.isFalse(FileSystemEntity.isDirectory(x)))
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.LINK, FileSystemEntity.type(y)))
+            FileSystemEntityType.link, FileSystemEntity.type(y)))
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.NOT_FOUND, FileSystemEntity.type(x)))
-        .then((_) => FutureExpect.equals(FileSystemEntityType.LINK,
+            FileSystemEntityType.notFound, FileSystemEntity.type(x)))
+        .then((_) => FutureExpect.equals(FileSystemEntityType.link,
             FileSystemEntity.type(y, followLinks: false)))
-        .then((_) => FutureExpect.equals(FileSystemEntityType.NOT_FOUND,
+        .then((_) => FutureExpect.equals(FileSystemEntityType.notFound,
             FileSystemEntity.type(x, followLinks: false)))
         .then((_) => FutureExpect.equals(x, new Link(y).target()))
 
@@ -70,25 +70,25 @@
         .then((_) => new Link(y).delete())
         .then((_) => FutureExpect.isFalse(FileSystemEntity.isLink(y)))
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.NOT_FOUND, FileSystemEntity.type(y)))
+            FileSystemEntityType.notFound, FileSystemEntity.type(y)))
         .then((_) => FutureExpect.throws(new Link(y).target()))
         .then((_) => new Directory(x).create())
         .then((_) => new Link(y).create(x))
-        .then((_) => FutureExpect.equals(FileSystemEntityType.LINK,
+        .then((_) => FutureExpect.equals(FileSystemEntityType.link,
             FileSystemEntity.type(y, followLinks: false)))
-        .then((_) => FutureExpect.equals(FileSystemEntityType.DIRECTORY,
+        .then((_) => FutureExpect.equals(FileSystemEntityType.directory,
             FileSystemEntity.type(x, followLinks: false)))
         .then((_) => FutureExpect.equals(x, new Link(y).target()))
 
         // Delete Junction pointing to an existing directory.
         .then((_) => new Directory(y).delete())
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.NOT_FOUND, FileSystemEntity.type(y)))
-        .then((_) => FutureExpect.equals(FileSystemEntityType.NOT_FOUND,
+            FileSystemEntityType.notFound, FileSystemEntity.type(y)))
+        .then((_) => FutureExpect.equals(FileSystemEntityType.notFound,
             FileSystemEntity.type(y, followLinks: false)))
         .then((_) => FutureExpect.equals(
-            FileSystemEntityType.DIRECTORY, FileSystemEntity.type(x)))
-        .then((_) => FutureExpect.equals(FileSystemEntityType.DIRECTORY,
+            FileSystemEntityType.directory, FileSystemEntity.type(x)))
+        .then((_) => FutureExpect.equals(FileSystemEntityType.directory,
             FileSystemEntity.type(x, followLinks: false)))
         .then((_) => FutureExpect.throws(new Link(y).target()))
         .then((_) => temp.delete(recursive: true));
diff --git a/tests/standalone_2/io/windows_file_system_links_test.dart b/tests/standalone_2/io/windows_file_system_links_test.dart
index 5268ccf..ccf38e5 100644
--- a/tests/standalone_2/io/windows_file_system_links_test.dart
+++ b/tests/standalone_2/io/windows_file_system_links_test.dart
@@ -20,11 +20,11 @@
     Expect.isFalse(FileSystemEntity.isLinkSync(x));
     Expect.isTrue(FileSystemEntity.isDirectorySync(y));
     Expect.isTrue(FileSystemEntity.isDirectorySync(x));
-    Expect.equals(FileSystemEntityType.DIRECTORY, FileSystemEntity.typeSync(y));
-    Expect.equals(FileSystemEntityType.DIRECTORY, FileSystemEntity.typeSync(x));
-    Expect.equals(FileSystemEntityType.LINK,
+    Expect.equals(FileSystemEntityType.directory, FileSystemEntity.typeSync(y));
+    Expect.equals(FileSystemEntityType.directory, FileSystemEntity.typeSync(x));
+    Expect.equals(FileSystemEntityType.link,
         FileSystemEntity.typeSync(y, followLinks: false));
-    Expect.equals(FileSystemEntityType.DIRECTORY,
+    Expect.equals(FileSystemEntityType.directory,
         FileSystemEntity.typeSync(x, followLinks: false));
     Expect.equals(x, new Link(y).targetSync());
 
@@ -36,37 +36,37 @@
     Expect.isFalse(FileSystemEntity.isLinkSync(x));
     Expect.isFalse(FileSystemEntity.isDirectorySync(y));
     Expect.isFalse(FileSystemEntity.isDirectorySync(x));
-    Expect.equals(FileSystemEntityType.LINK, FileSystemEntity.typeSync(y));
-    Expect.equals(FileSystemEntityType.NOT_FOUND, FileSystemEntity.typeSync(x));
-    Expect.equals(FileSystemEntityType.LINK,
+    Expect.equals(FileSystemEntityType.link, FileSystemEntity.typeSync(y));
+    Expect.equals(FileSystemEntityType.notFound, FileSystemEntity.typeSync(x));
+    Expect.equals(FileSystemEntityType.link,
         FileSystemEntity.typeSync(y, followLinks: false));
-    Expect.equals(FileSystemEntityType.NOT_FOUND,
+    Expect.equals(FileSystemEntityType.notFound,
         FileSystemEntity.typeSync(x, followLinks: false));
     Expect.equals(x, new Link(y).targetSync());
 
     // Delete Junction pointing to a missing directory.
     new Link(y).deleteSync();
     Expect.isFalse(FileSystemEntity.isLinkSync(y));
-    Expect.equals(FileSystemEntityType.NOT_FOUND, FileSystemEntity.typeSync(y));
+    Expect.equals(FileSystemEntityType.notFound, FileSystemEntity.typeSync(y));
     Expect.throws(() => new Link(y).targetSync());
 
     new Directory(x).createSync();
     new Link(y).create(x).then((_) {
-      Expect.equals(FileSystemEntityType.LINK,
+      Expect.equals(FileSystemEntityType.link,
           FileSystemEntity.typeSync(y, followLinks: false));
-      Expect.equals(FileSystemEntityType.DIRECTORY,
+      Expect.equals(FileSystemEntityType.directory,
           FileSystemEntity.typeSync(x, followLinks: false));
       Expect.equals(x, new Link(y).targetSync());
 
       // Delete Junction pointing to an existing directory.
       new Directory(y).deleteSync();
       Expect.equals(
-          FileSystemEntityType.NOT_FOUND, FileSystemEntity.typeSync(y));
-      Expect.equals(FileSystemEntityType.NOT_FOUND,
+          FileSystemEntityType.notFound, FileSystemEntity.typeSync(y));
+      Expect.equals(FileSystemEntityType.notFound,
           FileSystemEntity.typeSync(y, followLinks: false));
       Expect.equals(
-          FileSystemEntityType.DIRECTORY, FileSystemEntity.typeSync(x));
-      Expect.equals(FileSystemEntityType.DIRECTORY,
+          FileSystemEntityType.directory, FileSystemEntity.typeSync(x));
+      Expect.equals(FileSystemEntityType.directory,
           FileSystemEntity.typeSync(x, followLinks: false));
       Expect.throws(() => new Link(y).targetSync());
 
diff --git a/tests/standalone_2/io/zlib_test.dart b/tests/standalone_2/io/zlib_test.dart
index 614945e..55dc44d 100644
--- a/tests/standalone_2/io/zlib_test.dart
+++ b/tests/standalone_2/io/zlib_test.dart
@@ -146,11 +146,11 @@
 void testZLibInflate(List<int> data) {
   [true, false].forEach((gzip) {
     [
-      ZLibOption.STRATEGY_FILTERED,
-      ZLibOption.STRATEGY_HUFFMAN_ONLY,
-      ZLibOption.STRATEGY_RLE,
-      ZLibOption.STRATEGY_FIXED,
-      ZLibOption.STRATEGY_DEFAULT
+      ZLibOption.strategyFiltered,
+      ZLibOption.strategyHuffmanOnly,
+      ZLibOption.strategyRle,
+      ZLibOption.strategyFixed,
+      ZLibOption.strategyDefault,
     ].forEach((strategy) {
       [3, 6, 9].forEach((level) {
         asyncStart();
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index 6c02786..eb1b3b2 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -105,7 +105,6 @@
 io/dependency_graph_test: CompileTimeError
 io/directory_test: RuntimeError
 io/file_error_test: RuntimeError
-io/file_system_watcher_test: RuntimeError
 io/file_test: RuntimeError
 io/http_auth_digest_test: RuntimeError
 io/http_auth_test: RuntimeError
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index 24ec65b..dcf6699 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -66,6 +66,7 @@
 io/directory_list_sync_test: Timeout, Pass # Please triage.
 io/file_blocking_lock_test: Pass, Crash # Please triage.
 io/file_lock_test: Slow, Pass
+io/platform_resolved_executable_test/01: Pass, RuntimeError # Issue 32134
 io/platform_resolved_executable_test/05: Pass, RuntimeError # Issue 32134
 io/platform_test: RuntimeError # Please triage.
 io/test_extension_fail_test: RuntimeError # Please traige.
diff --git a/tools/VERSION b/tools/VERSION
index 0e39300..cf7a0c4 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 53
+PRERELEASE 54
 PRERELEASE_PATCH 0
diff --git a/tools/generate_buildfiles.py b/tools/generate_buildfiles.py
index 27f6b7e..6118957 100755
--- a/tools/generate_buildfiles.py
+++ b/tools/generate_buildfiles.py
@@ -48,7 +48,7 @@
     'python',
     os.path.join(DART_ROOT, 'tools', 'gn.py'),
     '-m', 'all',
-    '-a', 'arm,arm64',
+    '-a', 'arm,armsimdbc,arm64,armsimdbc64',
   ]
   if options.verbose:
     gn_command.append('-v')
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 0b5b805..4bc4061 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -135,6 +135,7 @@
       List<String> vmOptions,
       List<String> sharedOptions,
       List<String> dart2jsOptions,
+      List<String> ddcOptions,
       List<String> args) {
     return sharedOptions.toList()..addAll(args);
   }
@@ -350,7 +351,7 @@
   }
 
   List<String> computeCompilerArguments(
-      vmOptions, sharedOptions, dart2jsOptions, args) {
+      vmOptions, sharedOptions, dart2jsOptions, ddcOptions, 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);
@@ -446,6 +447,7 @@
       List<String> vmOptions,
       List<String> sharedOptions,
       List<String> dart2jsOptions,
+      List<String> ddcOptions,
       List<String> args) {
     return <String>[]
       ..addAll(sharedOptions)
@@ -493,8 +495,9 @@
       List<String> vmOptions,
       List<String> sharedOptions,
       List<String> dart2jsOptions,
+      List<String> ddcOptions,
       List<String> args) {
-    var result = sharedOptions.toList();
+    var result = sharedOptions.toList()..addAll(ddcOptions);
 
     // The file being compiled is the last argument.
     result.add(args.last);
@@ -580,8 +583,9 @@
       List<String> vmOptions,
       List<String> sharedOptions,
       List<String> dart2jsOptions,
+      List<String> ddcOptions,
       List<String> args) {
-    var result = sharedOptions.toList();
+    var result = sharedOptions.toList()..addAll(ddcOptions);
 
     // The file being compiled is the last argument.
     result.add(args.last);
@@ -863,7 +867,7 @@
   }
 
   List<String> computeCompilerArguments(
-      vmOptions, sharedOptions, dart2jsOptions, originalArguments) {
+      vmOptions, sharedOptions, dart2jsOptions, ddcOptions, originalArguments) {
     List<String> args = [];
     if (_isChecked) {
       args.add('--enable_asserts');
@@ -939,7 +943,7 @@
   }
 
   List<String> computeCompilerArguments(
-      vmOptions, sharedOptions, dart2jsOptions, originalArguments) {
+      vmOptions, sharedOptions, dart2jsOptions, ddcOptions, originalArguments) {
     var args = <String>[];
     if (_isChecked) {
       args.add('--enable_asserts');
@@ -1194,6 +1198,7 @@
       List<String> vmOptions,
       List<String> sharedOptions,
       List<String> dart2jsOptions,
+      List<String> ddcOptions,
       List<String> args) {
     var arguments = <String>[];
     for (var argument in args) {
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 479c94f..8260858 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -883,12 +883,13 @@
     var compilerConfiguration = configuration.compilerConfiguration;
     var sharedOptions = info.optionsFromFile['sharedOptions'] as List<String>;
     var dart2jsOptions = info.optionsFromFile['dart2jsOptions'] as List<String>;
+    var ddcOptions = info.optionsFromFile['ddcOptions'] as List<String>;
 
     var compileTimeArguments = <String>[];
     String tempDir;
     if (compilerConfiguration.hasCompiler) {
       compileTimeArguments = compilerConfiguration.computeCompilerArguments(
-          vmOptions, sharedOptions, dart2jsOptions, args);
+          vmOptions, sharedOptions, dart2jsOptions, ddcOptions, args);
       // Avoid doing this for analyzer.
       var path = info.filePath;
       if (vmOptionsVariant != 0) {
@@ -1460,6 +1461,7 @@
     List<String> dartOptions;
     List<String> sharedOptions;
     List<String> dart2jsOptions;
+    List<String> ddcOptions;
     Map<String, String> environment;
     String packageRoot;
     String packages;
@@ -1489,6 +1491,7 @@
     dartOptions = singleListOfOptions('DartOptions');
     sharedOptions = singleListOfOptions('SharedOptions');
     dart2jsOptions = singleListOfOptions('dart2jsOptions');
+    ddcOptions = singleListOfOptions('dartdevcOptions');
 
     matches = environmentRegExp.allMatches(contents);
     for (var match in matches) {
@@ -1587,6 +1590,7 @@
       "vmOptions": result,
       "sharedOptions": sharedOptions ?? <String>[],
       "dart2jsOptions": dart2jsOptions ?? <String>[],
+      "ddcOptions": ddcOptions ?? <String>[],
       "dartOptions": dartOptions,
       "environment": environment,
       "packageRoot": packageRoot,
diff --git a/utils/application_snapshot.gni b/utils/application_snapshot.gni
index d078775..096b944 100644
--- a/utils/application_snapshot.gni
+++ b/utils/application_snapshot.gni
@@ -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.
 
-import("../build/compiled_action.gni")
+import("../build/dart/dart_action.gni")
 
 _dart_root = get_path_info("..", "abspath")
 
@@ -18,9 +18,9 @@
 template("application_snapshot") {
   assert(defined(invoker.main_dart), "Must specify 'main_dart'")
   assert(defined(invoker.training_args), "Must specify 'training_args'")
-  vm_args = []
+  snapshot_vm_args = []
   if (defined(invoker.vm_args)) {
-    vm_args = invoker.vm_args
+    snapshot_vm_args = invoker.vm_args
   }
   main_dart = invoker.main_dart
   training_args = invoker.training_args
@@ -45,14 +45,13 @@
   if (defined(invoker.output)) {
     output = invoker.output
   }
-  compiled_action(target_name) {
-    tool = "$_dart_root/runtime/bin:dart"
+  dart_action(target_name) {
     deps = extra_deps
     depfile = "$output.d"
 
-    main_file = rebase_path(main_dart)
+    script = main_dart
 
-    inputs = extra_inputs + [ main_file ]
+    inputs = extra_inputs
 
     outputs = [
       output,
@@ -61,24 +60,22 @@
     abs_depfile = rebase_path(depfile)
     abs_output = rebase_path(output, root_build_dir)
 
-    args = [
+    vm_args = [
       "--deterministic",
       "--packages=$dot_packages",
       "--snapshot=$abs_output",
       "--snapshot-depfile=$abs_depfile",
-    ] + vm_args
+    ] + snapshot_vm_args
 
     if (dart_snapshot_kind == "script") {
-      args += [
+      vm_args += [
         "--snapshot-kind=script",
-        main_file,
       ]
       assert(training_args != "", "Ignoring unused argument")
+      args = []
     } else if (dart_snapshot_kind == "app-jit") {
-      args += [
-                "--snapshot-kind=app-jit",
-                main_file,
-              ] + training_args
+      vm_args += [ "--snapshot-kind=app-jit" ]
+      args = training_args
     } else {
       assert(false, "Bad dart_snapshot_kind: $dart_snapshot_kind")
     }
@@ -87,9 +84,9 @@
 
 template("aot_assembly") {
   assert(defined(invoker.main_dart), "Must specify 'main_dart'")
-  vm_args = []
+  aot_vm_args = []
   if (defined(invoker.vm_args)) {
-    vm_args = invoker.vm_args
+    aot_vm_args = invoker.vm_args
   }
   main_dart = invoker.main_dart
   name = target_name
@@ -113,14 +110,12 @@
   if (defined(invoker.output)) {
     output = invoker.output
   }
-  compiled_action(target_name) {
-    tool = "$_dart_root/runtime/bin:dart_bootstrap"
+  dart_bootstrap_action(target_name) {
     deps = extra_deps
     depfile = "$output.d"
 
-    main_file = rebase_path(main_dart)
-
-    inputs = extra_inputs + [ main_file ]
+    script = main_dart
+    inputs = extra_inputs
 
     outputs = [
       output,
@@ -129,12 +124,14 @@
     abs_depfile = rebase_path(depfile)
     abs_output = rebase_path(output, root_build_dir)
 
-    args = [
+    vm_args = [
       "--deterministic",
       "--packages=$dot_packages",
       "--snapshot-kind=app-aot",
       "--snapshot=$abs_output",
       "--snapshot-depfile=$abs_depfile",
-    ] + vm_args + [ main_file ]
+    ] + aot_vm_args
+
+    args = []
   }
 }
diff --git a/utils/compile_platform.gni b/utils/compile_platform.gni
index 89169eb..8c933ce 100644
--- a/utils/compile_platform.gni
+++ b/utils/compile_platform.gni
@@ -2,8 +2,8 @@
 # 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("../build/dart_host_sdk_toolchain.gni")
-import("../build/prebuilt_dart_sdk.gni")
+import("../build/dart/dart_host_sdk_toolchain.gni")
+import("../build/dart/prebuilt_dart_sdk.gni")
 
 _dart_root = get_path_info("..", "abspath")
 
diff --git a/utils/compiler/BUILD.gn b/utils/compiler/BUILD.gn
index a279e9e..6b8d88f 100644
--- a/utils/compiler/BUILD.gn
+++ b/utils/compiler/BUILD.gn
@@ -2,9 +2,6 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-import("../../build/compiled_action.gni")
-import("../../build/dart_host_sdk_toolchain.gni")
-import("../../build/prebuilt_dart_sdk.gni")
 import("../../utils/compile_platform.gni")
 import("../../utils/generate_patch_sdk.gni")
 import("../create_timestamp.gni")
@@ -25,21 +22,19 @@
   output = "$target_gen_dir/dartdoc_files.stamp"
 }
 
-compiled_action("dart2js_create_snapshot_entry") {
-  tool = "../../runtime/bin:dart"
+dart_action("dart2js_create_snapshot_entry") {
   deps = [
     ":dart2js_files_stamp",
     ":dartdoc_files_stamp",
     ":runtime_lib_files_stamp",
   ]
 
-  dot_packages = rebase_path("../../.packages")
-  create_snapshot_entry = rebase_path("create_snapshot_entry.dart")
   output_dir = rebase_path(target_gen_dir)
 
+  script = "create_snapshot_entry.dart"
+
   inputs = [
     "../../sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart",
-    create_snapshot_entry,
     "$target_gen_dir/dart2js_files.stamp",
     "../../tools/VERSION",
   ]
@@ -48,9 +43,9 @@
     "$target_gen_dir/dart2js.dart",
   ]
 
+  packages = "../../.packages"
+
   args = [
-    "--packages=$dot_packages",
-    create_snapshot_entry,
     "--output_dir=$output_dir",
     "--dart2js_main=pkg/compiler/lib/src/dart2js.dart",
   ]
diff --git a/utils/dartanalyzer/BUILD.gn b/utils/dartanalyzer/BUILD.gn
index 3a9f0ee..e41c7f6 100644
--- a/utils/dartanalyzer/BUILD.gn
+++ b/utils/dartanalyzer/BUILD.gn
@@ -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.
 
-import("../../build/dart_action.gni")
+import("../../build/dart/dart_action.gni")
 import("../application_snapshot.gni")
 
 group("dartanalyzer") {
@@ -59,7 +59,7 @@
   type = invoker.type
   assert(type == "spec" || type == "strong")
 
-  dart_action(target_name) {
+  prebuilt_dart_action(target_name) {
     script = "../../pkg/analyzer/tool/summary/build_sdk_summaries.dart"
     packages = "../../.packages"
     inputs = sdk_lib_files + analyzer_files
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index e9a6160..0350464 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -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.
 
-import("../../build/dart_action.gni")
-import("../../build/prebuilt_dart_sdk.gni")
+import("../../build/dart/dart_action.gni")
 import("../application_snapshot.gni")
 import("../create_timestamp.gni")
 
@@ -81,8 +80,7 @@
   abs_main = rebase_path(main)
   abs_output = rebase_path(out)
 
-  compiled_action(target_name) {
-    tool = "../../runtime/bin:dart"
+  dart_action(target_name) {
     deps = [
       "../compiler:compile_dart2js_platform",
       "../compiler:compile_dart2js_platform_strong",
@@ -97,13 +95,11 @@
       out,
     ]
 
-    dot_packages = rebase_path("../../.packages")
-    compiler = rebase_path("../../pkg/compiler/lib/src/dart2js.dart")
+    script = "../../pkg/compiler/lib/src/dart2js.dart"
+
+    packages = "../../.packages"
 
     args = [
-      "--packages=$dot_packages",
-      compiler,
-      "--packages=$dot_packages",
       "$abs_main",
       "-m",
       "-o$abs_output",
@@ -123,7 +119,7 @@
 
 # Apply dev_compiler's patch files to create the Dart version of the dartdevc
 # SDK.
-dart_action("dartdevc_patch_sdk") {
+prebuilt_dart_action("dartdevc_patch_sdk") {
   # TODO(rnystrom): Unfork DDC's patch_sdk.dart script with the
   # tools/patch_sdk.dart and then change this to use generate_patch_sdk().
   deps = [
@@ -163,7 +159,7 @@
 
 # Compiles the Dart core libraries and DDC runtime to an analyzer summary and
 # JS.
-dart_action("dartdevc_sdk") {
+prebuilt_dart_action("dartdevc_sdk") {
   deps = [
     ":dartdevc_files_stamp",
     ":dartdevc_patch_sdk",
@@ -243,9 +239,7 @@
 
 # Compiles the packages used by the tests to JS with dartdevc so that they are
 # available for loading by the tests.
-compiled_action("dartdevc_test_pkg") {
-  tool = "../../runtime/bin:dart"
-
+dart_action("dartdevc_test_pkg") {
   deps = [
     ":dartdevc_files_stamp",
     ":dartdevc_sdk",
@@ -293,8 +287,9 @@
     "$target_gen_dir/pkg/unittest.sum",
   ]
 
+  script = "../../pkg/dev_compiler/tool/build_pkgs.dart"
+
   args = [
-    rebase_path("../../pkg/dev_compiler/tool/build_pkgs.dart"),
     "--analyzer-sdk",
     rebase_path(sdk_summary),
     "--kernel-sdk",
@@ -305,9 +300,7 @@
 }
 
 # Compiles the DDC SDK's kernel summary and JS code.
-compiled_action("dartdevc_sdk_kernel_summary") {
-  tool = "../../runtime/bin:dart"
-
+dart_action("dartdevc_sdk_kernel_summary") {
   deps = [
     ":dartdevc_files_stamp",
   ]
@@ -328,8 +321,9 @@
     "$target_gen_dir/kernel/legacy/dart_sdk.js.map",
   ]
 
+  script = "../../pkg/dev_compiler/tool/kernel_sdk.dart"
+
   args = [
-    rebase_path("../../pkg/dev_compiler/tool/kernel_sdk.dart"),
     rebase_path(sdk_dill),
   ]
 }
diff --git a/utils/generate_entry_points_json.gni b/utils/generate_entry_points_json.gni
index 63684c9..04fc0fc 100644
--- a/utils/generate_entry_points_json.gni
+++ b/utils/generate_entry_points_json.gni
@@ -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.
 
-import("../build/compiled_action.gni")
-import("../build/dart_host_sdk_toolchain.gni")
+import("../build/dart/dart_action.gni")
 
 _dart_root = get_path_info("..", "abspath")
 
@@ -22,76 +21,22 @@
   if (defined(invoker.extra_args)) {
     extra_args += invoker.extra_args
   }
-  compiled_action(target_name) {
+  dart_bootstrap_action(target_name) {
     # Printing precompiler entry points is folded into precompilation, so dart_bootstrap is invoked
     # with correct arguments to generate app-aot snapshot.
-
-    input = invoker.input
+    script = invoker.input
     output = invoker.output
-
-    tool = "$_dart_root/runtime/bin:dart_bootstrap"
-    inputs = [
-      input,
-    ]
     outputs = [
       output,
     ]
-    args = [
+    vm_args = [
       "--print-precompiler-entry-points=" + rebase_path(output),
       "--snapshot=" + rebase_path("$target_gen_dir/dummy.snapshot"),
       "--snapshot-kind=app-aot",
       "--use-blobs",
       "--snapshot-kind=app-aot",
-    ] + extra_args + [
-      rebase_path(input),
-    ]
-  }
-}
-
-# Template to generate entry points JSON file using gen_snapshot tool.
-# List of entry points is generated as a by-product while doing precompilation.
-#
-# This template expects the following arguments:
-#  - input: Name of the input dart script for precompilation.
-#  - output: Name of the output entry points JSON file.
-#  - extra_args: Extra arguments to pass to dart_bootstrap (optional).
-#  - extra_inputs: Extra input dependencies (optional).
-#
-template("generate_entry_points_json_with_gen_snapshot") {
-  assert(defined(invoker.input), "Must define input dart script")
-  assert(defined(invoker.output), "Must define output json file")
-  extra_args = []
-  if (defined(invoker.extra_args)) {
-    extra_args += invoker.extra_args
-  }
-  extra_inputs = []
-  if (defined(invoker.extra_inputs)) {
-    extra_inputs += invoker.extra_inputs
-  }
-  compiled_action(target_name) {
-    # Printing precompiler entry points is folded into precompilation, so gen_snapshot is invoked
-    # with correct arguments to generate app-aot snapshot.
-
-    input = invoker.input
-    output = invoker.output
-
-    tool = "$_dart_root/runtime/bin:gen_snapshot"
-    inputs = [
-      input,
-    ] + extra_inputs
-    outputs = [
-      output,
-    ]
-    args = [
-      "--print-precompiler-entry-points=" + rebase_path(output),
-      "--snapshot-kind=app-aot-blobs",
-      "--vm_snapshot_data=" + rebase_path("$target_gen_dir/dummy.vm_data.snapshot"),
-      "--vm_snapshot_instructions=" + rebase_path("$target_gen_dir/dummy.vm_instr.snapshot"),
-      "--isolate_snapshot_data=" + rebase_path("$target_gen_dir/dummy.isolate_data.snapshot"),
-      "--isolate_snapshot_instructions=" + rebase_path("$target_gen_dir/dummy.isolate_instr.snapshot"),
-    ] + extra_args + [
-      rebase_path(input),
-    ]
+    ] + extra_args
+    args = []
   }
 }
 
diff --git a/utils/generate_patch_sdk.gni b/utils/generate_patch_sdk.gni
index 3130eec..f947fb9 100644
--- a/utils/generate_patch_sdk.gni
+++ b/utils/generate_patch_sdk.gni
@@ -2,9 +2,7 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-import("../build/dart_action.gni")
-import("../build/dart_host_sdk_toolchain.gni")
-import("../build/prebuilt_dart_sdk.gni")
+import("../build/dart/dart_action.gni")
 
 _dart_root = get_path_info("..", "abspath")
 
@@ -22,7 +20,7 @@
          "Need patched_sdk_dir in $target_name")
   assert(defined(invoker.mode), "Need mode in $target_name")
 
-  dart_action(target_name) {
+  prebuilt_dart_action(target_name) {
     forward_variables_from(invoker, [
       "deps",
     ])
diff --git a/utils/kernel-service/BUILD.gn b/utils/kernel-service/BUILD.gn
index ad61e49..75c2bf7 100644
--- a/utils/kernel-service/BUILD.gn
+++ b/utils/kernel-service/BUILD.gn
@@ -2,8 +2,8 @@
 # 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("../../build/dart_action.gni")
-import("../../build/dart_host_sdk_toolchain.gni")
+import("../../build/dart/dart_action.gni")
+import("../../build/dart/dart_host_sdk_toolchain.gni")
 import("../application_snapshot.gni")
 
 # TODO: Switch this to use kernel based app-jit snapshot
@@ -45,7 +45,7 @@
   output = "$root_out_dir/frontend_server.dart.snapshot"
 }
 
-dart_action("kernel_service_dill") {
+prebuilt_dart_action("kernel_service_dill") {
   deps = [
     "../../runtime/vm:vm_legacy_platform",
   ]